mirror of https://github.com/golang/go.git
go/types, types2: don't register interface methods in Info.Types map
Methods declared in an interface have a signature and FuncType in the AST, but they do not express a syntactic function type expression. Treat them like ordinary function/method declarations and do not record them in the Info.Types map. This removes an inconsistency in the way function types are recorded. Follow-up on CL 640776. For #70908. Change-Id: I60848f209b40b008039c014fb8b7b279361487b9 Reviewed-on: https://go-review.googlesource.com/c/go/+/640596 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
parent
b25b5f3ff4
commit
4ac729283c
|
|
@ -137,17 +137,19 @@ func (check *Checker) interfaceType(ityp *Interface, iface *syntax.InterfaceType
|
|||
name := f.Name.Value
|
||||
if name == "_" {
|
||||
check.error(f.Name, BlankIfaceMethod, "methods must have a unique non-blank name")
|
||||
continue // ignore
|
||||
continue // ignore method
|
||||
}
|
||||
|
||||
typ := check.typ(f.Type)
|
||||
sig, _ := typ.(*Signature)
|
||||
if sig == nil {
|
||||
if isValid(typ) {
|
||||
check.errorf(f.Type, InvalidSyntaxTree, "%s is not a method signature", typ)
|
||||
}
|
||||
continue // ignore
|
||||
// Type-check method declaration.
|
||||
// Note: Don't call check.typ(f.Type) as that would record
|
||||
// the method incorrectly as a type expression in Info.Types.
|
||||
ftyp, _ := f.Type.(*syntax.FuncType)
|
||||
if ftyp == nil {
|
||||
check.errorf(f.Type, InvalidSyntaxTree, "%s is not a method signature", f.Type)
|
||||
continue // ignore method
|
||||
}
|
||||
sig := new(Signature)
|
||||
check.funcType(sig, nil, nil, ftyp)
|
||||
|
||||
// use named receiver type if available (for better error messages)
|
||||
var recvTyp Type = ityp
|
||||
|
|
|
|||
|
|
@ -176,17 +176,19 @@ func (check *Checker) interfaceType(ityp *Interface, iface *ast.InterfaceType, d
|
|||
name := f.Names[0]
|
||||
if name.Name == "_" {
|
||||
check.error(name, BlankIfaceMethod, "methods must have a unique non-blank name")
|
||||
continue // ignore
|
||||
continue // ignore method
|
||||
}
|
||||
|
||||
typ := check.typ(f.Type)
|
||||
sig, _ := typ.(*Signature)
|
||||
if sig == nil {
|
||||
if isValid(typ) {
|
||||
check.errorf(f.Type, InvalidSyntaxTree, "%s is not a method signature", typ)
|
||||
}
|
||||
continue // ignore
|
||||
// Type-check method declaration.
|
||||
// Note: Don't call check.typ(f.Type) as that would record
|
||||
// the method incorrectly as a type expression in Info.Types.
|
||||
ftyp, _ := f.Type.(*ast.FuncType)
|
||||
if ftyp == nil {
|
||||
check.errorf(f.Type, InvalidSyntaxTree, "%s is not a method signature", f.Type)
|
||||
continue // ignore method
|
||||
}
|
||||
sig := new(Signature)
|
||||
check.funcType(sig, nil, ftyp)
|
||||
|
||||
// The go/parser doesn't accept method type parameters but an ast.FuncType may have them.
|
||||
if sig.tparams != nil {
|
||||
|
|
|
|||
Loading…
Reference in New Issue