forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			1041 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			1041 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | /* | ||
|  |  * Copyright (C)2005-2019 Haxe Foundation | ||
|  |  * | ||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a | ||
|  |  * copy of this software and associated documentation files (the "Software"), | ||
|  |  * to deal in the Software without restriction, including without limitation | ||
|  |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
|  |  * and/or sell copies of the Software, and to permit persons to whom the | ||
|  |  * Software is furnished to do so, subject to the following conditions: | ||
|  |  * | ||
|  |  * The above copyright notice and this permission notice shall be included in | ||
|  |  * all copies or substantial portions of the Software. | ||
|  |  * | ||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
|  |  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
|  |  * DEALINGS IN THE SOFTWARE. | ||
|  |  */ | ||
|  | 
 | ||
|  | package haxe.macro; | ||
|  | 
 | ||
|  | #if (macro && !doc_gen) | ||
|  | @:coreType abstract Position {} | ||
|  | #else | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a position in a file. | ||
|  | **/ | ||
|  | typedef Position = { | ||
|  | 	/** | ||
|  | 		Reference to the filename. | ||
|  | 	**/ | ||
|  | 	var file:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Position of the first character. | ||
|  | 	**/ | ||
|  | 	var min:Int; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Position of the last character. | ||
|  | 	**/ | ||
|  | 	var max:Int; | ||
|  | } | ||
|  | #end | ||
|  | 
 | ||
|  | enum StringLiteralKind { | ||
|  | 	DoubleQuotes; | ||
|  | 	SingleQuotes; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a constant. | ||
|  | 	@see https://haxe.org/manual/expression-constants.html | ||
|  | **/ | ||
|  | enum Constant { | ||
|  | 	/** | ||
|  | 		Represents an integer literal. | ||
|  | 	**/ | ||
|  | 	CInt(v:String); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a float literal. | ||
|  | 	**/ | ||
|  | 	CFloat(f:String); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a string literal. | ||
|  | 	**/ | ||
|  | 	CString(s:String, ?kind:StringLiteralKind); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents an identifier. | ||
|  | 	**/ | ||
|  | 	CIdent(s:String); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a regular expression literal. | ||
|  | 
 | ||
|  | 		Example: `~/haxe/i` | ||
|  | 
 | ||
|  | 		- The first argument `haxe` is a string with regular expression pattern. | ||
|  | 		- The second argument `i` is a string with regular expression flags. | ||
|  | 
 | ||
|  | 		@see https://haxe.org/manual/std-regex.html | ||
|  | 	**/ | ||
|  | 	CRegexp(r:String, opt:String); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	A binary operator. | ||
|  | 	@see https://haxe.org/manual/types-numeric-operators.html | ||
|  | **/ | ||
|  | enum Binop { | ||
|  | 	/** | ||
|  | 		`+` | ||
|  | 	**/ | ||
|  | 	OpAdd; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`*` | ||
|  | 	**/ | ||
|  | 	OpMult; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`/` | ||
|  | 	**/ | ||
|  | 	OpDiv; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`-` | ||
|  | 	**/ | ||
|  | 	OpSub; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`=` | ||
|  | 	**/ | ||
|  | 	OpAssign; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`==` | ||
|  | 	**/ | ||
|  | 	OpEq; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`!=` | ||
|  | 	**/ | ||
|  | 	OpNotEq; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`>` | ||
|  | 	**/ | ||
|  | 	OpGt; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`>=` | ||
|  | 	**/ | ||
|  | 	OpGte; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`<` | ||
|  | 	**/ | ||
|  | 	OpLt; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`<=` | ||
|  | 	**/ | ||
|  | 	OpLte; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`&` | ||
|  | 	**/ | ||
|  | 	OpAnd; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`|` | ||
|  | 	**/ | ||
|  | 	OpOr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`^` | ||
|  | 	**/ | ||
|  | 	OpXor; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`&&` | ||
|  | 	**/ | ||
|  | 	OpBoolAnd; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`||` | ||
|  | 	**/ | ||
|  | 	OpBoolOr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`<<` | ||
|  | 	**/ | ||
|  | 	OpShl; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`>>` | ||
|  | 	**/ | ||
|  | 	OpShr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`>>>` | ||
|  | 	**/ | ||
|  | 	OpUShr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`%` | ||
|  | 	**/ | ||
|  | 	OpMod; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`+=` `-=` `/=` `*=` `<<=` `>>=` `>>>=` `|=` `&=` `^=` `%=` | ||
|  | 	**/ | ||
|  | 	OpAssignOp(op:Binop); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`...` | ||
|  | 	**/ | ||
|  | 	OpInterval; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`=>` | ||
|  | 	**/ | ||
|  | 	OpArrow; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`in` | ||
|  | 	**/ | ||
|  | 	OpIn; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	A unary operator. | ||
|  | 	@see https://haxe.org/manual/types-numeric-operators.html | ||
|  | **/ | ||
|  | enum Unop { | ||
|  | 	/** | ||
|  | 		`++` | ||
|  | 	**/ | ||
|  | 	OpIncrement; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`--` | ||
|  | 	**/ | ||
|  | 	OpDecrement; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`!` | ||
|  | 	**/ | ||
|  | 	OpNot; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`-` | ||
|  | 	**/ | ||
|  | 	OpNeg; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`~` | ||
|  | 	**/ | ||
|  | 	OpNegBits; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		`...` | ||
|  | 	**/ | ||
|  | 	OpSpread; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a node in the AST. | ||
|  | 	@see https://haxe.org/manual/macro-reification-expression.html | ||
|  | **/ | ||
|  | typedef Expr = { | ||
|  | 	/** | ||
|  | 		The expression kind. | ||
|  | 	**/ | ||
|  | 	var expr:ExprDef; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The position of the expression. | ||
|  | 	**/ | ||
|  | 	var pos:Position; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a AST node identical to `Expr`, but it allows constraining the | ||
|  | 	type of accepted expressions. | ||
|  | 	@see https://haxe.org/manual/macro-ExprOf.html | ||
|  | **/ | ||
|  | typedef ExprOf<T> = Expr; | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a switch case. | ||
|  | 	@see https://haxe.org/manual/expression-switch.html | ||
|  | **/ | ||
|  | typedef Case = { | ||
|  | 	/** | ||
|  | 		The value expressions of the case. | ||
|  | 	**/ | ||
|  | 	var values:Array<Expr>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional guard expressions of the case, if available. | ||
|  | 	**/ | ||
|  | 	var ?guard:Expr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The expression of the case, if available. | ||
|  | 	**/ | ||
|  | 	var ?expr:Expr; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a variable in the AST. | ||
|  | 	@see https://haxe.org/manual/expression-var.html | ||
|  | **/ | ||
|  | typedef Var = { | ||
|  | 	/** | ||
|  | 		The name of the variable. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The type-hint of the variable, if available. | ||
|  | 	**/ | ||
|  | 	var ?type:ComplexType; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The expression of the variable, if available. | ||
|  | 	**/ | ||
|  | 	var ?expr:Expr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Whether or not the variable can be assigned to. | ||
|  | 	**/ | ||
|  | 	var ?isFinal:Bool; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Metadata associatied with the variable, if available. | ||
|  | 	**/ | ||
|  | 	var ?meta:Metadata; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a catch in the AST. | ||
|  | 	@see https://haxe.org/manual/expression-try-catch.html | ||
|  | **/ | ||
|  | typedef Catch = { | ||
|  | 	/** | ||
|  | 		The name of the catch variable. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The type of the catch. | ||
|  | 	**/ | ||
|  | 	var ?type:ComplexType; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The expression of the catch. | ||
|  | 	**/ | ||
|  | 	var expr:Expr; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents the way something is quoted. | ||
|  | **/ | ||
|  | enum QuoteStatus { | ||
|  | 	/** | ||
|  | 		No quotes | ||
|  | 	**/ | ||
|  | 	Unquoted; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Double quotes `"`
 | ||
|  | 	**/ | ||
|  | 	Quoted; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents the field of an object declaration. | ||
|  | **/ | ||
|  | typedef ObjectField = { | ||
|  | 	/** | ||
|  | 		The name of the field. | ||
|  | 	**/ | ||
|  | 	var field:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The field expression. | ||
|  | 	**/ | ||
|  | 	var expr:Expr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		How the field name is quoted. | ||
|  | 	**/ | ||
|  | 	var ?quotes:QuoteStatus; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents function kind in the AST | ||
|  | **/ | ||
|  | enum FunctionKind { | ||
|  | 	/** | ||
|  | 		Anonymous function | ||
|  | 	**/ | ||
|  | 	FAnonymous; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Named function | ||
|  | 	**/ | ||
|  | 	FNamed(name:String, ?inlined:Bool); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Arrow function | ||
|  | 	**/ | ||
|  | 	FArrow; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents the kind of a node in the AST. | ||
|  | **/ | ||
|  | enum ExprDef { | ||
|  | 	/** | ||
|  | 		A constant. | ||
|  | 	**/ | ||
|  | 	EConst(c:Constant); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Array access `e1[e2]`. | ||
|  | 	**/ | ||
|  | 	EArray(e1:Expr, e2:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Binary operator `e1 op e2`. | ||
|  | 	**/ | ||
|  | 	EBinop(op:Binop, e1:Expr, e2:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Field access on `e.field`. | ||
|  | 	**/ | ||
|  | 	EField(e:Expr, field:String); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Parentheses `(e)`. | ||
|  | 	**/ | ||
|  | 	EParenthesis(e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An object declaration. | ||
|  | 	**/ | ||
|  | 	EObjectDecl(fields:Array<ObjectField>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An array declaration `[el]`. | ||
|  | 	**/ | ||
|  | 	EArrayDecl(values:Array<Expr>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A call `e(params)`. | ||
|  | 	**/ | ||
|  | 	ECall(e:Expr, params:Array<Expr>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A constructor call `new t(params)`. | ||
|  | 	**/ | ||
|  | 	ENew(t:TypePath, params:Array<Expr>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An unary operator `op` on `e`: | ||
|  | 
 | ||
|  | 		- `e++` (`op = OpIncrement, postFix = true`) | ||
|  | 		- `e--` (`op = OpDecrement, postFix = true`) | ||
|  | 		- `++e` (`op = OpIncrement, postFix = false`) | ||
|  | 		- `--e` (`op = OpDecrement, postFix = false`) | ||
|  | 		- `-e` (`op = OpNeg, postFix = false`) | ||
|  | 		- `!e` (`op = OpNot, postFix = false`) | ||
|  | 		- `~e` (`op = OpNegBits, postFix = false`) | ||
|  | 	**/ | ||
|  | 	EUnop(op:Unop, postFix:Bool, e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Variable declarations. | ||
|  | 	**/ | ||
|  | 	EVars(vars:Array<Var>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A function declaration. | ||
|  | 	**/ | ||
|  | 	EFunction(kind:Null<FunctionKind>, f:Function); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A block of expressions `{exprs}`. | ||
|  | 	**/ | ||
|  | 	EBlock(exprs:Array<Expr>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `for` expression. | ||
|  | 	**/ | ||
|  | 	EFor(it:Expr, expr:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An `if (econd) eif` or `if (econd) eif else eelse` expression. | ||
|  | 	**/ | ||
|  | 	EIf(econd:Expr, eif:Expr, eelse:Null<Expr>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a `while` expression. | ||
|  | 
 | ||
|  | 		When `normalWhile` is `true` it is `while (...)`. | ||
|  | 
 | ||
|  | 		When `normalWhile` is `false` it is `do {...} while (...)`. | ||
|  | 	**/ | ||
|  | 	EWhile(econd:Expr, e:Expr, normalWhile:Bool); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a `switch` expression with related cases and an optional. | ||
|  | 		`default` case if `edef != null`. | ||
|  | 	**/ | ||
|  | 	ESwitch(e:Expr, cases:Array<Case>, edef:Null<Expr>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a `try`-expression with related catches. | ||
|  | 	**/ | ||
|  | 	ETry(e:Expr, catches:Array<Catch>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `return` or `return e` expression. | ||
|  | 	**/ | ||
|  | 	EReturn(?e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `break` expression. | ||
|  | 	**/ | ||
|  | 	EBreak; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `continue` expression. | ||
|  | 	**/ | ||
|  | 	EContinue; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An `untyped e` source code. | ||
|  | 	**/ | ||
|  | 	EUntyped(e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `throw e` expression. | ||
|  | 	**/ | ||
|  | 	EThrow(e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `cast e` or `cast (e, m)` expression. | ||
|  | 	**/ | ||
|  | 	ECast(e:Expr, t:Null<ComplexType>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Used internally to provide completion. | ||
|  | 	**/ | ||
|  | 	EDisplay(e:Expr, displayKind:DisplayKind); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Used internally to provide completion. | ||
|  | 	**/ | ||
|  | 	EDisplayNew(t:TypePath); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `(econd) ? eif : eelse` expression. | ||
|  | 	**/ | ||
|  | 	ETernary(econd:Expr, eif:Expr, eelse:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `(e:t)` expression. | ||
|  | 	**/ | ||
|  | 	ECheckType(e:Expr, t:ComplexType); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		A `@m e` expression. | ||
|  | 	**/ | ||
|  | 	EMeta(s:MetadataEntry, e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An `expr is Type` expression. | ||
|  | 	**/ | ||
|  | 	EIs(e:Expr, t:ComplexType); | ||
|  | } | ||
|  | 
 | ||
|  | enum DisplayKind { | ||
|  | 	DKCall; | ||
|  | 	DKDot; | ||
|  | 	DKStructure; | ||
|  | 	DKMarked; | ||
|  | 	DKPattern(outermost:Bool); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a type syntax in the AST. | ||
|  | **/ | ||
|  | enum ComplexType { | ||
|  | 	/** | ||
|  | 		Represents the type path. | ||
|  | 	**/ | ||
|  | 	TPath(p:TypePath); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a function type. | ||
|  | 		@see https://haxe.org/manual/types-function.html | ||
|  | 	**/ | ||
|  | 	TFunction(args:Array<ComplexType>, ret:ComplexType); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents an anonymous structure type. | ||
|  | 		@see https://haxe.org/manual/types-anonymous-structure.html | ||
|  | 	**/ | ||
|  | 	TAnonymous(fields:Array<Field>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents parentheses around a type, e.g. the `(Int -> Void)` part in | ||
|  | 		`(Int -> Void) -> String`. | ||
|  | 	**/ | ||
|  | 	TParent(t:ComplexType); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents typedef extensions `> Iterable<T>`. | ||
|  | 		The array `p` holds the type paths to the given types. | ||
|  | 		@see https://haxe.org/manual/type-system-extensions.html | ||
|  | 	**/ | ||
|  | 	TExtend(p:Array<TypePath>, fields:Array<Field>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents an optional type. | ||
|  | 	**/ | ||
|  | 	TOptional(t:ComplexType); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a type with a name. | ||
|  | 	**/ | ||
|  | 	TNamed(n:String, t:ComplexType); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents an intersection type `T1 & T2 & ... & TN`. | ||
|  | 	**/ | ||
|  | 	TIntersection(tl:Array<ComplexType>); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a type path in the AST. | ||
|  | **/ | ||
|  | typedef TypePath = { | ||
|  | 	/** | ||
|  | 		Represents the package of the type path. | ||
|  | 	**/ | ||
|  | 	var pack:Array<String>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The name of the type path. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Optional parameters of the type path. | ||
|  | 	**/ | ||
|  | 	var ?params:Array<TypeParam>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Sub is set on module sub-type access: | ||
|  | 		`pack.Module.Type` has `name = "Module"`, `sub = "Type"`, if available. | ||
|  | 	**/ | ||
|  | 	var ?sub:String; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a concrete type parameter in the AST. | ||
|  | 
 | ||
|  | 	Haxe allows expressions in concrete type parameters, e.g. | ||
|  | 	`new YourType<["hello", "world"]>`. In that case the value is `TPExpr` while | ||
|  | 	in the normal case it's `TPType`.
 | ||
|  | **/ | ||
|  | enum TypeParam { | ||
|  | 	TPType(t:ComplexType); | ||
|  | 	TPExpr(e:Expr); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a type parameter declaration in the AST. | ||
|  | **/ | ||
|  | typedef TypeParamDecl = { | ||
|  | 	/** | ||
|  | 		The name of the type parameter. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional constraints of the type parameter. | ||
|  | 	**/ | ||
|  | 	var ?constraints:Array<ComplexType>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional parameters of the type parameter. | ||
|  | 	**/ | ||
|  | 	var ?params:Array<TypeParamDecl>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The metadata of the type parameter. | ||
|  | 	**/ | ||
|  | 	var ?meta:Metadata; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a function in the AST. | ||
|  | **/ | ||
|  | typedef Function = { | ||
|  | 	/** | ||
|  | 		A list of function arguments. | ||
|  | 	**/ | ||
|  | 	var args:Array<FunctionArg>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The return type-hint of the function, if available. | ||
|  | 	**/ | ||
|  | 	var ?ret:ComplexType; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The expression of the function body, if available. | ||
|  | 	**/ | ||
|  | 	var ?expr:Expr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		An optional list of function parameter type declarations. | ||
|  | 	**/ | ||
|  | 	var ?params:Array<TypeParamDecl>; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a function argument in the AST. | ||
|  | **/ | ||
|  | typedef FunctionArg = { | ||
|  | 	/** | ||
|  | 		The name of the function argument. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Whether or not the function argument is optional. | ||
|  | 	**/ | ||
|  | 	var ?opt:Bool; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The type-hint of the function argument, if available. | ||
|  | 	**/ | ||
|  | 	var ?type:ComplexType; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional value of the function argument, if available. | ||
|  | 	**/ | ||
|  | 	var ?value:Expr; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The metadata of the function argument. | ||
|  | 	**/ | ||
|  | 	var ?meta:Metadata; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a metadata entry in the AST. | ||
|  | **/ | ||
|  | typedef MetadataEntry = { | ||
|  | 	/** | ||
|  | 		The name of the metadata entry. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional parameters of the metadata entry. | ||
|  | 	**/ | ||
|  | 	var ?params:Array<Expr>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The position of the metadata entry. | ||
|  | 	**/ | ||
|  | 	var pos:Position; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents metadata in the AST. | ||
|  | **/ | ||
|  | typedef Metadata = Array<MetadataEntry>; | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a field in the AST. | ||
|  | **/ | ||
|  | typedef Field = { | ||
|  | 	/** | ||
|  | 		The name of the field. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The documentation of the field, if available. If the field has no | ||
|  | 		documentation, the value is `null`. | ||
|  | 	**/ | ||
|  | 	var ?doc:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The access modifiers of the field. By default fields have private access. | ||
|  | 		@see https://haxe.org/manual/class-field-access-modifier.html | ||
|  | 	**/ | ||
|  | 	var ?access:Array<Access>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The kind of the field. | ||
|  | 	**/ | ||
|  | 	var kind:FieldType; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The position of the field. | ||
|  | 	**/ | ||
|  | 	var pos:Position; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional metadata of the field. | ||
|  | 	**/ | ||
|  | 	var ?meta:Metadata; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents an access modifier. | ||
|  | 	@see https://haxe.org/manual/class-field-access-modifier.html | ||
|  | **/ | ||
|  | enum Access { | ||
|  | 	/** | ||
|  | 		Public access modifier, grants access from anywhere. | ||
|  | 		@see https://haxe.org/manual/class-field-visibility.html | ||
|  | 	**/ | ||
|  | 	APublic; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Private access modifier, grants access to class and its sub-classes | ||
|  | 		only. | ||
|  | 		@see https://haxe.org/manual/class-field-visibility.html | ||
|  | 	**/ | ||
|  | 	APrivate; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Static access modifier. | ||
|  | 	**/ | ||
|  | 	AStatic; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Override access modifier. | ||
|  | 		@see https://haxe.org/manual/class-field-override.html | ||
|  | 	**/ | ||
|  | 	AOverride; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Dynamic (re-)bindable access modifier. | ||
|  | 		@see https://haxe.org/manual/class-field-dynamic.html | ||
|  | 	**/ | ||
|  | 	ADynamic; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Inline access modifier. Allows expressions to be directly inserted in | ||
|  | 		place of calls to them. | ||
|  | 		@see https://haxe.org/manual/class-field-inline.html | ||
|  | 	**/ | ||
|  | 	AInline; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Macro access modifier. Allows expression macro functions. These are | ||
|  | 		normal functions which are executed as soon as they are typed. | ||
|  | 	**/ | ||
|  | 	AMacro; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Final access modifier. For functions, they can not be overridden. For | ||
|  | 		variables, it means they can be assigned to only once. | ||
|  | 	**/ | ||
|  | 	AFinal; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Extern access modifier. | ||
|  | 	**/ | ||
|  | 	AExtern; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Abstract access modifier. | ||
|  | 	**/ | ||
|  | 	AAbstract; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Overload access modifier. | ||
|  | 	**/ | ||
|  | 	AOverload; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents the field type in the AST. | ||
|  | **/ | ||
|  | enum FieldType { | ||
|  | 	/** | ||
|  | 		Represents a variable field type. | ||
|  | 	**/ | ||
|  | 	FVar(t:Null<ComplexType>, ?e:Expr); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a function field type. | ||
|  | 	**/ | ||
|  | 	FFun(f:Function); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a property with getter and setter field type. | ||
|  | 	**/ | ||
|  | 	FProp(get:String, set:String, ?t:ComplexType, ?e:Expr); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a type definition. | ||
|  | **/ | ||
|  | typedef TypeDefinition = { | ||
|  | 	/** | ||
|  | 		The package of the type definition. | ||
|  | 	**/ | ||
|  | 	var pack:Array<String>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The name of the type definition. | ||
|  | 	**/ | ||
|  | 	var name:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The documentation of the type, if available. If the type has no | ||
|  | 		documentation, the value is `null`. | ||
|  | 	**/ | ||
|  | 	var ?doc:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The position to the type definition. | ||
|  | 	**/ | ||
|  | 	var pos:Position; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The optional metadata of the type definition. | ||
|  | 	**/ | ||
|  | 	var ?meta:Metadata; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The parameter type declarations of the type definition. | ||
|  | 	**/ | ||
|  | 	var ?params:Array<TypeParamDecl>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Whether or not the type is extern. | ||
|  | 	**/ | ||
|  | 	var ?isExtern:Bool; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The kind of the type definition. | ||
|  | 	**/ | ||
|  | 	var kind:TypeDefKind; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The fields of the type definition. | ||
|  | 	**/ | ||
|  | 	var fields:Array<Field>; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents a type definition kind. | ||
|  | **/ | ||
|  | enum TypeDefKind { | ||
|  | 	/** | ||
|  | 		Represents an enum kind. | ||
|  | 	**/ | ||
|  | 	TDEnum; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a structure kind. | ||
|  | 	**/ | ||
|  | 	TDStructure; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a class kind. | ||
|  | 	**/ | ||
|  | 	TDClass(?superClass:TypePath, ?interfaces:Array<TypePath>, ?isInterface:Bool, ?isFinal:Bool, ?isAbstract:Bool); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents an alias/typedef kind. | ||
|  | 	**/ | ||
|  | 	TDAlias(t:ComplexType); // ignore TypeDefinition.fields | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents an abstract kind. | ||
|  | 	**/ | ||
|  | 	TDAbstract(tthis:Null<ComplexType>, ?from:Array<ComplexType>, ?to:Array<ComplexType>); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents a module-level field. | ||
|  | 	**/ | ||
|  | 	TDField(kind:FieldType, ?access:Array<Access>); // ignore TypeDefinition.fields | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	This error can be used to handle or produce compilation errors in macros. | ||
|  | **/ | ||
|  | class Error extends Exception { | ||
|  | 	/** | ||
|  | 		The position of the error. | ||
|  | 	**/ | ||
|  | 	public var pos:Position; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Instantiates an error with given message and position. | ||
|  | 	**/ | ||
|  | 	public function new(message:String, pos:Position, ?previous:Exception) { | ||
|  | 		super(message, previous); | ||
|  | 		this.pos = pos; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents the import mode. | ||
|  | 	@see https://haxe.org/manual/type-system-import.html | ||
|  | **/ | ||
|  | enum ImportMode { | ||
|  | 	/** | ||
|  | 		Represents a default import `import c`. | ||
|  | 	**/ | ||
|  | 	INormal; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents the alias import `import c as alias`. | ||
|  | 	**/ | ||
|  | 	IAsName(alias:String); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Represents the wildcard import `import *`. | ||
|  | 	**/ | ||
|  | 	IAll; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Represents the import expression. | ||
|  | **/ | ||
|  | typedef ImportExpr = { | ||
|  | 	/** | ||
|  | 		The path to the import expression. | ||
|  | 	**/ | ||
|  | 	var path:Array<{pos:Position, name:String}>; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The mode of the import expression. | ||
|  | 	**/ | ||
|  | 	var mode:ImportMode; | ||
|  | } |