go.tools/go/types: add mode to typecheck pkg-level decls only
This is useful for situations where one only cares about exports, for instance (as in the goapi checker). R=adonovan, bradfitz CC=golang-dev https://golang.org/cl/12292043
This commit is contained in:
parent
61a33ecd43
commit
4ceda807d5
|
|
@ -48,6 +48,10 @@ func Check(path string, fset *token.FileSet, files []*ast.File) (*Package, error
|
||||||
// A Config specifies the configuration for type checking.
|
// A Config specifies the configuration for type checking.
|
||||||
// The zero value for Config is a ready-to-use default configuration.
|
// The zero value for Config is a ready-to-use default configuration.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
// If IgnoreFuncBodies is set, function bodies are not
|
||||||
|
// type-checked.
|
||||||
|
IgnoreFuncBodies bool
|
||||||
|
|
||||||
// If Error != nil, it is called with each error found
|
// If Error != nil, it is called with each error found
|
||||||
// during type checking. The error strings of errors with
|
// during type checking. The error strings of errors with
|
||||||
// detailed position information are formatted as follows:
|
// detailed position information are formatted as follows:
|
||||||
|
|
@ -99,7 +103,9 @@ type Info struct {
|
||||||
// If Objects != nil, it records the identifier and corresponding object
|
// If Objects != nil, it records the identifier and corresponding object
|
||||||
// for each identifier that is type-checked (including package names,
|
// for each identifier that is type-checked (including package names,
|
||||||
// dots "." of dot-imports, and blank "_" identifiers). For identifiers
|
// dots "." of dot-imports, and blank "_" identifiers). For identifiers
|
||||||
// that were not declared due to an error, the corresponding object is nil.
|
// that are not declared (due to an error, or because they are symbolic
|
||||||
|
// as the t in t := x.(type) of a type switch header), the corresponding
|
||||||
|
// object is nil.
|
||||||
// BUG(gri) Label identifiers in break, continue, or goto statements
|
// BUG(gri) Label identifiers in break, continue, or goto statements
|
||||||
// are not recorded.
|
// are not recorded.
|
||||||
Objects map[*ast.Ident]Object
|
Objects map[*ast.Ident]Object
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ type funcInfo struct {
|
||||||
// later appends a function with non-empty body to check.funcList.
|
// later appends a function with non-empty body to check.funcList.
|
||||||
func (check *checker) later(f *Func, sig *Signature, body *ast.BlockStmt) {
|
func (check *checker) later(f *Func, sig *Signature, body *ast.BlockStmt) {
|
||||||
// functions implemented elsewhere (say in assembly) have no body
|
// functions implemented elsewhere (say in assembly) have no body
|
||||||
if body != nil {
|
if !check.conf.IgnoreFuncBodies && body != nil {
|
||||||
check.funcList = append(check.funcList, funcInfo{f, sig, body})
|
check.funcList = append(check.funcList, funcInfo{f, sig, body})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,9 +42,15 @@ func TestSelf(t *testing.T) {
|
||||||
return // skip benchmark in short mode
|
return // skip benchmark in short mode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
benchmark(fset, files, false)
|
||||||
|
benchmark(fset, files, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmark(fset *token.FileSet, files []*ast.File, full bool) {
|
||||||
b := testing.Benchmark(func(b *testing.B) {
|
b := testing.Benchmark(func(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
Check("go/types", fset, files)
|
conf := Config{IgnoreFuncBodies: !full}
|
||||||
|
conf.Check("go/types", fset, files, nil)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue