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