]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile/internal/types2: move Signature type decl into signature...
authorRobert Griesemer <gri@golang.org>
Wed, 30 Jun 2021 20:00:14 +0000 (13:00 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 1 Jul 2021 16:44:00 +0000 (16:44 +0000)
Change-Id: I68c9da6a87cdc15bde8bffa8cb86fb8705eb1f8e
Reviewed-on: https://go-review.googlesource.com/c/go/+/332091
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/signature.go
src/cmd/compile/internal/types2/type.go

index 01158187ba71476cceecfb59356c0741983fb0ab..ab9a1c487ebe926efae6026f6a04a095608b629f 100644 (file)
@@ -9,6 +9,77 @@ import (
        "fmt"
 )
 
+// ----------------------------------------------------------------------------
+// API
+
+// A Signature represents a (non-builtin) function or method type.
+// The receiver is ignored when comparing signatures for identity.
+type Signature struct {
+       // We need to keep the scope in Signature (rather than passing it around
+       // and store it in the Func Object) because when type-checking a function
+       // literal we call the general type checker which returns a general Type.
+       // We then unpack the *Signature and use the scope for the literal body.
+       rparams  []*TypeName // receiver type parameters from left to right; or nil
+       tparams  []*TypeName // type parameters from left to right; or nil
+       scope    *Scope      // function scope, present for package-local signatures
+       recv     *Var        // nil if not a method
+       params   *Tuple      // (incoming) parameters from left to right; or nil
+       results  *Tuple      // (outgoing) results from left to right; or nil
+       variadic bool        // true if the last parameter's type is of the form ...T (or string, for append built-in only)
+}
+
+// NewSignature returns a new function type for the given receiver, parameters,
+// and results, either of which may be nil. If variadic is set, the function
+// is variadic, it must have at least one parameter, and the last parameter
+// must be of unnamed slice type.
+func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature {
+       if variadic {
+               n := params.Len()
+               if n == 0 {
+                       panic("types2.NewSignature: variadic function must have at least one parameter")
+               }
+               if _, ok := params.At(n - 1).typ.(*Slice); !ok {
+                       panic("types2.NewSignature: variadic parameter must be of unnamed slice type")
+               }
+       }
+       return &Signature{recv: recv, params: params, results: results, variadic: variadic}
+}
+
+// Recv returns the receiver of signature s (if a method), or nil if a
+// function. It is ignored when comparing signatures for identity.
+//
+// For an abstract method, Recv returns the enclosing interface either
+// as a *Named or an *Interface. Due to embedding, an interface may
+// contain methods whose receiver type is a different interface.
+func (s *Signature) Recv() *Var { return s.recv }
+
+// TParams returns the type parameters of signature s, or nil.
+func (s *Signature) TParams() []*TypeName { return s.tparams }
+
+// RParams returns the receiver type params of signature s, or nil.
+func (s *Signature) RParams() []*TypeName { return s.rparams }
+
+// SetTParams sets the type parameters of signature s.
+func (s *Signature) SetTParams(tparams []*TypeName) { s.tparams = tparams }
+
+// SetRParams sets the receiver type params of signature s.
+func (s *Signature) SetRParams(rparams []*TypeName) { s.rparams = rparams }
+
+// Params returns the parameters of signature s, or nil.
+func (s *Signature) Params() *Tuple { return s.params }
+
+// Results returns the results of signature s, or nil.
+func (s *Signature) Results() *Tuple { return s.results }
+
+// Variadic reports whether the signature s is variadic.
+func (s *Signature) Variadic() bool { return s.variadic }
+
+func (s *Signature) Underlying() Type { return s }
+func (s *Signature) String() string   { return TypeString(s, nil) }
+
+// ----------------------------------------------------------------------------
+// Implementation
+
 // Disabled by default, but enabled when running tests (via types_test.go).
 var acceptMethodTypeParams bool
 
index aff97f9a9830e09436387e361895d473fcc448e9..3a9511de48bbf2dce4112d1c0cd6ed21beef62ed 100644 (file)
@@ -163,68 +163,6 @@ func (t *Tuple) Len() int {
 // At returns the i'th variable of tuple t.
 func (t *Tuple) At(i int) *Var { return t.vars[i] }
 
-// A Signature represents a (non-builtin) function or method type.
-// The receiver is ignored when comparing signatures for identity.
-type Signature struct {
-       // We need to keep the scope in Signature (rather than passing it around
-       // and store it in the Func Object) because when type-checking a function
-       // literal we call the general type checker which returns a general Type.
-       // We then unpack the *Signature and use the scope for the literal body.
-       rparams  []*TypeName // receiver type parameters from left to right; or nil
-       tparams  []*TypeName // type parameters from left to right; or nil
-       scope    *Scope      // function scope, present for package-local signatures
-       recv     *Var        // nil if not a method
-       params   *Tuple      // (incoming) parameters from left to right; or nil
-       results  *Tuple      // (outgoing) results from left to right; or nil
-       variadic bool        // true if the last parameter's type is of the form ...T (or string, for append built-in only)
-}
-
-// NewSignature returns a new function type for the given receiver, parameters,
-// and results, either of which may be nil. If variadic is set, the function
-// is variadic, it must have at least one parameter, and the last parameter
-// must be of unnamed slice type.
-func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature {
-       if variadic {
-               n := params.Len()
-               if n == 0 {
-                       panic("types2.NewSignature: variadic function must have at least one parameter")
-               }
-               if _, ok := params.At(n - 1).typ.(*Slice); !ok {
-                       panic("types2.NewSignature: variadic parameter must be of unnamed slice type")
-               }
-       }
-       return &Signature{recv: recv, params: params, results: results, variadic: variadic}
-}
-
-// Recv returns the receiver of signature s (if a method), or nil if a
-// function. It is ignored when comparing signatures for identity.
-//
-// For an abstract method, Recv returns the enclosing interface either
-// as a *Named or an *Interface. Due to embedding, an interface may
-// contain methods whose receiver type is a different interface.
-func (s *Signature) Recv() *Var { return s.recv }
-
-// TParams returns the type parameters of signature s, or nil.
-func (s *Signature) TParams() []*TypeName { return s.tparams }
-
-// RParams returns the receiver type params of signature s, or nil.
-func (s *Signature) RParams() []*TypeName { return s.rparams }
-
-// SetTParams sets the type parameters of signature s.
-func (s *Signature) SetTParams(tparams []*TypeName) { s.tparams = tparams }
-
-// SetRParams sets the receiver type params of signature s.
-func (s *Signature) SetRParams(rparams []*TypeName) { s.rparams = rparams }
-
-// Params returns the parameters of signature s, or nil.
-func (s *Signature) Params() *Tuple { return s.params }
-
-// Results returns the results of signature s, or nil.
-func (s *Signature) Results() *Tuple { return s.results }
-
-// Variadic reports whether the signature s is variadic.
-func (s *Signature) Variadic() bool { return s.variadic }
-
 // An Interface represents an interface type.
 type Interface struct {
        obj       *TypeName     // corresponding declared object; or nil (for better error messages)
@@ -706,7 +644,6 @@ func (t *Array) Underlying() Type     { return t }
 func (t *Slice) Underlying() Type     { return t }
 func (t *Pointer) Underlying() Type   { return t }
 func (t *Tuple) Underlying() Type     { return t }
-func (t *Signature) Underlying() Type { return t }
 func (t *Interface) Underlying() Type { return t }
 func (t *Map) Underlying() Type       { return t }
 func (t *Chan) Underlying() Type      { return t }
@@ -721,7 +658,6 @@ func (t *Array) String() string     { return TypeString(t, nil) }
 func (t *Slice) String() string     { return TypeString(t, nil) }
 func (t *Pointer) String() string   { return TypeString(t, nil) }
 func (t *Tuple) String() string     { return TypeString(t, nil) }
-func (t *Signature) String() string { return TypeString(t, nil) }
 func (t *Interface) String() string { return TypeString(t, nil) }
 func (t *Map) String() string       { return TypeString(t, nil) }
 func (t *Chan) String() string      { return TypeString(t, nil) }