go nodes 源码

2022-07-15 浏览 (1358)

golang nodes 代码

文件路径:/src/cmd/compile/internal/syntax/nodes.go

/ Copyright 2016 The Go Authors. All rights reserved.
/ Use of this source code is governed by a BSD-style
/ license that can be found in the LICENSE file.

package syntax

/ ----------------------------------------------------------------------------
/ Nodes

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
	aNode()
}

type node struct {
	/ commented out for now since not yet used
	/ doc  *Comment / nil means no comment(s) attached
	pos Pos
}

func (n *node) Pos() Pos { return n.pos }
func (*node) aNode()     {}

/ ----------------------------------------------------------------------------
/ Files

/ package PkgName; DeclList[0], DeclList[1], ...
type File struct {
	Pragma   Pragma
	PkgName  *Name
	DeclList []Decl
	EOF      Pos
	node
}

/ ----------------------------------------------------------------------------
/ Declarations

type (
	Decl interface {
		Node
		aDecl()
	}

	/              Path
	/ LocalPkgName Path
	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
		decl
	}

	/ NameList
	/ NameList      = Values
	/ NameList Type = Values
	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
		decl
	}

	/ Name 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
		decl
	}

	/ NameList Type
	/ NameList Type = Values
	/ NameList      = Values
	VarDecl 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
		decl
	}

	/ func          Name Type { Body }
	/ func          Name Type
	/ func Receiver Name Type { Body }
	/ func Receiver Name 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)
		decl
	}
)

type decl struct{ node }

func (*decl) aDecl() {}

/ All declarations belonging to the same group point to the same Group node.
type Group struct {
	_ int / not empty so we are guaranteed different Group instances
}

/ ----------------------------------------------------------------------------
/ Expressions

func NewName(pos Pos, value string) *Name {
	n := new(Name)
	n.pos = pos
	n.Value = value
	return n
}

type (
	Expr interface {
		Node
		aExpr()
	}

	/ Placeholder for an expression that failed to parse
	/ correctly and where we can't provide a better node.
	BadExpr struct {
		expr
	}

	/ Value
	Name struct {
		Value string
		expr
	}

	/ Value
	BasicLit struct {
		Value string
		Kind  LitKind
		Bad   bool / true means the literal Value has syntax errors
		expr
	}

	/ Type { ElemList[0], ElemList[1], ... }
	CompositeLit struct {
		Type     Expr / nil means no literal type
		ElemList []Expr
		NKeys    int / number of elements with keys
		Rbrace   Pos
		expr
	}

	/ Key: Value
	KeyValueExpr struct {
		Key, Value Expr
		expr
	}

	/ func Type { Body }
	FuncLit struct {
		Type *FuncType
		Body *BlockStmt
		expr
	}

	/ (X)
	ParenExpr struct {
		X Expr
		expr
	}

	/ X.Sel
	SelectorExpr struct {
		X   Expr
		Sel *Name
		expr
	}

	/ X[Index]
	/ X[T1, T2, ...] (with Ti = Index.(*ListExpr).ElemList[i])
	IndexExpr struct {
		X     Expr
		Index Expr
		expr
	}

	/ X[Index[0] : Index[1] : Index[2]]
	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
		expr
	}

	/ X.(Type)
	AssertExpr struct {
		X    Expr
		Type Expr
		expr
	}

	/ X.(type)
	/ Lhs := X.(type)
	TypeSwitchGuard struct {
		Lhs *Name / nil means no Lhs :=
		X   Expr  / X.(type)
		expr
	}

	Operation struct {
		Op   Operator
		X, Y Expr / Y == nil means unary expression
		expr
	}

	/ Fun(ArgList[0], ArgList[1], ...)
	CallExpr struct {
		Fun     Expr
		ArgList []Expr / nil means no arguments
		HasDots bool   / last argument is followed by ...
		expr
	}

	/ ElemList[0], ElemList[1], ...
	ListExpr struct {
		ElemList []Expr
		expr
	}

	/ [Len]Elem
	ArrayType struct {
		/ TODO(gri) consider using Name{"..."} instead of nil (permits attaching of comments)
		Len  Expr / nil means Len is ...
		Elem Expr
		expr
	}

	/ []Elem
	SliceType struct {
		Elem Expr
		expr
	}

	/ ...Elem
	DotsType struct {
		Elem Expr
		expr
	}

	/ struct { FieldList[0] TagList[0]; FieldList[1] TagList[1]; ... }
	StructType struct {
		FieldList []*Field
		TagList   []*BasicLit / i >= len(TagList) || TagList[i] == nil means no tag for field i
		expr
	}

	/ Name Type
	/      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)
		node
	}

	/ interface { MethodList[0]; MethodList[1]; ... }
	InterfaceType struct {
		MethodList []*Field
		expr
	}

	FuncType struct {
		ParamList  []*Field
		ResultList []*Field
		expr
	}

	/ map[Key]Value
	MapType struct {
		Key, Value Expr
		expr
	}

	/   chan Elem
	/ <-chan Elem
	/ chan<- Elem
	ChanType struct {
		Dir  ChanDir / 0 means no direction
		Elem Expr
		expr
	}
)

type expr struct{ node }

func (*expr) aExpr() {}

type ChanDir uint

const (
	_ ChanDir = iota
	SendOnly
	RecvOnly
)

/ ----------------------------------------------------------------------------
/ Statements

type (
	Stmt interface {
		Node
		aStmt()
	}

	SimpleStmt interface {
		Stmt
		aSimpleStmt()
	}

	EmptyStmt struct {
		simpleStmt
	}

	LabeledStmt struct {
		Label *Name
		Stmt  Stmt
		stmt
	}

	BlockStmt struct {
		List   []Stmt
		Rbrace Pos
		stmt
	}

	ExprStmt struct {
		X Expr
		simpleStmt
	}

	SendStmt struct {
		Chan, Value Expr / Chan <- Value
		simpleStmt
	}

	DeclStmt struct {
		DeclList []Decl
		stmt
	}

	AssignStmt struct {
		Op       Operator / 0 means no operation
		Lhs, Rhs Expr     / Rhs == nil means Lhs++ (Op == Add) or Lhs-- (Op == Sub)
		simpleStmt
	}

	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
		stmt
	}

	CallStmt struct {
		Tok  token / Go or Defer
		Call *CallExpr
		stmt
	}

	ReturnStmt struct {
		Results Expr / nil means no explicit return values
		stmt
	}

	IfStmt struct {
		Init SimpleStmt
		Cond Expr
		Then *BlockStmt
		Else Stmt / either nil, *IfStmt, or *BlockStmt
		stmt
	}

	ForStmt struct {
		Init SimpleStmt / incl. *RangeClause
		Cond Expr
		Post SimpleStmt
		Body *BlockStmt
		stmt
	}

	SwitchStmt struct {
		Init   SimpleStmt
		Tag    Expr / incl. *TypeSwitchGuard
		Body   []*CaseClause
		Rbrace Pos
		stmt
	}

	SelectStmt struct {
		Body   []*CommClause
		Rbrace Pos
		stmt
	}
)

type (
	RangeClause struct {
		Lhs Expr / nil means no Lhs = or Lhs :=
		Def bool / means :=
		X   Expr / range X
		simpleStmt
	}

	CaseClause struct {
		Cases Expr / nil means default clause
		Body  []Stmt
		Colon Pos
		node
	}

	CommClause struct {
		Comm  SimpleStmt / send or receive stmt; nil means default clause
		Body  []Stmt
		Colon Pos
		node
	}
)

type stmt struct{ node }

func (stmt) aStmt() {}

type simpleStmt struct {
	stmt
}

func (simpleStmt) aSimpleStmt() {}

/ ----------------------------------------------------------------------------
/ Comments

/ TODO(gri) Consider renaming to CommentPos, CommentPlacement, etc.
/ Kind = Above doesn't make much sense.
type CommentKind uint

const (
	Above CommentKind = iota
	Below
	Left
	Right
)

type Comment struct {
	Kind CommentKind
	Text string
	Next *Comment
}

相关信息

go 源码目录

相关文章

go branches 源码

go dumper 源码

go dumper_test 源码

go error_test 源码

go nodes_test 源码

go operator_string 源码

go parser 源码

go parser_test 源码

go pos 源码

go positions 源码

^