diff --git a/src/go/parser/interface.go b/src/go/parser/interface.go index dcc5fa6616..85486d2f4b 100644 --- a/src/go/parser/interface.go +++ b/src/go/parser/interface.go @@ -49,13 +49,14 @@ func readSource(filename string, src interface{}) ([]byte, error) { type Mode uint const ( - PackageClauseOnly Mode = 1 << iota // stop parsing after package clause - ImportsOnly // stop parsing after import declarations - ParseComments // parse comments and add them to AST - Trace // print a trace of parsed productions - DeclarationErrors // report declaration errors - SpuriousErrors // same as AllErrors, for backward-compatibility - AllErrors = SpuriousErrors // report all errors (not just the first 10 on different lines) + PackageClauseOnly Mode = 1 << iota // stop parsing after package clause + ImportsOnly // stop parsing after import declarations + ParseComments // parse comments and add them to AST + Trace // print a trace of parsed productions + DeclarationErrors // report declaration errors + SpuriousErrors // same as AllErrors, for backward-compatibility + SkipObjectResolution // don't resolve identifiers to objects - see ParseFile + AllErrors = SpuriousErrors // report all errors (not just the first 10 on different lines) ) // ParseFile parses the source code of a single Go source file and returns @@ -68,8 +69,12 @@ const ( // If src == nil, ParseFile parses the file specified by filename. // // The mode parameter controls the amount of source text parsed and other -// optional parser functionality. Position information is recorded in the -// file set fset, which must not be nil. +// optional parser functionality. If the SkipObjectResolution mode bit is set, +// the object resolution phase of parsing will be skipped, causing File.Scope, +// File.Unresolved, and all Ident.Obj fields to be nil. +// +// Position information is recorded in the file set fset, which must not be +// nil. // // If the source couldn't be read, the returned AST is nil and the error // indicates the specific failure. If the source was read but syntax diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index aff5838780..cddaef350e 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -2636,7 +2636,9 @@ func (p *parser) parseFile() *ast.File { if p.mode&DeclarationErrors != 0 { declErr = p.error } - resolveFile(f, p.file, declErr) + if p.mode&SkipObjectResolution == 0 { + resolveFile(f, p.file, declErr) + } return f }