func (p *Parser) Ast(fs *token.FileSet, path string, files []string, unsaved map[string]UnsavedDocument) (*ast.File, []*ast.File, error) { ret := make([]*ast.File, len(files)) var retf *ast.File var errors scanner.ErrorList for i, f := range files { f = CanonicalPath(f) var v *ast.File var err error if uns, ok := unsaved[f]; ok { v, err = parser.ParseFile(fs, f, uns.Data, parser.AllErrors) } else { v, err = p.fromCache(fs, f) } if v == nil { return nil, nil, err } ret[i] = v if path == f { retf = ret[i] if perr, ok := err.(scanner.ErrorList); ok { for _, e := range perr { errors.Add(e.Pos, e.Msg) } } } } errors.RemoveMultiples() errors.Sort() var err error if len(errors) != 0 { err = errors } return retf, ret, err }