//NOTE: This file is autogenerated. Do not modify.

package uast

type Position struct {
	Offset int // offset, starting at 0
	Line   int `json:"line"`   // line number, starting at 1
	Column int `json:"column"` // column number, starting at 1 (byte count)
}

type Location struct {
	Start      Position `json:"start"`
	End        Position `json:"end"`
	SourceFile string   `json:"sourcefile"` // sourcefile, if any
}

type UNode interface {
	SetLocation(*Location)
	GetLocation() *Location
}

type ASTNode struct {
	Loc *Location `json:"loc"`
}

func (n *ASTNode) SetLocation(loc *Location) {
	n.Loc = loc
}

func (n *ASTNode) GetLocation() *Location {
	return n.Loc
}

type Noop struct {
	Type string `json:"type" default:"Noop"`

	ASTNode
	Meta `json:"_meta"`
}

type Literal struct {
	Type        string `json:"type" default:"Literal"`
	Value       string `json:"value"`
	LiteralType string `json:"literalType"`
	ASTNode
	Meta `json:"_meta"`
}

type Identifier struct {
	Type string `json:"type" default:"Identifier"`
	Name string `json:"name"`
	ASTNode
	Meta `json:"_meta"`
}

/*
*
一个最小的编译单元。例如一个.js或.py或.class文件，都是一个最小编译单元
*
*/
type CompileUnit struct {
	Type string        `json:"type" default:"CompileUnit"`
	Body []Instruction `json:"body"`
	/**源语言种类**/
	Language string `json:"language"`
	/**源语言版本**/
	LanguageVersion string `json:"languageVersion"`
	/**该AST的唯一标识**/
	Uri string `json:"uri"`
	/**UAST版本**/
	Version string `json:"version"`
	ASTNode
	Meta `json:"_meta"`
}

type ExportStatement struct {
	Type     string      `json:"type" default:"ExportStatement"`
	Argument Expression  `json:"argument"`
	Alias    *Identifier `json:"alias"`
	ASTNode
	Meta `json:"_meta"`
}

type IfStatement struct {
	Type        string      `json:"type" default:"IfStatement"`
	Test        Expression  `json:"test"`
	Consequent  Instruction `json:"consequent"`
	Alternative Instruction `json:"alternative"`
	ASTNode
	Meta `json:"_meta"`
}

type SwitchStatement struct {
	Type         string        `json:"type" default:"SwitchStatement"`
	Discriminant Expression    `json:"discriminant"`
	Cases        []*CaseClause `json:"cases"`
	ASTNode
	Meta `json:"_meta"`
}

type CaseClause struct {
	Type string      `json:"type" default:"CaseClause"`
	Test Expression  `json:"test"`
	Body Instruction `json:"body"`
	ASTNode
	Meta `json:"_meta"`
}

type ForStatement struct {
	Type   string      `json:"type" default:"ForStatement"`
	Init   UNode       `json:"init"`
	Test   Expression  `json:"test"`
	Update Expression  `json:"update"`
	Body   Instruction `json:"body"`
	ASTNode
	Meta `json:"_meta"`
}

type WhileStatement struct {
	Type       string      `json:"type" default:"WhileStatement"`
	Test       Expression  `json:"test"`
	Body       Instruction `json:"body"`
	IsPostTest bool        `json:"isPostTest"`
	ASTNode
	Meta `json:"_meta"`
}

type RangeStatement struct {
	Type  string      `json:"type" default:"RangeStatement"`
	Key   UNode       `json:"key"`
	Value UNode       `json:"value"`
	Right Expression  `json:"right"`
	Body  Instruction `json:"body"`
	ASTNode
	Meta `json:"_meta"`
}

type LabeledStatement struct {
	Type  string      `json:"type" default:"LabeledStatement"`
	Label *Identifier `json:"label"`
	Body  Instruction `json:"body"`
	ASTNode
	Meta `json:"_meta"`
}

type ReturnStatement struct {
	Type     string     `json:"type" default:"ReturnStatement"`
	Argument Expression `json:"argument"`
	IsYield  bool       `json:"isYield"`
	ASTNode
	Meta `json:"_meta"`
}

type BreakStatement struct {
	Type  string      `json:"type" default:"BreakStatement"`
	Label *Identifier `json:"label"`
	ASTNode
	Meta `json:"_meta"`
}

type ContinueStatement struct {
	Type  string      `json:"type" default:"ContinueStatement"`
	Label *Identifier `json:"label"`
	ASTNode
	Meta `json:"_meta"`
}

type ThrowStatement struct {
	Type     string     `json:"type" default:"ThrowStatement"`
	Argument Expression `json:"argument"`
	ASTNode
	Meta `json:"_meta"`
}

type TryStatement struct {
	Type      string         `json:"type" default:"TryStatement"`
	Body      Statement      `json:"body"`
	Handlers  []*CatchClause `json:"handlers"`
	Finalizer Instruction    `json:"finalizer"`
	ASTNode
	Meta `json:"_meta"`
}

type CatchClause struct {
	Type      string        `json:"type" default:"CatchClause"`
	Parameter []Instruction `json:"parameter"`
	Body      Instruction   `json:"body"`
	ASTNode
	Meta `json:"_meta"`
}

type ExpressionStatement struct {
	Type       string     `json:"type" default:"ExpressionStatement"`
	Expression Expression `json:"expression"`
	ASTNode
	Meta `json:"_meta"`
}

type ScopedStatement struct {
	Type string        `json:"type" default:"ScopedStatement"`
	Body []Instruction `json:"body"`
	Id   *Identifier   `json:"id"`
	ASTNode
	Meta `json:"_meta"`
}

type BinaryExpression struct {
	Type     string     `json:"type" default:"BinaryExpression"`
	Operator string     `json:"operator"`
	Left     Expression `json:"left"`
	Right    Expression `json:"right"`
	ASTNode
	Meta `json:"_meta"`
}

type UnaryExpression struct {
	Type     string     `json:"type" default:"UnaryExpression"`
	Operator string     `json:"operator"`
	Argument Expression `json:"argument"`
	IsSuffix bool       `json:"isSuffix"`
	ASTNode
	Meta `json:"_meta"`
}

type AssignmentExpression struct {
	Type     string     `json:"type" default:"AssignmentExpression"`
	Left     LVal       `json:"left"`
	Right    Expression `json:"right"`
	Operator string     `json:"operator"`
	Cloned   bool       `json:"cloned"`
	ASTNode
	Meta `json:"_meta"`
}

type Sequence struct {
	Type        string        `json:"type" default:"Sequence"`
	Expressions []Instruction `json:"expressions"`
	ASTNode
	Meta `json:"_meta"`
}

type CastExpression struct {
	Type       string     `json:"type" default:"CastExpression"`
	Expression Expression `json:"expression"`
	As         Type       `json:"as"`
	ASTNode
	Meta `json:"_meta"`
}

type ConditionalExpression struct {
	Type        string     `json:"type" default:"ConditionalExpression"`
	Test        Expression `json:"test"`
	Consequent  Expression `json:"consequent"`
	Alternative Expression `json:"alternative"`
	ASTNode
	Meta `json:"_meta"`
}

type SuperExpression struct {
	Type string `json:"type" default:"SuperExpression"`

	ASTNode
	Meta `json:"_meta"`
}

type ThisExpression struct {
	Type string `json:"type" default:"ThisExpression"`

	ASTNode
	Meta `json:"_meta"`
}

type MemberAccess struct {
	Type     string     `json:"type" default:"MemberAccess"`
	Object   Expression `json:"object"`
	Property Expression `json:"property"`
	Computed bool       `json:"computed"`
	ASTNode
	Meta `json:"_meta"`
}

type SliceExpression struct {
	Type  string      `json:"type" default:"SliceExpression"`
	Start Instruction `json:"start"`
	End   Instruction `json:"end"`
	Step  Instruction `json:"step"`
	ASTNode
	Meta `json:"_meta"`
}

type TupleExpression struct {
	Type       string  `json:"type" default:"TupleExpression"`
	Elements   []UNode `json:"elements"`
	Modifiable bool    `json:"modifiable"`
	ASTNode
	Meta `json:"_meta"`
}

type ObjectExpression struct {
	Type       string      `json:"type" default:"ObjectExpression"`
	Properties []UNode     `json:"properties"`
	Id         *Identifier `json:"id"`
	ASTNode
	Meta `json:"_meta"`
}

type ObjectProperty struct {
	Type  string     `json:"type" default:"ObjectProperty"`
	Key   Expression `json:"key"`
	Value Expression `json:"value"`
	ASTNode
	Meta `json:"_meta"`
}

type CallExpression struct {
	Type      string       `json:"type" default:"CallExpression"`
	Callee    Expression   `json:"callee"`
	Arguments []Expression `json:"arguments"`
	ASTNode
	Meta `json:"_meta"`
}

type NewExpression struct {
	Type      string       `json:"type" default:"NewExpression"`
	Callee    Expression   `json:"callee"`
	Arguments []Expression `json:"arguments"`
	ASTNode
	Meta `json:"_meta"`
}

type FunctionDefinition struct {
	Type       string                 `json:"type" default:"FunctionDefinition"`
	Id         Expression             `json:"id"`
	Parameters []*VariableDeclaration `json:"parameters"`
	ReturnType Type                   `json:"returnType"`
	Body       Instruction            `json:"body"`
	Modifiers  []string               `json:"modifiers"`
	ASTNode
	Meta `json:"_meta"`
}

type ClassDefinition struct {
	Type   string        `json:"type" default:"ClassDefinition"`
	Id     *Identifier   `json:"id"`
	Body   []Instruction `json:"body"`
	Supers []Expression  `json:"supers"`
	ASTNode
	Meta `json:"_meta"`
}

type VariableDeclaration struct {
	Type          string     `json:"type" default:"VariableDeclaration"`
	Id            Expression `json:"id"`
	Init          Expression `json:"init"`
	Cloned        bool       `json:"cloned"`
	VarType       Type       `json:"varType"`
	VariableParam bool       `json:"variableParam"`
	ASTNode
	Meta `json:"_meta"`
}

type DereferenceExpression struct {
	Type     string     `json:"type" default:"DereferenceExpression"`
	Argument Expression `json:"argument"`
	ASTNode
	Meta `json:"_meta"`
}

type ReferenceExpression struct {
	Type     string     `json:"type" default:"ReferenceExpression"`
	Argument Expression `json:"argument"`
	ASTNode
	Meta `json:"_meta"`
}

type ImportExpression struct {
	Type     string      `json:"type" default:"ImportExpression"`
	From     *Literal    `json:"from"`
	Local    *Identifier `json:"local"`
	Imported UNode       `json:"imported"`
	ASTNode
	Meta `json:"_meta"`
}

type SpreadElement struct {
	Type     string     `json:"type" default:"SpreadElement"`
	Argument Expression `json:"argument"`
	ASTNode
	Meta `json:"_meta"`
}

type YieldExpression struct {
	Type     string     `json:"type" default:"YieldExpression"`
	Argument Expression `json:"argument"`
	ASTNode
	Meta `json:"_meta"`
}

type PackageDeclaration struct {
	Type string     `json:"type" default:"PackageDeclaration"`
	Name Expression `json:"name"`
	ASTNode
	Meta `json:"_meta"`
}

type PrimitiveType struct {
	Type          string      `json:"type" default:"PrimitiveType"`
	Id            *Identifier `json:"id"`
	TypeArguments []Type      `json:"typeArguments"`
	Kind          string      `json:"kind"`
	ASTNode
	Meta `json:"_meta"`
}

type ArrayType struct {
	Type          string      `json:"type" default:"ArrayType"`
	Id            *Identifier `json:"id"`
	Element       Type        `json:"element"`
	TypeArguments []Type      `json:"typeArguments"`
	Size          Expression  `json:"size"`
	ASTNode
	Meta `json:"_meta"`
}

type PointerType struct {
	Type          string      `json:"type" default:"PointerType"`
	Id            *Identifier `json:"id"`
	Element       Type        `json:"element"`
	TypeArguments []Type      `json:"typeArguments"`
	Kind          string      `json:"kind"`
	ASTNode
	Meta `json:"_meta"`
}

type MapType struct {
	Type          string      `json:"type" default:"MapType"`
	Id            *Identifier `json:"id"`
	KeyType       Type        `json:"keyType"`
	ValueType     Type        `json:"valueType"`
	TypeArguments []Type      `json:"typeArguments"`
	ASTNode
	Meta `json:"_meta"`
}

type ScopedType struct {
	Type          string      `json:"type" default:"ScopedType"`
	Id            *Identifier `json:"id"`
	Scope         Type        `json:"scope"`
	TypeArguments []Type      `json:"typeArguments"`
	ASTNode
	Meta `json:"_meta"`
}

type TupleType struct {
	Type          string      `json:"type" default:"TupleType"`
	Id            *Identifier `json:"id"`
	Elements      []Type      `json:"elements"`
	TypeArguments []Type      `json:"typeArguments"`
	ASTNode
	Meta `json:"_meta"`
}

type ChanType struct {
	Type      string      `json:"type" default:"ChanType"`
	Id        *Identifier `json:"id"`
	Dir       string      `json:"dir"`
	ValueType Type        `json:"valueType"`
	ASTNode
	Meta `json:"_meta"`
}

type FuncType struct {
	Type       string      `json:"type" default:"FuncType"`
	Id         *Identifier `json:"id"`
	TypeParams []Type      `json:"typeParams"`
	Params     []Type      `json:"params"`
	Results    []Type      `json:"results"`
	ASTNode
	Meta `json:"_meta"`
}

type DynamicType struct {
	Type          string      `json:"type" default:"DynamicType"`
	Id            *Identifier `json:"id"`
	TypeArguments []Type      `json:"typeArguments"`
	ASTNode
	Meta `json:"_meta"`
}

type VoidType struct {
	Type          string      `json:"type" default:"VoidType"`
	Id            *Identifier `json:"id"`
	TypeArguments []Type      `json:"typeArguments"`
	ASTNode
	Meta `json:"_meta"`
}

type Standardized interface{ UNode }
type Instruction interface{ UNode }
type Expression interface{ UNode }
type Statement interface{ UNode }
type LVal interface{ UNode }
type Type interface{ UNode }
type Conditional interface{ UNode }
type Loop interface{ UNode }
type Scopable interface{ UNode }
type Declaration interface{ UNode }
