internal,importers: find deeply nested prefixed class references
Before this CL, with code such as
import "Java/some/pkg/Class"
...
Class.StaticFunc().DoSomething()
the reverse generator wouldn't find the the Java/some/pkg.Class
reference.
Change-Id: I1def4b54589fd1c123767ff59438c647cbced0cd
Reviewed-on: https://go-review.googlesource.com/35331
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/bind/testdata/java.go.golden b/bind/testdata/java.go.golden
index 5e5baa2..48eefad 100644
--- a/bind/testdata/java.go.golden
+++ b/bind/testdata/java.go.golden
@@ -56,7 +56,6 @@
// Cast panics if the argument is not a proxy or if the underlying object does
// not extend or implement java.lang.Long.
Cast func(v interface{}) Java.Java_lang_Long
-
)
// File is generated by gobind. Do not edit.
diff --git a/internal/importers/ast.go b/internal/importers/ast.go
index 3c798c1..9c8ac2a 100644
--- a/internal/importers/ast.go
+++ b/internal/importers/ast.go
@@ -227,7 +227,6 @@
if v.insideStruct && len(n.Names) == 1 && !n.Names[0].IsExported() {
return nil
}
- return v
case *ast.SelectorExpr:
v.Names[n.Sel.Name] = struct{}{}
if ref, ok := v.parseRef(n); ok {
@@ -235,8 +234,8 @@
v.refMap[ref] = struct{}{}
v.Refs = append(v.Refs, ref)
}
+ return nil
}
- return nil
case *ast.FuncDecl:
if n.Recv != nil { // Methods
v.Names[n.Name.Name] = struct{}{}
diff --git a/internal/importers/ast_test.go b/internal/importers/ast_test.go
index a26b3c3..b879216 100644
--- a/internal/importers/ast_test.go
+++ b/internal/importers/ast_test.go
@@ -11,6 +11,7 @@
file := `package ast_test
import "Prefix/some/pkg/Name"
+import "Prefix/some/pkg/Name2"
const c = Name.Constant
@@ -18,6 +19,10 @@
Name.Type
hidden Name.Type2
}
+
+func f() {
+ Name2.Func().Func().Func()
+}
`
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "ast_test.go", file, parser.AllErrors)
@@ -28,12 +33,18 @@
if err != nil {
t.Fatal(err)
}
- if len(refs.Refs) != 2 {
- t.Fatalf("expected 2 references; got %d", len(refs.Refs))
+ exps := []PkgRef{
+ {Pkg: "some/pkg/Name", Name: "Constant"},
+ {Pkg: "some/pkg/Name", Name: "Type"},
+ {Pkg: "some/pkg/Name2", Name: "Func"},
}
- got := refs.Refs[0]
- if exp := (PkgRef{"some/pkg/Name", "Constant"}); exp != got {
- t.Errorf("expected ref %v; got %v", exp, got)
+ if len(refs.Refs) != len(exps) {
+ t.Fatalf("expected %d references; got %d", len(exps), len(refs.Refs))
+ }
+ for i, exp := range exps {
+ if got := refs.Refs[i]; exp != got {
+ t.Errorf("expected ref %v; got %v", exp, got)
+ }
}
if _, exists := refs.Names["Constant"]; !exists {
t.Errorf("expected \"Constant\" in the names set")
@@ -45,9 +56,9 @@
exp := Struct{
Name: "T",
Pkg: "ast_test",
- Refs: []PkgRef{{"some/pkg/Name", "Type"}},
+ Refs: []PkgRef{{Pkg: "some/pkg/Name", Name: "Type"}},
}
if !reflect.DeepEqual(exp, s) {
- t.Errorf("expected struct %v; got %v", exp, got)
+ t.Errorf("expected struct %v; got %v", exp, s)
}
}