Documentation ¶
Index ¶
- Constants
- func CommentsDo(src io.Reader, handler func(line, col uint, text string))
- func Crawl(root Node, f func(Node) bool)deprecated
- func ErrorMap(src io.Reader) (errmap map[uint][]Error)
- func Fdump(w io.Writer, n Node) (err error)
- func Fprint(w io.Writer, x Node, form Form) (n int, err error)
- func Inspect(root Node, f func(Node) bool)
- func String(n Node) string
- func Walk(root Node, v Visitor)
- type ArrayType
- type AssertExpr
- type AssignStmt
- type BadExpr
- type BasicLit
- type BlockStmt
- type BranchStmt
- type CallExpr
- type CallStmt
- type CaseClause
- type ChanDir
- type ChanType
- type CommClause
- type Comment
- type CommentKind
- type CompositeLit
- type ConstDecl
- type Decl
- type DeclStmt
- type DotsType
- type EmptyStmt
- type Error
- type ErrorHandler
- type Expr
- type ExprStmt
- type Field
- type File
- type ForStmt
- type Form
- type FuncDecl
- type FuncLit
- type FuncType
- type Group
- type IfStmt
- type ImportDecl
- type IndexExpr
- type InterfaceType
- type KeyValueExpr
- type LabeledStmt
- type ListExpr
- type LitKind
- type MapType
- type Mode
- type Name
- type Node
- type Operation
- type Operator
- type ParenExpr
- type Pos
- type PosBase
- type Pragma
- type PragmaHandler
- type RangeClause
- type ReturnStmt
- type SelectStmt
- type SelectorExpr
- type SendStmt
- type SimpleStmt
- type SliceExpr
- type SliceType
- type Stmt
- type StructType
- type SwitchStmt
- type TypeDecl
- type TypeSwitchGuard
- type VarDecl
- type Visitor
Constants ¶
const ( // for BranchStmt Break = _Break Continue = _Continue Fallthrough = _Fallthrough Goto = _Goto // for CallStmt Go = _Go Defer = _Defer )
const PosMax = 1 << 30
PosMax is the largest line or column value that can be represented without loss. Incoming values (arguments) larger than PosMax will be set to PosMax.
Variables ¶
This section is empty.
Functions ¶
func CommentsDo ¶ added in go1.17
CommentsDo parses the given source and calls the provided handler for each comment or error. If the text provided to handler starts with a '/' it is the comment text; otherwise it is the error message.
func Crawl
deprecated
added in
go1.18
Crawl traverses a syntax in pre-order: It starts by calling f(root); root must not be nil. If f returns false (== "continue"), Crawl calls f recursively for each of the non-nil children of that node; if f returns true (== "stop"), Crawl does not traverse the respective node's children.
See Walk for caveats about shared nodes.
Deprecated: Use Inspect instead.
func ErrorMap ¶ added in go1.17
ErrorMap collects all comments with comment text of the form `ERROR "msg"` or `ERROR msg` from the given src and returns them as []Error lists in a map indexed by line number. The position for each Error is the position of the token immediately preceding the comment, the Error message is the message msg extracted from the comment, with all errors that are on the same line collected in a slice, in source order. If there is no preceding token (the `ERROR` comment appears in the beginning of the file), then the recorded position is unknown (line, col = 0, 0). If there are no ERROR comments, the result is nil.
func Fdump ¶
Fdump dumps the structure of the syntax tree rooted at n to w. It is intended for debugging purposes; no specific output format is guaranteed.
func Fprint ¶
Fprint prints node x to w in the specified form. It returns the number of bytes written, and whether there was an error.
func Inspect ¶ added in go1.18
Inspect traverses an AST in pre-order: It starts by calling f(node); node must not be nil. If f returns true, Inspect invokes f recursively for each of the non-nil children of node, followed by a call of f(nil).
See Walk for caveats about shared nodes.
func String ¶
String is a convenience function that prints n in ShortForm and returns the printed string.
func Walk ¶ added in go1.17
Walk traverses an AST in pre-order: It starts by calling v.Visit(node); node must not be nil. If the visitor w returned by v.Visit(node) is not nil, Walk is invoked recursively with visitor w for each of the non-nil children of node, followed by a call of w.Visit(nil).
Some nodes may be shared among multiple parent nodes (e.g., types in field lists such as type T in "a, b, c T"). Such shared nodes are walked multiple times. TODO(gri) Revisit this design. It may make sense to walk those nodes only once. A place where this matters is types2.TestResolveIdents.
Types ¶
type ArrayType ¶
type ArrayType struct { // TODO(gri) consider using Name{"..."} instead of nil (permits attaching of comments) Len Expr // nil means Len is ... Elem Expr // contains filtered or unexported fields }
[Len]Elem
type AssertExpr ¶
X.(Type)
type AssignStmt ¶
type BadExpr ¶ added in go1.9
type BadExpr struct {
// contains filtered or unexported fields
}
Placeholder for an expression that failed to parse correctly and where we can't provide a better node.
type BasicLit ¶
type BasicLit struct { Value string Kind LitKind Bad bool // true means the literal Value has syntax errors // contains filtered or unexported fields }
Value
type BranchStmt ¶
type BranchStmt struct { Tok token // Break, Continue, Fallthrough, or Goto Label *Name // Target is the continuation of the control flow after executing // the branch; it is computed by the parser if CheckBranches is set. // Target is a *LabeledStmt for gotos, and a *SwitchStmt, *SelectStmt, // or *ForStmt for breaks and continues, depending on the context of // the branch. Target is not set for fallthroughs. Target Stmt // contains filtered or unexported fields }
type CallExpr ¶
type CallExpr struct { Fun Expr ArgList []Expr // nil means no arguments HasDots bool // last argument is followed by ... // contains filtered or unexported fields }
Fun(ArgList[0], ArgList[1], ...)
type CallStmt ¶
type CallStmt struct { Tok token // Go or Defer Call *CallExpr // contains filtered or unexported fields }
type CaseClause ¶
type ChanType ¶
type ChanType struct { Dir ChanDir // 0 means no direction Elem Expr // contains filtered or unexported fields }
chan Elem
<-chan Elem chan<- Elem
type CommClause ¶
type CommClause struct { Comm SimpleStmt // send or receive stmt; nil means default clause Body []Stmt Colon Pos // contains filtered or unexported fields }
type Comment ¶
type Comment struct { Kind CommentKind Text string Next *Comment }
type CommentKind ¶
type CommentKind uint
TODO(gri) Consider renaming to CommentPos, CommentPlacement, etc. Kind = Above doesn't make much sense.
const ( Above CommentKind = iota Below Left Right )
type CompositeLit ¶
type CompositeLit struct { Type Expr // nil means no literal type ElemList []Expr NKeys int // number of elements with keys Rbrace Pos // contains filtered or unexported fields }
Type { ElemList[0], ElemList[1], ... }
type ConstDecl ¶
type ConstDecl struct { Group *Group // nil means not part of a group Pragma Pragma NameList []*Name Type Expr // nil means no type Values Expr // nil means no values // contains filtered or unexported fields }
NameList NameList = Values NameList Type = Values
type DotsType ¶
type DotsType struct { Elem Expr // contains filtered or unexported fields }
...Elem
type ErrorHandler ¶
type ErrorHandler func(err error)
An ErrorHandler is called for each error encountered reading a .go file.
type Field ¶
type Field struct { Name *Name // nil means anonymous field/parameter (structs/parameters), or embedded element (interfaces) Type Expr // field names declared in a list share the same Type (identical pointers) // contains filtered or unexported fields }
Name Type
Type
type File ¶
type File struct { Pragma Pragma PkgName *Name DeclList []Decl EOF Pos // contains filtered or unexported fields }
package PkgName; DeclList[0], DeclList[1], ...
func Parse ¶
func Parse(base *PosBase, src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error)
Parse parses a single Go source file from src and returns the corresponding syntax tree. If there are errors, Parse will return the first error found, and a possibly partially constructed syntax tree, or nil.
If errh != nil, it is called with each error encountered, and Parse will process as much source as possible. In this case, the returned syntax tree is only nil if no correct package clause was found. If errh is nil, Parse will terminate immediately upon encountering the first error, and the returned syntax tree is nil.
If pragh != nil, it is called with each pragma encountered.
func ParseFile ¶
func ParseFile(filename string, errh ErrorHandler, pragh PragmaHandler, mode Mode) (*File, error)
ParseFile behaves like Parse but it reads the source from the named file.
type ForStmt ¶
type ForStmt struct { Init SimpleStmt // incl. *RangeClause Cond Expr Post SimpleStmt Body *BlockStmt // contains filtered or unexported fields }
type Form ¶ added in go1.17
type Form uint
Form controls print formatting.
const ( LineForm Form // use spaces instead of linebreaks where possible ShortForm // like LineForm but print "…" for non-empty function or composite literal bodies )
type FuncDecl ¶
type FuncDecl struct { Pragma Pragma Recv *Field // nil means regular function Name *Name TParamList []*Field // nil means no type parameters Type *FuncType Body *BlockStmt // nil means no body (forward declaration) // contains filtered or unexported fields }
func Name Type { Body } func Name Type func Receiver Name Type { Body } func Receiver Name Type
type Group ¶
type Group struct {
// contains filtered or unexported fields
}
All declarations belonging to the same group point to the same Group node.
type IfStmt ¶
type IfStmt struct { Init SimpleStmt Cond Expr Then *BlockStmt Else Stmt // either nil, *IfStmt, or *BlockStmt // contains filtered or unexported fields }
type ImportDecl ¶
type ImportDecl struct { Group *Group // nil means not part of a group Pragma Pragma LocalPkgName *Name // including "."; nil means no rename present Path *BasicLit // Path.Bad || Path.Kind == StringLit; nil means no path // contains filtered or unexported fields }
Path
LocalPkgName Path
type InterfaceType ¶
type InterfaceType struct { MethodList []*Field // contains filtered or unexported fields }
interface { MethodList[0]; MethodList[1]; ... }
type KeyValueExpr ¶
type KeyValueExpr struct {
Key, Value Expr
// contains filtered or unexported fields
}
Key: Value
type LabeledStmt ¶
type ListExpr ¶
type ListExpr struct { ElemList []Expr // contains filtered or unexported fields }
ElemList[0], ElemList[1], ...
type MapType ¶
type MapType struct {
Key, Value Expr
// contains filtered or unexported fields
}
map[Key]Value
type Node ¶
type Node interface { // Pos() returns the position associated with the node as follows: // 1) The position of a node representing a terminal syntax production // (Name, BasicLit, etc.) is the position of the respective production // in the source. // 2) The position of a node representing a non-terminal production // (IndexExpr, IfStmt, etc.) is the position of a token uniquely // associated with that production; usually the left-most one // ('[' for IndexExpr, 'if' for IfStmt, etc.) Pos() Pos // contains filtered or unexported methods }
type Operator ¶
type Operator uint
const ( // Def is the : in := Def Operator // : Not // ! Recv // <- Tilde // ~ // precOrOr OrOr // || // precAndAnd AndAnd // && // precCmp Eql // == Neq // != Lss // < Leq // <= Gtr // > Geq // >= // precAdd Add // + Sub // - Or // | Xor // ^ // precMul Mul // * Div // / Rem // % And // & AndNot // &^ Shl // << Shr // >> )
type Pos ¶ added in go1.11
type Pos struct {
// contains filtered or unexported fields
}
A Pos represents an absolute (line, col) source position with a reference to position base for computing relative (to a file, or line directive) position information. Pos values are intentionally light-weight so that they can be created without too much concern about space use.
func EndPos ¶ added in go1.17
EndPos returns the approximate end position of n in the source. For some nodes (*Name, *BasicLit) it returns the position immediately following the node; for others (*BlockStmt, *SwitchStmt, etc.) it returns the position of the closing '}'; and for some (*ParenExpr) the returned position is the end position of the last enclosed expression. Thus, EndPos should not be used for exact demarcation of the end of a node in the source; it is mostly useful to determine scope ranges where there is some leeway.
func (Pos) Cmp ¶ added in go1.17
Cmp compares the positions p and q and returns a result r as follows:
r < 0: p is before q r == 0: p and q are the same position (but may not be identical) r > 0: p is after q
If p and q are in different files, p is before q if the filename of p sorts lexicographically before the filename of q.
func (Pos) RelFilename ¶ added in go1.11
type PosBase ¶ added in go1.11
type PosBase struct {
// contains filtered or unexported fields
}
A PosBase represents the base for relative position information: At position pos, the relative position is filename:line:col.
func NewFileBase ¶ added in go1.11
NewFileBase returns a new PosBase for the given filename. A file PosBase's position is relative to itself, with the position being filename:1:1.
func NewLineBase ¶ added in go1.11
NewLineBase returns a new PosBase for a line directive "line filename:line:col" relative to pos, which is the position of the character immediately following the comment containing the line directive. For a directive in a line comment, that position is the beginning of the next line (i.e., the newline character belongs to the line comment).
func NewTrimmedFileBase ¶ added in go1.18
NewTrimmedFileBase is like NewFileBase, but allows specifying Trimmed.
func (*PosBase) IsFileBase ¶ added in go1.11
type Pragma ¶
type Pragma interface{}
A Pragma value augments a package, import, const, func, type, or var declaration. Its meaning is entirely up to the PragmaHandler, except that nil is used to mean “no pragma seen.”
type PragmaHandler ¶
A PragmaHandler is used to process //go: directives while scanning. It is passed the current pragma value, which starts out being nil, and it returns an updated pragma value. The text is the directive, with the "//" prefix stripped. The current pragma is saved at each package, import, const, func, type, or var declaration, into the File, ImportDecl, ConstDecl, FuncDecl, TypeDecl, or VarDecl node.
If text is the empty string, the pragma is being returned to the handler unused, meaning it appeared before a non-declaration. The handler may wish to report an error. In this case, pos is the current parser position, not the position of the pragma itself. Blank specifies whether the line is blank before the pragma.
type RangeClause ¶
type ReturnStmt ¶
type ReturnStmt struct { Results Expr // nil means no explicit return values // contains filtered or unexported fields }
type SelectStmt ¶
type SelectStmt struct { Body []*CommClause Rbrace Pos // contains filtered or unexported fields }
type SelectorExpr ¶
X.Sel
type SendStmt ¶
type SendStmt struct {
Chan, Value Expr // Chan <- Value
// contains filtered or unexported fields
}
type SimpleStmt ¶
type SimpleStmt interface { Stmt // contains filtered or unexported methods }
type SliceExpr ¶
type SliceExpr struct { X Expr Index [3]Expr // Full indicates whether this is a simple or full slice expression. // In a valid AST, this is equivalent to Index[2] != nil. // TODO(mdempsky): This is only needed to report the "3-index // slice of string" error when Index[2] is missing. Full bool // contains filtered or unexported fields }
X[Index[0] : Index[1] : Index[2]]
type SliceType ¶
type SliceType struct { Elem Expr // contains filtered or unexported fields }
[]Elem
type StructType ¶
type StructType struct { FieldList []*Field TagList []*BasicLit // i >= len(TagList) || TagList[i] == nil means no tag for field i // contains filtered or unexported fields }
struct { FieldList[0] TagList[0]; FieldList[1] TagList[1]; ... }
type SwitchStmt ¶
type SwitchStmt struct { Init SimpleStmt Tag Expr // incl. *TypeSwitchGuard Body []*CaseClause Rbrace Pos // contains filtered or unexported fields }
type TypeDecl ¶
type TypeDecl struct { Group *Group // nil means not part of a group Pragma Pragma Name *Name TParamList []*Field // nil means no type parameters Alias bool Type Expr // contains filtered or unexported fields }
Name Type
type TypeSwitchGuard ¶
type TypeSwitchGuard struct { Lhs *Name // nil means no Lhs := X Expr // X.(type) // contains filtered or unexported fields }
X.(type) Lhs := X.(type)