mirror of
https://github.com/golang/go
synced 2024-11-26 04:07:59 -07:00
Revert "go/types: make Interface.Complete a no-op"
This reverts commit fda8ee8b07
.
Reason for revert: Interface.Complete is still necessary for safe concurrency.
For #47726
Change-Id: I8b924ca5f4af8c7d7e2b5a27bb03a5a5ed9b1d22
Reviewed-on: https://go-review.googlesource.com/c/go/+/342710
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
a8d39f151d
commit
91a935ea0f
@ -174,6 +174,10 @@ 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))
|
||||
|
@ -104,12 +104,22 @@ 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 just returns its receiver. There's no other effect.
|
||||
// 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.
|
||||
//
|
||||
// Deprecated: Interfaces are now completed on demand; this function is only
|
||||
// here for backward-compatibility. It does not have to be called explicitly
|
||||
// anymore.
|
||||
// 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.
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -405,9 +405,8 @@ 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 {
|
||||
|
Loading…
Reference in New Issue
Block a user