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:
Alan Donovan 2014-07-10 06:30:01 -04:00
parent 661e836afb
commit 400db89b86
2 changed files with 20 additions and 3 deletions

View File

@ -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) {

View File

@ -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