go/types: fix incorrect InitOrder in packages created from multiple calls to (*Checker).Files.
The InitOrder needs to be reset. + Test. This bug manifested itself in duplicate HTML in the godoc -analysis view, e.g. "f((x)" or "funcfunc f()" LGTM=gri R=gri CC=golang-codereviews https://golang.org/cl/107660044
This commit is contained in:
parent
661e836afb
commit
400db89b86
|
|
@ -479,14 +479,16 @@ func TestInitOrderInfo(t *testing.T) {
|
|||
func TestFiles(t *testing.T) {
|
||||
var sources = []string{
|
||||
"package p; type T struct{}; func (T) m1() {}",
|
||||
"package p; func (T) m2() {}; var _ interface{ m1(); m2() } = T{}",
|
||||
"package p; func (T) m3() {}; var _ interface{ m1(); m2(); m3() } = T{}",
|
||||
"package p; func (T) m2() {}; var x interface{ m1(); m2() } = T{}",
|
||||
"package p; func (T) m3() {}; var y interface{ m1(); m2(); m3() } = T{}",
|
||||
"package p",
|
||||
}
|
||||
|
||||
var conf Config
|
||||
fset := token.NewFileSet()
|
||||
pkg := NewPackage("p", "p")
|
||||
check := NewChecker(&conf, fset, pkg, nil)
|
||||
var info Info
|
||||
check := NewChecker(&conf, fset, pkg, &info)
|
||||
|
||||
for i, src := range sources {
|
||||
filename := fmt.Sprintf("sources%d", i)
|
||||
|
|
@ -498,6 +500,17 @@ func TestFiles(t *testing.T) {
|
|||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
// check InitOrder is [x y]
|
||||
var vars []string
|
||||
for _, init := range info.InitOrder {
|
||||
for _, v := range init.Lhs {
|
||||
vars = append(vars, v.Name())
|
||||
}
|
||||
}
|
||||
if got, want := fmt.Sprint(vars), "[x y]"; got != want {
|
||||
t.Errorf("InitOrder == %s, want %s", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSelection(t *testing.T) {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@ import (
|
|||
|
||||
// initOrder computes the Info.InitOrder for package variables.
|
||||
func (check *Checker) initOrder() {
|
||||
// An InitOrder may already have been computed if a package is
|
||||
// built from several calls to (*Checker).Files. Clear it.
|
||||
check.Info.InitOrder = check.Info.InitOrder[:0]
|
||||
|
||||
// compute the object dependency graph and
|
||||
// initialize a priority queue with the list
|
||||
// of graph nodes
|
||||
|
|
|
|||
Loading…
Reference in New Issue