From fda8ee8b077dd8a5819cac7c52c3af1499a0674e Mon Sep 17 00:00:00 2001 From: Robert Findley Date: Sun, 15 Aug 2021 21:50:42 -0400 Subject: [PATCH] go/types: make Interface.Complete a no-op This is a partial port of CL 340255 to go/types. Of course we can't delete Interface.Complete, but make it a no-op. Completing interfaces is no longer necessary. Change-Id: Ida3c84cc94713f14a646c7682f5d4ae5339a0faa Reviewed-on: https://go-review.googlesource.com/c/go/+/342489 Trust: Robert Findley Run-TryBot: Robert Findley TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- src/go/internal/gcimporter/iimport.go | 4 ---- src/go/types/interface.go | 18 ++++-------------- src/go/types/issues_test.go | 3 ++- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/go/internal/gcimporter/iimport.go b/src/go/internal/gcimporter/iimport.go index dbc9b3a83e..5f05e8c0ad 100644 --- a/src/go/internal/gcimporter/iimport.go +++ b/src/go/internal/gcimporter/iimport.go @@ -174,10 +174,6 @@ func iImportData(fset *token.FileSet, imports map[string]*types.Package, dataRea p.doDecl(localpkg, name) } - for _, typ := range p.interfaceList { - typ.Complete() - } - // record all referenced packages as imports list := append(([]*types.Package)(nil), pkgList[1:]...) sort.Sort(byPath(list)) diff --git a/src/go/types/interface.go b/src/go/types/interface.go index 510c123e97..f4d560cb3e 100644 --- a/src/go/types/interface.go +++ b/src/go/types/interface.go @@ -104,22 +104,12 @@ func (t *Interface) IsComparable() bool { return t.typeSet().IsComparable() } // IsConstraint reports whether interface t is not just a method set. func (t *Interface) IsConstraint() bool { return !t.typeSet().IsMethodSet() } -// Complete computes the interface's type set. It must be called by users of -// NewInterfaceType and NewInterface after the interface's embedded types are -// fully defined and before using the interface type in any way other than to -// form other types. The interface must not contain duplicate methods or a -// panic occurs. Complete returns the receiver. +// Complete just returns its receiver. There's no other effect. // -// Deprecated: Type sets are now computed lazily, on demand; this function -// is only here for backward-compatibility. It does not have to -// be called explicitly anymore. +// Deprecated: Interfaces are now completed on demand; this function is only +// here for backward-compatibility. It does not have to be called explicitly +// anymore. func (t *Interface) Complete() *Interface { - // Some tests are still depending on the state change - // (string representation of an Interface not containing an - // /* incomplete */ marker) caused by the explicit Complete - // call, so we compute the type set eagerly here. - t.complete = true - t.typeSet() return t } diff --git a/src/go/types/issues_test.go b/src/go/types/issues_test.go index 51995af30a..618db13fb9 100644 --- a/src/go/types/issues_test.go +++ b/src/go/types/issues_test.go @@ -405,8 +405,9 @@ func TestIssue28282(t *testing.T) { // create type interface { error } et := Universe.Lookup("error").Type() it := NewInterfaceType(nil, []Type{et}) - it.Complete() // verify that after completing the interface, the embedded method remains unchanged + // (interfaces are "completed" lazily now, so the completion happens implicitly when + // accessing Method(0)) want := et.Underlying().(*Interface).Method(0) got := it.Method(0) if got != want { -- 2.50.0