// "func@5.32" // an anonymous function
//
func (f *Function) FullName() string {
+ return f.fullName(nil)
+}
+
+// Like FullName, but if from==f.Pkg, suppress package qualification.
+func (f *Function) fullName(from *Package) string {
// Anonymous?
if f.Enclosing != nil {
return f.Name_
// Synthetic?
if f.Pkg == nil {
+ var recvType types.Type
if recv != nil {
- // TODO(adonovan): print type package-qualified, if NamedType.
- return fmt.Sprintf("(%s).%s", recv.Type, f.Name_) // bridge method
+ recvType = recv.Type // bridge method
+ } else {
+ recvType = f.Params[0].Type() // interface method thunk
}
- return fmt.Sprintf("(%s).%s", f.Params[0].Type(), f.Name_) // interface method thunk
+ // TODO(adonovan): print type package-qualified, if NamedType.
+ return fmt.Sprintf("(%s).%s", recvType, f.Name_)
+ }
+
+ // "pkg." prefix for cross-package references only.
+ var pkgQual string
+ if from != f.Pkg {
+ pkgQual = f.Pkg.ImportPath + "."
}
// Declared method?
if isPointer(recv.Type) {
star = "*"
}
- return fmt.Sprintf("(%s%s.%s).%s", star, f.Pkg.ImportPath, deref(recv.Type), f.Name_)
+ return fmt.Sprintf("(%s%s%s).%s", star, pkgQual, deref(recv.Type), f.Name_)
}
// Package-level function.
- return fmt.Sprintf("%s.%s", f.Pkg.ImportPath, f.Name_)
+ return pkgQual + f.Name_
}
// DumpTo prints to w a human readable "disassembly" of the SSA code of
}
// relName returns the name of v relative to i.
-// In most cases, this is identical to v.Name(), but for cross-package
-// references to Functions (including methods) and Globals, the
-// package-qualified FullName is used instead.
+// In most cases, this is identical to v.Name(), but for references to
+// Functions (including methods) and Globals, the FullName is used
+// instead, explicitly package-qualified for cross-package references.
//
func relName(v Value, i Instruction) string {
switch v := v.(type) {
}
return v.FullName()
case *Function:
- if v.Pkg == nil || v.Pkg == i.Block().Func.Pkg {
- return v.Name()
- }
- return v.FullName()
+ return v.fullName(i.Block().Func.Pkg)
}
return v.Name()
}
Pos token.Pos // location of the definition
Enclosing *Function // enclosing function if anon; nil if global
- Pkg *Package // enclosing package; nil for some synthetic methods
+ Pkg *Package // enclosing package for Go source functions; otherwise nil
Prog *Program // enclosing program
Params []*Parameter
FreeVars []*Capture // free variables whose values must be supplied by closure