package main
import (
- "errors"
- "exp/types"
"flag"
"fmt"
"go/ast"
"go/parser"
"go/scanner"
"go/token"
+ "go/types"
"io/ioutil"
"os"
"path/filepath"
return file
}
-func parseStdin(fset *token.FileSet) (files map[string]*ast.File) {
- files = make(map[string]*ast.File)
+func parseStdin(fset *token.FileSet) (files []*ast.File) {
src, err := ioutil.ReadAll(os.Stdin)
if err != nil {
report(err)
}
const filename = "<standard input>"
if file := parse(fset, filename, src); file != nil {
- files[filename] = file
+ files = []*ast.File{file}
}
return
}
-func parseFiles(fset *token.FileSet, filenames []string) (files map[string]*ast.File) {
- files = make(map[string]*ast.File)
+func parseFiles(fset *token.FileSet, filenames []string) (files []*ast.File) {
for _, filename := range filenames {
src, err := ioutil.ReadFile(filename)
if err != nil {
continue
}
if file := parse(fset, filename, src); file != nil {
- if files[filename] != nil {
- report(errors.New(fmt.Sprintf("%q: duplicate file", filename)))
- continue
- }
- files[filename] = file
+ files = append(files, file)
}
}
return
processPackage(fset, parseFiles(fset, filenames[0:i]))
}
-func processPackage(fset *token.FileSet, files map[string]*ast.File) {
- // make a package (resolve all identifiers)
- pkg, err := ast.NewPackage(fset, files, types.GcImport, types.Universe)
- if err != nil {
- report(err)
- return
- }
- _, err = types.Check(fset, pkg)
+func processPackage(fset *token.FileSet, files []*ast.File) {
+ _, err := types.Check(fset, files)
if err != nil {
report(err)
}