From 45eadcf4b867d03798501d1cfc5dc41bd0dc01e9 Mon Sep 17 00:00:00 2001 From: Russ Cox <rsc@golang.org> Date: Thu, 3 Sep 2009 17:01:10 -0700 Subject: [PATCH] add ParseDeclList R=austin DELTA=34 (34 added, 0 deleted, 0 changed) OCL=34280 CL=34352 --- src/pkg/go/parser/interface.go | 20 ++++++++++++++++++++ src/pkg/go/parser/parser.go | 14 ++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/pkg/go/parser/interface.go b/src/pkg/go/parser/interface.go index 94835b8ece..d840e9a4a0 100644 --- a/src/pkg/go/parser/interface.go +++ b/src/pkg/go/parser/interface.go @@ -8,9 +8,11 @@ package parser import ( "bytes"; + "container/vector"; "fmt"; "go/ast"; "go/scanner"; + "go/token"; "io"; "os"; pathutil "path"; @@ -86,6 +88,24 @@ func ParseStmtList(filename string, src interface{}) ([]ast.Stmt, os.Error) { } +// ParseDeclList parses a list of Go declarations and returns the list +// of corresponding AST nodes. The filename and src arguments have the same +// interpretation as for ParseFile. If there is an error, the node +// list may be nil or contain partial ASTs. +// +func ParseDeclList(filename string, src interface{}) ([]ast.Decl, os.Error) { + data, err := readSource(filename, src); + if err != nil { + return nil, err; + } + + var p parser; + p.init(filename, data, 0); + list := p.parseDeclList(); // TODO 6g bug - function call order in expr lists + return list, p.GetError(scanner.Sorted); +} + + // ParseFile parses a Go source file and returns a File node. // // If src != nil, ParseFile parses the file source from src. src may diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go index f9d38a4b0c..de44ed8651 100644 --- a/src/pkg/go/parser/parser.go +++ b/src/pkg/go/parser/parser.go @@ -1889,6 +1889,20 @@ func (p *parser) parseDecl(getSemi bool) (decl ast.Decl, gotSemi bool) { } +func (p *parser) parseDeclList() []ast.Decl { + var list vector.Vector; + for p.tok != token.EOF { + decl, _ := p.parseDecl(true); // consume optional semicolon + list.Push(decl); + } + decls := make([]ast.Decl, list.Len()); + for i := 0; i < list.Len(); i++ { + decls[i] = list.At(i).(ast.Decl); + } + return decls; +} + + // ---------------------------------------------------------------------------- // Source files -- 2.30.9