646 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			646 lines
		
	
	
		
			19 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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import haxe.macro.Expr;
							 | 
						||
| 
								 | 
							
								import haxe.macro.Type.TypedExpr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum Message {
							 | 
						||
| 
								 | 
							
									Info(msg:String, pos:Position);
							 | 
						||
| 
								 | 
							
									Warning(msg:String, pos:Position);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									Context provides an API for macro programming.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									It contains common functions that interact with the macro interpreter to
							 | 
						||
| 
								 | 
							
									query or set information. Other API functions are available in the tools
							 | 
						||
| 
								 | 
							
									classes:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									- `haxe.macro.ComplexTypeTools`
							 | 
						||
| 
								 | 
							
									- `haxe.macro.ExprTools`
							 | 
						||
| 
								 | 
							
									- `haxe.macro.TypeTools`
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								class Context {
							 | 
						||
| 
								 | 
							
									#if (neko || eval || display)
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Displays a compilation error `msg` at the given `Position` `pos`
							 | 
						||
| 
								 | 
							
										and aborts the current macro call.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function error(msg:String, pos:Position):Dynamic {
							 | 
						||
| 
								 | 
							
										return load("error", 2)(msg, pos);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Displays a compilation error `msg` at the given `Position` `pos`
							 | 
						||
| 
								 | 
							
										and aborts the compilation.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function fatalError(msg:String, pos:Position):Dynamic {
							 | 
						||
| 
								 | 
							
										return load("fatal_error", 2)(msg, pos);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Displays a compilation warning `msg` at the given `Position` `pos`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function warning(msg:String, pos:Position) {
							 | 
						||
| 
								 | 
							
										load("warning", 2)(msg, pos);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Displays a compilation info `msg` at the given `Position` `pos`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function info(msg:String, pos:Position) {
							 | 
						||
| 
								 | 
							
										load("info", 2)(msg, pos);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Gets a list of all current compilation info/warning messages.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getMessages() : Array<Message> {
							 | 
						||
| 
								 | 
							
										return load("get_messages",0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Filters all current info/warning messages. Filtered out messages will
							 | 
						||
| 
								 | 
							
										not be displayed by the compiler.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function filterMessages( predicate : Message -> Bool ) {
							 | 
						||
| 
								 | 
							
										load("filter_messages",1)(predicate);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Resolves a file name `file` based on the current class paths.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The resolution follows the usual class path rules where the last
							 | 
						||
| 
								 | 
							
										declared class path has priority.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If a class path was declared relative, this method returns the relative
							 | 
						||
| 
								 | 
							
										file path. Otherwise it returns the absolute file path.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function resolvePath(file:String):String {
							 | 
						||
| 
								 | 
							
										return load("resolve_path", 1)(file);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns an `Array` of current class paths in the order of their
							 | 
						||
| 
								 | 
							
										declaration.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Modifying the returned array has no effect on the compiler. Class paths
							 | 
						||
| 
								 | 
							
										can be added using `haxe.macro.Compiler.addClassPath`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getClassPath():Array<String> {
							 | 
						||
| 
								 | 
							
										return load("class_path", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Check if current display position is within `pos`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function containsDisplayPosition(pos:Position):Bool {
							 | 
						||
| 
								 | 
							
										return load("contains_display_position", 1)(pos);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the position at which the macro was called.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function currentPos():Position {
							 | 
						||
| 
								 | 
							
										return load("current_pos", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the type which is expected at the place the macro is called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This affects usages such as `var x:Int = macroCall()`, where the
							 | 
						||
| 
								 | 
							
										expected type will be reported as `Int`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Might return `null` if no specific type is expected or if the calling
							 | 
						||
| 
								 | 
							
										macro is not an expression-macro.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getExpectedType():Null<Type> {
							 | 
						||
| 
								 | 
							
										return load("get_expected_type", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the call arguments that lead to the invocation of the current
							 | 
						||
| 
								 | 
							
										`@:genericBuild` macro, if available.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Returns `null` if the current macro is not a `@:genericBuild` macro.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getCallArguments():Null<Array<Expr>> {
							 | 
						||
| 
								 | 
							
										return load("get_call_arguments", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the current class in which the macro was called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If no such class exists, `null` is returned.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalClass():Null<Type.Ref<Type.ClassType>> {
							 | 
						||
| 
								 | 
							
										var l:Type = load("get_local_type", 0)();
							 | 
						||
| 
								 | 
							
										if (l == null)
							 | 
						||
| 
								 | 
							
											return null;
							 | 
						||
| 
								 | 
							
										return switch (l) {
							 | 
						||
| 
								 | 
							
											case TInst(c, _): c;
							 | 
						||
| 
								 | 
							
											default: null;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the current module path in/on which the macro was called.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalModule():String {
							 | 
						||
| 
								 | 
							
										return load("get_local_module", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the current type in/on which the macro was called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If no such type exists, `null` is returned.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalType():Null<Type> {
							 | 
						||
| 
								 | 
							
										return load("get_local_type", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the name of the method from which the macro was called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If no such method exists, `null` is returned.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalMethod():Null<String> {
							 | 
						||
| 
								 | 
							
										return load("get_local_method", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns an `Array` of classes which are available for `using` usage in
							 | 
						||
| 
								 | 
							
										the context the macro was called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Modifying the returned array has no effect on the compiler.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalUsing():Array<Type.Ref<Type.ClassType>> {
							 | 
						||
| 
								 | 
							
										return load("get_local_using", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns an `Array` of all imports in the context the macro was called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Modifying the returned array has no effect on the compiler.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalImports():Array<ImportExpr> {
							 | 
						||
| 
								 | 
							
										return load("get_local_imports", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns a map of local variables accessible in the context the macro was
							 | 
						||
| 
								 | 
							
										called.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The keys of the returned map are the variable names, the values are
							 | 
						||
| 
								 | 
							
										their types.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Modifying the returned map has no effect on the compiler.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									@:deprecated("Use Context.getLocalTVars() instead")
							 | 
						||
| 
								 | 
							
									public static function getLocalVars():Map<String, Type> {
							 | 
						||
| 
								 | 
							
										return load("local_vars", 1)(false);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Similar to `getLocalVars`, but returns elements of type `TVar` instead
							 | 
						||
| 
								 | 
							
										of `Type`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getLocalTVars():Map<String, Type.TVar> {
							 | 
						||
| 
								 | 
							
										return load("local_vars", 1)(true);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Tells if the conditional compilation flag `s` has been set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Compiler flags are set using the `-D` command line parameter, or
							 | 
						||
| 
								 | 
							
										by calling `haxe.macro.Compiler.define`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@see https://haxe.org/manual/lf-condition-compilation.html
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function defined(s:String):Bool {
							 | 
						||
| 
								 | 
							
										return load("defined", 1)(s);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the value defined for the conditional compilation flag `key`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If no value is defined for `key`, `null` is returned.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Compiler flags values are set using the `-D key=value` command line
							 | 
						||
| 
								 | 
							
										parameter, or by calling `haxe.macro.Compiler.define`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The default value is `"1"`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@see https://haxe.org/manual/lf-condition-compilation.html
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function definedValue(key:String):String {
							 | 
						||
| 
								 | 
							
										return load("defined_value", 1)(key);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns a map of all conditional compilation flags that have been set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Compiler flags are set using the `-D` command line parameter, or
							 | 
						||
| 
								 | 
							
										by calling `haxe.macro.Compiler.define`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Modifying the returned map has no effect on the compiler.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@see https://haxe.org/manual/lf-condition-compilation.html
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getDefines():Map<String, String> {
							 | 
						||
| 
								 | 
							
										return load("get_defines", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Resolves a type identified by `name`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The resolution follows the usual class path rules where the last
							 | 
						||
| 
								 | 
							
										declared class path has priority.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If no type can be found, an exception of type `String` is thrown.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getType(name:String):Type {
							 | 
						||
| 
								 | 
							
										return load("get_type", 1)(name);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Resolves a module identified by `name` and returns an `Array` of all
							 | 
						||
| 
								 | 
							
										its contained types.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The resolution follows the usual class path rules where the last
							 | 
						||
| 
								 | 
							
										declared class path has priority.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If no module can be found, an exception of type `String` is thrown.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getModule(name:String):Array<Type> {
							 | 
						||
| 
								 | 
							
										return load("get_module", 1)(name);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Parses `expr` as Haxe code, returning the corresponding AST.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										String interpolation of single quote strings within `expr` is not
							 | 
						||
| 
								 | 
							
										supported.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The provided `Position` `pos` is used for all generated inner AST nodes.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function parse(expr:String, pos:Position):Expr {
							 | 
						||
| 
								 | 
							
										return load("do_parse", 3)(expr, pos, false);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Similar to `parse`, but error positions are reported within the provided
							 | 
						||
| 
								 | 
							
										String `expr`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function parseInlineString(expr:String, pos:Position):Expr {
							 | 
						||
| 
								 | 
							
										return load("do_parse", 3)(expr, pos, true);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Builds an expression from `v`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This method generates AST nodes depending on the macro-runtime value of
							 | 
						||
| 
								 | 
							
										`v`. As such, only basic types and enums are supported and the behavior
							 | 
						||
| 
								 | 
							
										for other types is undefined.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The provided `Position` `pos` is used for all generated inner AST nodes.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function makeExpr(v:Dynamic, pos:Position):Expr {
							 | 
						||
| 
								 | 
							
										return load("make_expr", 2)(v, pos);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns a hashed MD5 signature of value `v`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function signature(v:Dynamic):String {
							 | 
						||
| 
								 | 
							
										return load("signature", 1)(v);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Adds a callback function `callback` which is invoked after the
							 | 
						||
| 
								 | 
							
										compiler's typing phase, just before its generation phase.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The callback receives an `Array` containing all types which are about
							 | 
						||
| 
								 | 
							
										to be generated. Modifications are limited to metadata, it is mainly
							 | 
						||
| 
								 | 
							
										intended to obtain information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										By default, the callback is made before types are stored in the compilation
							 | 
						||
| 
								 | 
							
										server, if active. This means that any effect persists for the next compilation.
							 | 
						||
| 
								 | 
							
										If `persistent` is set to `false`, changes to types made by the callback only
							 | 
						||
| 
								 | 
							
										affect the current compilation. If no compilation server is used, this flag has
							 | 
						||
| 
								 | 
							
										no effect.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										*Note*: the callback is still invoked when generation is disabled with  `--no-output`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function onGenerate(callback:Array<Type>->Void, persistent:Bool = true) {
							 | 
						||
| 
								 | 
							
										load("on_generate", 2)(callback, persistent);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Adds a callback function `callback` which is invoked after the compiler
							 | 
						||
| 
								 | 
							
										generation phase.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Compilation has completed at this point and cannot be influenced
							 | 
						||
| 
								 | 
							
										anymore. However, contextual information is still available.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										*Note*: the callback is still invoked when generation is disabled with  `--no-output`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function onAfterGenerate(callback:Void->Void) {
							 | 
						||
| 
								 | 
							
										load("on_after_generate", 1)(callback);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Adds a callback function `callback` which is invoked after the compiler
							 | 
						||
| 
								 | 
							
										is done typing, but before optimization. The callback receives the types
							 | 
						||
| 
								 | 
							
										which have been typed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										It is possible to define new types in the callback, in which case it
							 | 
						||
| 
								 | 
							
										will be called again with the new types as argument.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function onAfterTyping(callback:Array<haxe.macro.Type.ModuleType>->Void) {
							 | 
						||
| 
								 | 
							
										load("on_after_typing", 1)(callback);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Adds a callback function `callback` which is invoked when a type name
							 | 
						||
| 
								 | 
							
										cannot be resolved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The callback may return a type definition, which is then used for the
							 | 
						||
| 
								 | 
							
										expected type. If it returns `null`, the type is considered to still not
							 | 
						||
| 
								 | 
							
										exist.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function onTypeNotFound(callback:String->TypeDefinition) {
							 | 
						||
| 
								 | 
							
										load("on_type_not_found", 1)(callback);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Types expression `e` and returns its type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Typing the expression may result in a compiler error which can be
							 | 
						||
| 
								 | 
							
										caught using `try ... catch`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function typeof(e:Expr):Type {
							 | 
						||
| 
								 | 
							
										return load("typeof", 1)(e);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Types expression `e` and returns the corresponding `TypedExpr`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Typing the expression may result in a compiler error which can be
							 | 
						||
| 
								 | 
							
										caught using `try ... catch`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function typeExpr(e:Expr):TypedExpr {
							 | 
						||
| 
								 | 
							
										return load("type_expr", 1)(e);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Resolve type `t` and returns the corresponding `Type`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Resolving the type may result in a compiler error which can be
							 | 
						||
| 
								 | 
							
										caught using `try ... catch`.
							 | 
						||
| 
								 | 
							
										Resolution is performed based on the current context in which the macro is called.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function resolveType(t:ComplexType, p:Position):Type {
							 | 
						||
| 
								 | 
							
										return load("resolve_type", 2)(t, p);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the `ComplexType` corresponding to the given `Type` `t`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										See `haxe.macro.TypeTools.toComplexType` for details.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function toComplexType(t:Type):Null<ComplexType> {
							 | 
						||
| 
								 | 
							
										return load("to_complex_type", 1)(t);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Tries to unify `t1` and `t2` and returns `true` if successful.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function unify(t1:Type, t2:Type):Bool {
							 | 
						||
| 
								 | 
							
										return load("unify", 2)(t1, t2);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Follows a type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										See `haxe.macro.TypeTools.follow` for details.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function follow(t:Type, ?once:Bool):Type {
							 | 
						||
| 
								 | 
							
										return load("follow", 2)(t, once);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Follows a type, including abstracts' underlying implementation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										See `haxe.macro.TypeTools.followWithAbstracts` for details.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function followWithAbstracts(t:Type, once:Bool = false):Type {
							 | 
						||
| 
								 | 
							
										return load("follow_with_abstracts", 2)(t, once);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns the information stored in `Position` `p`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getPosInfos(p:Position):{min:Int, max:Int, file:String} {
							 | 
						||
| 
								 | 
							
										return load("get_pos_infos", 1)(p);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Builds a `Position` from `inf`.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function makePosition(inf:{min:Int, max:Int, file:String}):Position {
							 | 
						||
| 
								 | 
							
										return load("make_position", 3)(inf.min, inf.max, inf.file);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns a map of all registered resources for this compilation unit.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Modifying the returned map has no effect on the compilation, use
							 | 
						||
| 
								 | 
							
										`haxe.macro.Context.addResource` to add new resources to the compilation unit.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getResources():Map<String, haxe.io.Bytes> {
							 | 
						||
| 
								 | 
							
										return load("get_resources", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Makes resource `data` available as `name`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The resource is then available using the `haxe.macro.Resource` API.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If a previous resource was bound to `name`, it is overwritten.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Compilation server : when using the compilation server, the resource is bound
							 | 
						||
| 
								 | 
							
										to the Haxe module which calls the macro, so it will be included again if
							 | 
						||
| 
								 | 
							
										that module is reused. If this resource concerns several modules, prefix its
							 | 
						||
| 
								 | 
							
										name with a `$` sign, this will bind it to the macro module instead.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function addResource(name:String, data:haxe.io.Bytes) {
							 | 
						||
| 
								 | 
							
										load("add_resource", 2)(name, data);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns an `Array` of fields of the class which is to be built.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This is only defined for `@:build/@:autoBuild` macros.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getBuildFields():Array<Field> {
							 | 
						||
| 
								 | 
							
										return load("get_build_fields", 0)();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Defines a new type from `TypeDefinition` `t`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If `moduleDependency` is given and is not `null`, it should contain
							 | 
						||
| 
								 | 
							
										a module path that will be used as a dependency for the newly defined module
							 | 
						||
| 
								 | 
							
										instead of the current module.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function defineType(t:TypeDefinition, ?moduleDependency:String):Void {
							 | 
						||
| 
								 | 
							
										load("define_type", 2)(t, moduleDependency);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Defines a new module as `modulePath` with several `TypeDefinition`
							 | 
						||
| 
								 | 
							
										`types`. This is analogous to defining a .hx file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The individual `types` can reference each other and any identifier
							 | 
						||
| 
								 | 
							
										respects the `imports` and `usings` as usual, expect that imports are
							 | 
						||
| 
								 | 
							
										not allowed to have `.*` wildcards or `as s` shorthands.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function defineModule(modulePath:String, types:Array<TypeDefinition>, ?imports:Array<ImportExpr>, ?usings:Array<TypePath>):Void {
							 | 
						||
| 
								 | 
							
										if (imports == null)
							 | 
						||
| 
								 | 
							
											imports = [];
							 | 
						||
| 
								 | 
							
										if (usings == null)
							 | 
						||
| 
								 | 
							
											usings = [];
							 | 
						||
| 
								 | 
							
										load("define_module", 4)(modulePath, types, imports, usings);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Returns a syntax-level expression corresponding to typed expression `t`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This process may lose some information.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function getTypedExpr(t:Type.TypedExpr):Expr {
							 | 
						||
| 
								 | 
							
										return load("get_typed_expr", 1)(t);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Store typed expression `t` internally and give a syntax-level expression
							 | 
						||
| 
								 | 
							
										that can be returned from a macro and will be replaced by the stored
							 | 
						||
| 
								 | 
							
										typed expression.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If `t` is `null` or invalid, an exception is thrown.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										NOTE: the returned value references an internally stored typed expression
							 | 
						||
| 
								 | 
							
										that is reset between compilations, so care should be taken when storing
							 | 
						||
| 
								 | 
							
										the expression returned by this method in a static variable and using the
							 | 
						||
| 
								 | 
							
										compilation server.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function storeTypedExpr(t:Type.TypedExpr):Expr {
							 | 
						||
| 
								 | 
							
										return load("store_typed_expr", 1)(t);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Types expression `e`, stores the resulting typed expression internally and
							 | 
						||
| 
								 | 
							
										returns a syntax-level expression that can be returned from a macro and
							 | 
						||
| 
								 | 
							
										will be replaced by the stored typed expression.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										If `e` is `null` or invalid, an exception is thrown.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										A call to `storeExpr(e)` is equivalent to `storeTypedExpr(typeExpr(e))` without
							 | 
						||
| 
								 | 
							
										the overhead of encoding and decoding between regular and macro runtime.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										NOTE: the returned value references an internally stored typed expression
							 | 
						||
| 
								 | 
							
										that is reset between compilations, so care should be taken when storing
							 | 
						||
| 
								 | 
							
										the expression returned by this method in a static variable and using the
							 | 
						||
| 
								 | 
							
										compilation server.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function storeExpr(e:Expr):Expr {
							 | 
						||
| 
								 | 
							
										return load("store_expr", 1)(e);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Manually adds a dependency between module `modulePath` and an external
							 | 
						||
| 
								 | 
							
										file `externFile`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This affects the compilation cache, causing the module to be typed if
							 | 
						||
| 
								 | 
							
										`externFile` has changed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Has no effect if the compilation cache is not used.
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function registerModuleDependency(modulePath:String, externFile:String) {
							 | 
						||
| 
								 | 
							
										load("register_module_dependency", 2)(modulePath, externFile);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
										Creates a timer which will be printed in the compilation report
							 | 
						||
| 
								 | 
							
										if `--times` compilation argument is set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Note that a timer may be omitted from the report if the amount of time
							 | 
						||
| 
								 | 
							
										measured is too small.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This method immediately starts a timer and returns a function to stop it:
							 | 
						||
| 
								 | 
							
										```
							 | 
						||
| 
								 | 
							
										var stopTimer = haxe.macro.Context.timer("my heavy task");
							 | 
						||
| 
								 | 
							
										runTask();
							 | 
						||
| 
								 | 
							
										stopTimer();
							 | 
						||
| 
								 | 
							
										```
							 | 
						||
| 
								 | 
							
									**/
							 | 
						||
| 
								 | 
							
									public static function timer(id:String):()->Void {
							 | 
						||
| 
								 | 
							
										return load("timer", 1)(id);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:deprecated
							 | 
						||
| 
								 | 
							
									public static function registerModuleReuseCall(modulePath:String, macroCall:String) {
							 | 
						||
| 
								 | 
							
										throw "This method is no longer supported. See https://github.com/HaxeFoundation/haxe/issues/5746";
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:deprecated
							 | 
						||
| 
								 | 
							
									public static function onMacroContextReused(callb:Void->Bool) {
							 | 
						||
| 
								 | 
							
										throw "This method is no longer supported. See https://github.com/HaxeFoundation/haxe/issues/5746";
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:allow(haxe.macro.TypeTools)
							 | 
						||
| 
								 | 
							
									@:allow(haxe.macro.MacroStringTools)
							 | 
						||
| 
								 | 
							
									@:allow(haxe.macro.TypedExprTools)
							 | 
						||
| 
								 | 
							
									@:allow(haxe.macro.PositionTools)
							 | 
						||
| 
								 | 
							
									static function load(f:String, nargs:Int):Dynamic {
							 | 
						||
| 
								 | 
							
										#if neko
							 | 
						||
| 
								 | 
							
										return neko.Lib.load("macro", f, nargs);
							 | 
						||
| 
								 | 
							
										#elseif eval
							 | 
						||
| 
								 | 
							
										return eval.vm.Context.callMacroApi(f);
							 | 
						||
| 
								 | 
							
										#else
							 | 
						||
| 
								 | 
							
										return Reflect.makeVarArgs(function(_) return throw "Can't be called outside of macro");
							 | 
						||
| 
								 | 
							
										#end
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private static function includeFile(file:String, position:String) {
							 | 
						||
| 
								 | 
							
										load("include_file", 2)(file, position);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private static function sExpr(e:TypedExpr, pretty:Bool):String {
							 | 
						||
| 
								 | 
							
										return haxe.macro.Context.load("s_expr", 2)(e, pretty);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									#end
							 | 
						||
| 
								 | 
							
								}
							 |