forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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
 | |
| }
 |