]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: basic Defs/Uses test for aliases
authorRobert Griesemer <gri@golang.org>
Mon, 31 Oct 2016 21:38:12 +0000 (14:38 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 31 Oct 2016 21:57:45 +0000 (21:57 +0000)
Change-Id: I113ea712838511ee823375d9ea059089195414f5
Reviewed-on: https://go-review.googlesource.com/32449
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
src/go/types/api_test.go

index 92c6d75e704fbefd5fa69433672365746171da8d..7c4fe575c84e1e6f2b6843a1f74ec0d61c3cf309 100644 (file)
@@ -1295,3 +1295,86 @@ func f(x int) { y := x; print(y) }
                }
        }
 }
+
+func TestAliases(t *testing.T) {
+       testenv.MustHaveGoBuild(t)
+
+       const src = `
+package p
+
+import(
+       "go/build"
+       "go/types"
+)
+
+// Defs
+const Invalid => types.Invalid
+type Struct => types.Struct
+var Default => build.Default
+func Implements => types.Implements
+
+// Uses
+const _ = Invalid
+var _ types.Struct = Struct{} // types must be identical
+var _ build.Context = Default
+var _ = Implements(nil, nil)
+`
+
+       info := Info{
+               Defs: make(map[*ast.Ident]Object),
+               Uses: make(map[*ast.Ident]Object),
+       }
+       mustTypecheck(t, "Aliases", src, &info)
+
+       // verify Defs
+       defs := map[string]string{
+               "Invalid":    "types.Invalid",
+               "Struct":     "types.Struct",
+               "Default":    "build.Default",
+               "Implements": "types.Implements",
+       }
+
+       for ident, obj := range info.Defs {
+               if alias, ok := obj.(*Alias); ok {
+                       if want := defs[ident.Name]; want != "" {
+                               orig := alias.Orig()
+                               if got := orig.Pkg().Name() + "." + orig.Name(); got != want {
+                                       t.Errorf("%v: got %v, want %v", ident, got, want)
+                               }
+                               delete(defs, ident.Name) // mark as found
+                       } else {
+                               t.Errorf("unexpected alias def of %v", ident)
+                       }
+               }
+       }
+
+       if len(defs) != 0 {
+               t.Errorf("missing aliases: %v", defs)
+       }
+
+       // verify Uses
+       uses := map[string]string{
+               "Invalid":    "types.Invalid",
+               "Struct":     "types.Struct",
+               "Default":    "build.Default",
+               "Implements": "types.Implements",
+       }
+
+       for ident, obj := range info.Uses {
+               if alias, ok := obj.(*Alias); ok {
+                       if want := uses[ident.Name]; want != "" {
+                               orig := alias.Orig()
+                               if got := orig.Pkg().Name() + "." + orig.Name(); got != want {
+                                       t.Errorf("%v: got %v, want %v", ident, got, want)
+                               }
+                               delete(uses, ident.Name) // mark as found
+                       } else {
+                               t.Errorf("unexpected alias use of %v", ident)
+                       }
+               }
+       }
+
+       if len(uses) != 0 {
+               t.Errorf("missing aliases: %v", defs)
+       }
+}