mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
go.tools/go.types: check for redeclarations across package files
Fixes golang/go#5506. R=adonovan CC=golang-dev https://golang.org/cl/9600044
This commit is contained in:
parent
ad2dafcf8f
commit
08ee2985d7
@ -73,7 +73,8 @@ func (check *checker) resolve(importer Importer) (methods []*ast.FuncDecl) {
|
|||||||
check.register(file.Name, pkg)
|
check.register(file.Name, pkg)
|
||||||
|
|
||||||
// insert top-level file objects in package scope
|
// insert top-level file objects in package scope
|
||||||
// (the parser took care of declaration errors)
|
// (the parser took care of declaration errors in a single file,
|
||||||
|
// but not across multiple files - hence we need to check again)
|
||||||
for _, decl := range file.Decls {
|
for _, decl := range file.Decls {
|
||||||
switch d := decl.(type) {
|
switch d := decl.(type) {
|
||||||
case *ast.BadDecl:
|
case *ast.BadDecl:
|
||||||
@ -91,13 +92,13 @@ func (check *checker) resolve(importer Importer) (methods []*ast.FuncDecl) {
|
|||||||
if name.Name == "_" {
|
if name.Name == "_" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
pkg.scope.Insert(check.lookup(name))
|
check.declareObj(pkg.scope, nil, check.lookup(name), token.NoPos)
|
||||||
}
|
}
|
||||||
case *ast.TypeSpec:
|
case *ast.TypeSpec:
|
||||||
if s.Name.Name == "_" {
|
if s.Name.Name == "_" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
pkg.scope.Insert(check.lookup(s.Name))
|
check.declareObj(pkg.scope, nil, check.lookup(s.Name), token.NoPos)
|
||||||
default:
|
default:
|
||||||
check.invalidAST(s.Pos(), "unknown ast.Spec node %T", s)
|
check.invalidAST(s.Pos(), "unknown ast.Spec node %T", s)
|
||||||
}
|
}
|
||||||
@ -111,7 +112,7 @@ func (check *checker) resolve(importer Importer) (methods []*ast.FuncDecl) {
|
|||||||
if d.Name.Name == "_" || d.Name.Name == "init" {
|
if d.Name.Name == "_" || d.Name.Name == "init" {
|
||||||
continue // blank (_) and init functions are inaccessible
|
continue // blank (_) and init functions are inaccessible
|
||||||
}
|
}
|
||||||
pkg.scope.Insert(check.lookup(d.Name))
|
check.declareObj(pkg.scope, nil, check.lookup(d.Name), token.NoPos)
|
||||||
default:
|
default:
|
||||||
check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d)
|
check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d)
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ var sources = []string{
|
|||||||
package p
|
package p
|
||||||
import . "go/parser"
|
import . "go/parser"
|
||||||
import "sync"
|
import "sync"
|
||||||
func g() Mode { return ImportsOnly }
|
func h() Mode { return ImportsOnly }
|
||||||
var _, x int = 1, 2
|
var _, x int = 1, 2
|
||||||
func init() {}
|
func init() {}
|
||||||
type T struct{ sync.Mutex; a, b, c int}
|
type T struct{ sync.Mutex; a, b, c int}
|
||||||
|
7
go/types/testdata/decls0.src
vendored
7
go/types/testdata/decls0.src
vendored
@ -69,7 +69,12 @@ type (
|
|||||||
Pi pi /* ERROR "not a type" */
|
Pi pi /* ERROR "not a type" */
|
||||||
|
|
||||||
a /* ERROR "illegal cycle" */ a
|
a /* ERROR "illegal cycle" */ a
|
||||||
a /* ERROR "redeclared" */ int
|
// TODO(gri) For now we get double redeclaration errors if the redeclaration
|
||||||
|
// happens at the package level in the same file. This is because one check
|
||||||
|
// is done in the parser and the other one in the type checker. We cannot
|
||||||
|
// easily avoid this w/o losing the check or functionality. This will be
|
||||||
|
// fixed once all resolution is done in the type checker.
|
||||||
|
a /* ERROR "redeclared" */ /* ERROR "redeclared" */ int
|
||||||
|
|
||||||
// where the cycle error appears depends on the
|
// where the cycle error appears depends on the
|
||||||
// order in which declarations are processed
|
// order in which declarations are processed
|
||||||
|
1
go/types/testdata/decls1.src
vendored
1
go/types/testdata/decls1.src
vendored
@ -123,7 +123,6 @@ func (*T) m1() {}
|
|||||||
func (x T) m2() {}
|
func (x T) m2() {}
|
||||||
func (x *T) m3() {}
|
func (x *T) m3() {}
|
||||||
|
|
||||||
|
|
||||||
// Initialization functions
|
// Initialization functions
|
||||||
func init() {}
|
func init() {}
|
||||||
func /* ERROR "no arguments and no return values" */ init(int) {}
|
func /* ERROR "no arguments and no return values" */ init(int) {}
|
||||||
|
6
go/types/testdata/decls2a.src
vendored
6
go/types/testdata/decls2a.src
vendored
@ -64,3 +64,9 @@ func (int /* ERROR "non-local type" */ ) m() {}
|
|||||||
func ([ /* ERROR "expected" */ ]int) m() {}
|
func ([ /* ERROR "expected" */ ]int) m() {}
|
||||||
func (time /* ERROR "expected" */ .Time) m() {}
|
func (time /* ERROR "expected" */ .Time) m() {}
|
||||||
func (x interface /* ERROR "expected" */ {}) m() {}
|
func (x interface /* ERROR "expected" */ {}) m() {}
|
||||||
|
|
||||||
|
// Double declarations across package files
|
||||||
|
const c_double = 0
|
||||||
|
type t_double int
|
||||||
|
var v_double int
|
||||||
|
func f_double() {}
|
||||||
|
8
go/types/testdata/decls2b.src
vendored
8
go/types/testdata/decls2b.src
vendored
@ -25,4 +25,10 @@ func (t *T6) m1() int {
|
|||||||
func f() {
|
func f() {
|
||||||
var t *T6
|
var t *T6
|
||||||
t.m1()
|
t.m1()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Double declarations across package files
|
||||||
|
const c_double /* ERROR "redeclared" */ = 0
|
||||||
|
type t_double /* ERROR "redeclared" */ int
|
||||||
|
var v_double /* ERROR "redeclared" */ int
|
||||||
|
func f_double /* ERROR "redeclared" */ () {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user