From ff72a95f0517241ef5e2f67ed273cceb8383fc8c Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 7 Jan 2014 14:46:10 -0800 Subject: [PATCH] go.tools/go/gcimporter: correct package for imported methods R=adonovan CC=golang-codereviews https://golang.org/cl/48630044 --- go/gcimporter/gcimporter.go | 5 ++++- go/gcimporter/gcimporter_test.go | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/go/gcimporter/gcimporter.go b/go/gcimporter/gcimporter.go index ac52ee76..fcff9fa1 100644 --- a/go/gcimporter/gcimporter.go +++ b/go/gcimporter/gcimporter.go @@ -875,9 +875,12 @@ func (p *parser) parseMethodDecl() { base := deref(recv.Type()).(*types.Named) // parse method name, signature, and possibly inlined body - pkg, name := p.parseName(true) + _, name := p.parseName(true) sig := p.parseFunc(recv) + // methods always belong to the same package as the base type object + pkg := base.Obj().Pkg() + // add method to type unless type was imported before // and method exists already // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small. diff --git a/go/gcimporter/gcimporter_test.go b/go/gcimporter/gcimporter_test.go index 094c5f58..37b439a8 100644 --- a/go/gcimporter/gcimporter_test.go +++ b/go/gcimporter/gcimporter_test.go @@ -192,3 +192,25 @@ func TestIssue5815(t *testing.T) { } } } + +// Smoke test to ensure that imported methods get the correct package. +func TestCorrectMethodPackage(t *testing.T) { + // This package does not handle gccgo export data. + if runtime.Compiler == "gccgo" { + return + } + + imports := make(map[string]*types.Package) + _, err := Import(imports, "net/http") + if err != nil { + t.Fatal(err) + } + + mutex := imports["sync"].Scope().Lookup("Mutex").(*types.TypeName).Type() + mset := types.NewPointer(mutex).MethodSet() // methods of *sync.Mutex + sel := mset.Lookup(nil, "Lock") + lock := sel.Obj().(*types.Func) + if got, want := lock.Pkg().Path(), "sync"; got != want { + t.Errorf("got package path %q; want %q", got, want) + } +}