]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types: add Pkg and SetPkg methods to Type
authorMatthew Dempsky <mdempsky@google.com>
Tue, 17 Apr 2018 21:54:42 +0000 (14:54 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 24 Apr 2018 00:48:29 +0000 (00:48 +0000)
The go/types API exposes what package objects were declared in, which
includes struct fields, interface methods, and function parameters.

The compiler implicitly tracks these for non-exported identifiers
(through the Sym's associated Pkg), but exported identifiers always
use localpkg. To simplify identifying this, add an explicit package
field to struct, interface, and function types.

Change-Id: I6adc5dc653e78f058714259845fb3077066eec82
Reviewed-on: https://go-review.googlesource.com/107622
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/types/sizeof_test.go
src/cmd/compile/internal/types/type.go

index 04e2f01e92c4fe6c27b40fc5c8830a7e9817bddb..2633ef2ddd447d3a35291ae61b42965e0f5ae0d4 100644 (file)
@@ -26,9 +26,9 @@ func TestSizeof(t *testing.T) {
                {Type{}, 52, 88},
                {Map{}, 20, 40},
                {Forward{}, 20, 32},
-               {Func{}, 28, 48},
-               {Struct{}, 12, 24},
-               {Interface{}, 4, 8},
+               {Func{}, 32, 56},
+               {Struct{}, 16, 32},
+               {Interface{}, 8, 16},
                {Chan{}, 8, 16},
                {Array{}, 12, 16},
                {DDDField{}, 4, 8},
index a8adb7736676a756b69d5f71a819ee60c9b7d6e0..8d5f9fedf9d727a138aee4b16fee1a7632fa4694 100644 (file)
@@ -132,7 +132,7 @@ type Type struct {
        // TFORW: *Forward
        // TFUNC: *Func
        // TSTRUCT: *Struct
-       // TINTER: *Inter
+       // TINTER: *Interface
        // TDDDFIELD: DDDField
        // TFUNCARGS: FuncArgs
        // TCHANARGS: ChanArgs
@@ -183,6 +183,40 @@ func (t *Type) SetNoalg(b bool)      { t.flags.set(typeNoalg, b) }
 func (t *Type) SetDeferwidth(b bool) { t.flags.set(typeDeferwidth, b) }
 func (t *Type) SetRecur(b bool)      { t.flags.set(typeRecur, b) }
 
+// Pkg returns the package that t appeared in.
+//
+// Pkg is only defined for function, struct, and interface types
+// (i.e., types with named elements). This information isn't used by
+// cmd/compile itself, but we need to track it because it's exposed by
+// the go/types API.
+func (t *Type) Pkg() *Pkg {
+       switch t.Etype {
+       case TFUNC:
+               return t.Extra.(*Func).pkg
+       case TSTRUCT:
+               return t.Extra.(*Struct).pkg
+       case TINTER:
+               return t.Extra.(*Interface).pkg
+       default:
+               Fatalf("Pkg: unexpected kind: %v", t)
+               return nil
+       }
+}
+
+// SetPkg sets the package that t appeared in.
+func (t *Type) SetPkg(pkg *Pkg) {
+       switch t.Etype {
+       case TFUNC:
+               t.Extra.(*Func).pkg = pkg
+       case TSTRUCT:
+               t.Extra.(*Struct).pkg = pkg
+       case TINTER:
+               t.Extra.(*Interface).pkg = pkg
+       default:
+               Fatalf("Pkg: unexpected kind: %v", t)
+       }
+}
+
 // Map contains Type fields specific to maps.
 type Map struct {
        Key *Type // Key type
@@ -218,6 +252,7 @@ type Func struct {
        Params   *Type // function params
 
        Nname *Node
+       pkg   *Pkg
 
        // Argwid is the total width of the function receiver, params, and results.
        // It gets calculated via a temporary TFUNCARGS type.
@@ -236,6 +271,7 @@ func (t *Type) FuncType() *Func {
 // StructType contains Type fields specific to struct types.
 type Struct struct {
        fields Fields
+       pkg    *Pkg
 
        // Maps have three associated internal structs (see struct MapType).
        // Map links such structs back to their map type.
@@ -263,6 +299,7 @@ func (t *Type) StructType() *Struct {
 // Interface contains Type fields specific to interface types.
 type Interface struct {
        Fields Fields
+       pkg    *Pkg
 }
 
 // Ptr contains Type fields specific to pointer types.