go.tools/go/loader: add Config.ParserMode configuration parameter.
Existing tools use the default value of zero; their behaviour is unchanged.
(*Config).ParseFile is used only from tests.
LGTM=crawshaw, rsc, gri
R=crawshaw, gri, rsc
CC=golang-codereviews
https://golang.org/cl/79290044
diff --git a/go/loader/loader.go b/go/loader/loader.go
index 970fd6d..04b54cb 100644
--- a/go/loader/loader.go
+++ b/go/loader/loader.go
@@ -145,6 +145,10 @@
// method of Config.
Fset *token.FileSet
+ // ParserMode specifies the mode to be used by the parser when
+ // loading source packages.
+ ParserMode parser.Mode
+
// TypeChecker contains options relating to the type checker.
//
// The supplied IgnoreFuncBodies is not used; the effective
@@ -255,8 +259,8 @@
// ParseFile is a convenience function that invokes the parser using
// the Config's FileSet, which is initialized if nil.
//
-func (conf *Config) ParseFile(filename string, src interface{}, mode parser.Mode) (*ast.File, error) {
- return parser.ParseFile(conf.fset(), filename, src, mode)
+func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) {
+ return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode)
}
// FromArgsUsage is a partial usage message that applications calling
@@ -340,7 +344,7 @@
// conf.CreatePkgs.
//
func (conf *Config) CreateFromFilenames(path string, filenames ...string) error {
- files, err := parseFiles(conf.fset(), conf.build(), nil, ".", filenames...)
+ files, err := parseFiles(conf.fset(), conf.build(), nil, ".", filenames, conf.ParserMode)
if err != nil {
return err
}
@@ -638,7 +642,7 @@
default:
panic(which)
}
- return parseFiles(conf.fset(), &ctxt, conf.DisplayPath, bp.Dir, filenames...)
+ return parseFiles(conf.fset(), &ctxt, conf.DisplayPath, bp.Dir, filenames, conf.ParserMode)
}
// doImport imports the package denoted by path.
diff --git a/go/loader/util.go b/go/loader/util.go
index a772f02..df19b7d 100644
--- a/go/loader/util.go
+++ b/go/loader/util.go
@@ -21,7 +21,7 @@
// I/O is done via ctxt, which may specify a virtual file system.
// displayPath is used to transform the filenames attached to the ASTs.
//
-func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files ...string) ([]*ast.File, error) {
+func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files []string, mode parser.Mode) ([]*ast.File, error) {
if displayPath == nil {
displayPath = func(path string) string { return path }
}
@@ -56,7 +56,7 @@
errors[i] = err
return
}
- parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, 0)
+ parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, mode)
}(i, file)
}
wg.Wait()