Documentation
¶
Overview ¶
Package ast declares the types used to represent syntax trees for Go packages.
Index ¶
- func FileExports(src *File) bool
- func FilterDecl(decl Decl, f Filter) bool
- func FilterFile(src *File, f Filter) bool
- func FilterPackage(pkg *Package, f Filter) bool
- func Fprint(w io.Writer, fset *token.FileSet, x interface{}, f FieldFilter) (err error)
- func Inspect(node Node, f func(Node) bool)
- func IsExported(name string) bool
- func NotNilFilter(_ string, v reflect.Value) bool
- func PackageExports(pkg *Package) bool
- func Print(fset *token.FileSet, x interface{}) error
- func SortImports(fset *token.FileSet, f *File)
- func Walk(v Visitor, node Node)
- type ArrayType
- type AssignStmt
- type BadDecl
- type BadExpr
- type BadStmt
- type BasicLit
- type BinaryExpr
- type BlockStmt
- type BranchStmt
- type CallExpr
- type CaseClause
- type ChanDir
- type ChanType
- type CommClause
- type Comment
- type CommentGroup
- type CompositeLit
- type Decl
- type DeclStmt
- type DeferStmt
- type Ellipsis
- type EmptyStmt
- type Expr
- type ExprStmt
- type Field
- type FieldFilter
- type FieldList
- type File
- type Filter
- type ForStmt
- type FuncDecl
- type FuncLit
- type FuncType
- type GenDecl
- type GoStmt
- type Ident
- type IfStmt
- type ImportSpec
- type Importer
- type IncDecStmt
- type IndexExpr
- type InterfaceType
- type KeyValueExpr
- type LabeledStmt
- type MapType
- type MergeMode
- type Node
- type ObjKind
- type Object
- type Package
- type ParenExpr
- type RangeStmt
- type ReturnStmt
- type Scope
- type SelectStmt
- type SelectorExpr
- type SendStmt
- type SliceExpr
- type Spec
- type StarExpr
- type Stmt
- type StructType
- type SwitchStmt
- type TypeAssertExpr
- type TypeSpec
- type TypeSwitchStmt
- type UnaryExpr
- type ValueSpec
- type Visitor
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func FileExports ¶
FileExports trims the AST for a Go source file in place such that only exported nodes remain: all top-level identifiers which are not exported and their associated information (such as type, initial value, or function body) are removed. Non-exported fields and methods of exported types are stripped. The File.Comments list is not changed.
FileExports returns true if there are exported declarations; it returns false otherwise.
func FilterDecl ¶
FilterDecl trims the AST for a Go declaration in place by removing all names (including struct field and interface method names, but not from parameter lists) that don't pass through the filter f.
FilterDecl returns true if there are any declared names left after filtering; it returns false otherwise.
func FilterFile ¶
FilterFile trims the AST for a Go file in place by removing all names from top-level declarations (including struct field and interface method names, but not from parameter lists) that don't pass through the filter f. If the declaration is empty afterwards, the declaration is removed from the AST. The File.Comments list is not changed.
FilterFile returns true if there are any top-level declarations left after filtering; it returns false otherwise.
func FilterPackage ¶
FilterPackage trims the AST for a Go package in place by removing all names from top-level declarations (including struct field and interface method names, but not from parameter lists) that don't pass through the filter f. If the declaration is empty afterwards, the declaration is removed from the AST. The pkg.Files list is not changed, so that file names and top-level package comments don't get lost.
FilterPackage returns true if there are any top-level declarations left after filtering; it returns false otherwise.
func Fprint ¶
Fprint prints the (sub-)tree starting at AST node x to w. If fset != nil, position information is interpreted relative to that file set. Otherwise positions are printed as integer values (file set specific offsets).
A non-nil FieldFilter f may be provided to control the output: struct fields for which f(fieldname, fieldvalue) is true are are printed; all others are filtered from the output. Unexported struct fields are never printed.
func Inspect ¶
Inspect traverses an AST in depth-first order: It starts by calling f(node); node must not be nil. If f returns true, Inspect invokes f for all the non-nil children of node, recursively.
Example ¶
This example demonstrates how to inspect the AST of a Go program.
package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
)
func main() {
// src is the input for which we want to inspect the AST.
src := `
package p
const c = 1.0
var X = f(3.14)*2 + c
`
// Create the AST by parsing src.
fset := token.NewFileSet() // positions are relative to fset
f, err := parser.ParseFile(fset, "src.go", src, 0)
if err != nil {
panic(err)
}
// Inspect the AST and print all identifiers and literals.
ast.Inspect(f, func(n ast.Node) bool {
var s string
switch x := n.(type) {
case *ast.BasicLit:
s = x.Value
case *ast.Ident:
s = x.Name
}
if s != "" {
fmt.Printf("%s:\t%s\n", fset.Position(n.Pos()), s)
}
return true
})
}
Output: src.go:2:9: p src.go:3:7: c src.go:3:11: 1.0 src.go:4:5: X src.go:4:9: f src.go:4:11: 3.14 src.go:4:17: 2 src.go:4:21: c
func IsExported ¶
IsExported returns whether name is an exported Go symbol (i.e., whether it begins with an uppercase letter).
func NotNilFilter ¶
NotNilFilter returns true for field values that are not nil; it returns false otherwise.
func PackageExports ¶
PackageExports trims the AST for a Go package in place such that only exported nodes remain. The pkg.Files list is not changed, so that file names and top-level package comments don't get lost.
PackageExports returns true if there are exported declarations; it returns false otherwise.
func Print ¶
Print prints x to standard output, skipping nil fields. Print(fset, x) is the same as Fprint(os.Stdout, fset, x, NotNilFilter).
Example ¶
This example shows what an AST looks like when printed for debugging.
package main
import (
"go/ast"
"go/parser"
"go/token"
)
func main() {
// src is the input for which we want to print the AST.
src := `
package main
func main() {
println("Hello, World!")
}
`
// Create the AST by parsing src.
fset := token.NewFileSet() // positions are relative to fset
f, err := parser.ParseFile(fset, "", src, 0)
if err != nil {
panic(err)
}
// Print the AST.
ast.Print(fset, f)
}
Output: 0 *ast.File { 1 . Package: 2:1 2 . Name: *ast.Ident { 3 . . NamePos: 2:9 4 . . Name: "main" 5 . } 6 . Decls: []ast.Decl (len = 1) { 7 . . 0: *ast.FuncDecl { 8 . . . Name: *ast.Ident { 9 . . . . NamePos: 3:6 10 . . . . Name: "main" 11 . . . . Obj: *ast.Object { 12 . . . . . Kind: func 13 . . . . . Name: "main" 14 . . . . . Decl: *(obj @ 7) 15 . . . . } 16 . . . } 17 . . . Type: *ast.FuncType { 18 . . . . Func: 3:1 19 . . . . Params: *ast.FieldList { 20 . . . . . Opening: 3:10 21 . . . . . Closing: 3:11 22 . . . . } 23 . . . } 24 . . . Body: *ast.BlockStmt { 25 . . . . Lbrace: 3:13 26 . . . . List: []ast.Stmt (len = 1) { 27 . . . . . 0: *ast.ExprStmt { 28 . . . . . . X: *ast.CallExpr { 29 . . . . . . . Fun: *ast.Ident { 30 . . . . . . . . NamePos: 4:2 31 . . . . . . . . Name: "println" 32 . . . . . . . } 33 . . . . . . . Lparen: 4:9 34 . . . . . . . Args: []ast.Expr (len = 1) { 35 . . . . . . . . 0: *ast.BasicLit { 36 . . . . . . . . . ValuePos: 4:10 37 . . . . . . . . . Kind: STRING 38 . . . . . . . . . Value: "\"Hello, World!\"" 39 . . . . . . . . } 40 . . . . . . . } 41 . . . . . . . Ellipsis: - 42 . . . . . . . Rparen: 4:25 43 . . . . . . } 44 . . . . . } 45 . . . . } 46 . . . . Rbrace: 5:1 47 . . . } 48 . . } 49 . } 50 . Scope: *ast.Scope { 51 . . Objects: map[string]*ast.Object (len = 1) { 52 . . . "main": *(obj @ 11) 53 . . } 54 . } 55 . Unresolved: []*ast.Ident (len = 1) { 56 . . 0: *(obj @ 29) 57 . } 58 }
func SortImports ¶
SortImports sorts runs of consecutive import lines in import blocks in f.
Types ¶
type AssignStmt ¶
An AssignStmt node represents an assignment or a short variable declaration.
func (*AssignStmt) End ¶
func (s *AssignStmt) End() token.Pos
func (*AssignStmt) Pos ¶
func (s *AssignStmt) Pos() token.Pos
type BadDecl ¶
A BadDecl node is a placeholder for declarations containing syntax errors for which no correct declaration nodes can be created.
type BadExpr ¶
A BadExpr node is a placeholder for expressions containing syntax errors for which no correct expression nodes can be created.
type BadStmt ¶
A BadStmt node is a placeholder for statements containing syntax errors for which no correct statement nodes can be created.
type BinaryExpr ¶
A BinaryExpr node represents a binary expression.
func (*BinaryExpr) End ¶
func (x *BinaryExpr) End() token.Pos
func (*BinaryExpr) Pos ¶
func (x *BinaryExpr) Pos() token.Pos
type BranchStmt ¶
A BranchStmt node represents a break, continue, goto, or fallthrough statement.
func (*BranchStmt) End ¶
func (s *BranchStmt) End() token.Pos
func (*BranchStmt) Pos ¶
func (s *BranchStmt) Pos() token.Pos
type CaseClause ¶
A CaseClause represents a case of an expression or type switch statement.
func (*CaseClause) End ¶
func (s *CaseClause) End() token.Pos
func (*CaseClause) Pos ¶
func (s *CaseClause) Pos() token.Pos
type ChanDir ¶
type ChanDir int
The direction of a channel type is indicated by one of the following constants.
type CommClause ¶
A CommClause node represents a case of a select statement.
func (*CommClause) End ¶
func (s *CommClause) End() token.Pos
func (*CommClause) Pos ¶
func (s *CommClause) Pos() token.Pos
type CommentGroup ¶
type CommentGroup struct {
List []*Comment
}
A CommentGroup represents a sequence of comments with no other tokens and no empty lines between.
func (*CommentGroup) End ¶
func (g *CommentGroup) End() token.Pos
func (*CommentGroup) Pos ¶
func (g *CommentGroup) Pos() token.Pos
func (*CommentGroup) Text ¶
func (g *CommentGroup) Text() string
Text returns the text of the comment. Comment markers (//, /*, and */), the first space of a line comment, and leading and trailing empty lines are removed. Multiple empty lines are reduced to one, and trailing space on lines is trimmed. Unless the result is empty, it is newline-terminated.
type CompositeLit ¶
A CompositeLit node represents a composite literal.
func (*CompositeLit) End ¶
func (x *CompositeLit) End() token.Pos
func (*CompositeLit) Pos ¶
func (x *CompositeLit) Pos() token.Pos
type Decl ¶
type Decl interface {
Node
// contains filtered or unexported methods
}
All declaration nodes implement the Decl interface.
type DeclStmt ¶
type DeclStmt struct {
Decl Decl
}
A DeclStmt node represents a declaration in a statement list.
type Ellipsis ¶
An Ellipsis node stands for the "..." type in a parameter list or the "..." length in an array type.
type EmptyStmt ¶
An EmptyStmt node represents an empty statement. The "position" of the empty statement is the position of the immediately preceding semicolon.
type Expr ¶
type Expr interface {
Node
// contains filtered or unexported methods
}
All expression nodes implement the Expr interface.
type ExprStmt ¶
type ExprStmt struct {
X Expr
}
An ExprStmt node represents a (stand-alone) expression in a statement list.
type Field ¶
type Field struct {
Doc *CommentGroup
Names []*Ident
Type Expr
Tag *BasicLit
Comment *CommentGroup
}
A Field represents a Field declaration list in a struct type, a method list in an interface type, or a parameter/result declaration in a signature.
type FieldFilter ¶
A FieldFilter may be provided to Fprint to control the output.
type FieldList ¶
A FieldList represents a list of Fields, enclosed by parentheses or braces.
type File ¶
type File struct {
Doc *CommentGroup
Package token.Pos
Name *Ident
Decls []Decl
Scope *Scope
Imports []*ImportSpec
Unresolved []*Ident
Comments []*CommentGroup
}
A File node represents a Go source file.
The Comments list contains all comments in the source file in order of appearance, including the comments that are pointed to from other nodes via Doc and Comment fields.
func MergePackageFiles ¶
MergePackageFiles creates a file AST by merging the ASTs of the files belonging to a package. The mode flags control merging behavior.
type FuncDecl ¶
type FuncDecl struct {
Doc *CommentGroup
Recv *FieldList
Name *Ident
Type *FuncType
Body *BlockStmt
}
A FuncDecl node represents a function declaration.
type GenDecl ¶
type GenDecl struct {
Doc *CommentGroup
TokPos token.Pos
Tok token.Token
Lparen token.Pos
Specs []Spec
Rparen token.Pos
}
A GenDecl node (generic declaration node) represents an import, constant, type or variable declaration. A valid Lparen position (Lparen.Line > 0) indicates a parenthesized declaration.
Relationship between Tok value and Specs element type:
token.IMPORT *ImportSpec token.CONST *ValueSpec token.TYPE *TypeSpec token.VAR *ValueSpec
type Ident ¶
An Ident node represents an identifier.
func NewIdent ¶
NewIdent creates a new Ident without position. Useful for ASTs generated by code other than the Go parser.
func (*Ident) IsExported ¶
IsExported returns whether id is an exported Go symbol (i.e., whether it begins with an uppercase letter).
type ImportSpec ¶
type ImportSpec struct {
Doc *CommentGroup
Name *Ident
Path *BasicLit
Comment *CommentGroup
EndPos token.Pos
}
An ImportSpec node represents a single package import.
func (*ImportSpec) End ¶
func (s *ImportSpec) End() token.Pos
func (*ImportSpec) Pos ¶
func (s *ImportSpec) Pos() token.Pos
Pos and End implementations for spec nodes.
type Importer ¶
An Importer resolves import paths to package Objects. The imports map records the packages already imported, indexed by package id (canonical import path). An Importer must determine the canonical import path and check the map to see if it is already present in the imports map. If so, the Importer can return the map entry. Otherwise, the Importer should load the package data for the given path into a new *Object (pkg), record pkg in the imports map, and then return pkg.
type IncDecStmt ¶
An IncDecStmt node represents an increment or decrement statement.
func (*IncDecStmt) End ¶
func (s *IncDecStmt) End() token.Pos
func (*IncDecStmt) Pos ¶
func (s *IncDecStmt) Pos() token.Pos
type InterfaceType ¶
An InterfaceType node represents an interface type.
func (*InterfaceType) End ¶
func (x *InterfaceType) End() token.Pos
func (*InterfaceType) Pos ¶
func (x *InterfaceType) Pos() token.Pos
type KeyValueExpr ¶
A KeyValueExpr node represents (key : value) pairs in composite literals.
func (*KeyValueExpr) End ¶
func (x *KeyValueExpr) End() token.Pos
func (*KeyValueExpr) Pos ¶
func (x *KeyValueExpr) Pos() token.Pos
type LabeledStmt ¶
A LabeledStmt node represents a labeled statement.
func (*LabeledStmt) End ¶
func (s *LabeledStmt) End() token.Pos
func (*LabeledStmt) Pos ¶
func (s *LabeledStmt) Pos() token.Pos
type MergeMode ¶
type MergeMode uint
The MergeMode flags control the behavior of MergePackageFiles.
const ( // If set, duplicate function declarations are excluded. FilterFuncDuplicates MergeMode = 1 << iota // If set, comments that are not associated with a specific // AST node (as Doc or Comment) are excluded. FilterUnassociatedComments // If set, duplicate import declarations are excluded. FilterImportDuplicates )
type Object ¶
An Object describes a named language entity such as a package, constant, type, variable, function (incl. methods), or label.
The Data fields contains object-specific data:
Kind Data type Data value Pkg *Scope package scope Con int iota for the respective declaration Con != nil constant value
type Package ¶
A Package node represents a set of source files collectively building a Go package.
func NewPackage ¶
func NewPackage(fset *token.FileSet, files map[string]*File, importer Importer, universe *Scope) (*Package, error)
NewPackage creates a new Package node from a set of File nodes. It resolves unresolved identifiers across files and updates each file's Unresolved list accordingly. If a non-nil importer and universe scope are provided, they are used to resolve identifiers not declared in any of the package files. Any remaining unresolved identifiers are reported as undeclared. If the files belong to different packages, one package name is selected and files with different package names are reported and then ignored. The result is a package node and a scanner.ErrorList if there were errors.
type RangeStmt ¶
type RangeStmt struct {
For token.Pos
Key, Value Expr
TokPos token.Pos
Tok token.Token
X Expr
Body *BlockStmt
}
A RangeStmt represents a for statement with a range clause.
type ReturnStmt ¶
A ReturnStmt node represents a return statement.
func (*ReturnStmt) End ¶
func (s *ReturnStmt) End() token.Pos
func (*ReturnStmt) Pos ¶
func (s *ReturnStmt) Pos() token.Pos
type Scope ¶
A Scope maintains the set of named language entities declared in the scope and a link to the immediately surrounding (outer) scope.
func (*Scope) Insert ¶
Insert attempts to insert a named object obj into the scope s. If the scope already contains an object alt with the same name, Insert leaves the scope unchanged and returns alt. Otherwise it inserts obj and returns nil."
type SelectStmt ¶
An SelectStmt node represents a select statement.
func (*SelectStmt) End ¶
func (s *SelectStmt) End() token.Pos
func (*SelectStmt) Pos ¶
func (s *SelectStmt) Pos() token.Pos
type SelectorExpr ¶
A SelectorExpr node represents an expression followed by a selector.
func (*SelectorExpr) End ¶
func (x *SelectorExpr) End() token.Pos
func (*SelectorExpr) Pos ¶
func (x *SelectorExpr) Pos() token.Pos
type Spec ¶
type Spec interface {
Node
// contains filtered or unexported methods
}
The Spec type stands for any of *ImportSpec, *ValueSpec, and *TypeSpec.
type StarExpr ¶
A StarExpr node represents an expression of the form "*" Expression. Semantically it could be a unary "*" expression, or a pointer type.
type Stmt ¶
type Stmt interface {
Node
// contains filtered or unexported methods
}
All statement nodes implement the Stmt interface.
type StructType ¶
A StructType node represents a struct type.
func (*StructType) End ¶
func (x *StructType) End() token.Pos
func (*StructType) Pos ¶
func (x *StructType) Pos() token.Pos
type SwitchStmt ¶
A SwitchStmt node represents an expression switch statement.
func (*SwitchStmt) End ¶
func (s *SwitchStmt) End() token.Pos
func (*SwitchStmt) Pos ¶
func (s *SwitchStmt) Pos() token.Pos
type TypeAssertExpr ¶
A TypeAssertExpr node represents an expression followed by a type assertion.
func (*TypeAssertExpr) End ¶
func (x *TypeAssertExpr) End() token.Pos
func (*TypeAssertExpr) Pos ¶
func (x *TypeAssertExpr) Pos() token.Pos
type TypeSpec ¶
type TypeSpec struct {
Doc *CommentGroup
Name *Ident
Type Expr
Comment *CommentGroup
}
A TypeSpec node represents a type declaration (TypeSpec production).
type TypeSwitchStmt ¶
An TypeSwitchStmt node represents a type switch statement.
func (*TypeSwitchStmt) End ¶
func (s *TypeSwitchStmt) End() token.Pos
func (*TypeSwitchStmt) Pos ¶
func (s *TypeSwitchStmt) Pos() token.Pos
type UnaryExpr ¶
A UnaryExpr node represents a unary expression. Unary "*" expressions are represented via StarExpr nodes.
type ValueSpec ¶
type ValueSpec struct {
Doc *CommentGroup
Names []*Ident
Type Expr
Values []Expr
Comment *CommentGroup
}
A ValueSpec node represents a constant or variable declaration (ConstSpec or VarSpec production).