Improvements to type building.
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
package tink;
|
||||
|
||||
import haxe.macro.Expr.TypeDefinition;
|
||||
|
||||
using tink.CoreApi;
|
||||
|
||||
typedef Positions = tink.macro.Positions;
|
||||
typedef ExprTools = haxe.macro.ExprTools;
|
||||
typedef Exprs = tink.macro.Exprs;
|
||||
@@ -20,6 +24,8 @@ typedef Member = tink.macro.Member;
|
||||
typedef Constructor = tink.macro.Constructor;
|
||||
typedef ClassBuilder = tink.macro.ClassBuilder;
|
||||
|
||||
typedef TypeResolution = Ref<Either<String, TypeDefinition>>;
|
||||
|
||||
class MacroApi {
|
||||
|
||||
static var idCounter = 0;
|
||||
@@ -30,12 +36,18 @@ class MacroApi {
|
||||
static public function pos()
|
||||
return haxe.macro.Context.currentPos();
|
||||
|
||||
static public function onTypeNotFound(f:String->haxe.macro.Expr.TypeDefinition)
|
||||
haxe.macro.Context.onTypeNotFound(function (name:String) {
|
||||
@:privateAccess Positions.errorFunc = @:privateAccess Positions.abortTypeBuild;
|
||||
|
||||
var ret =
|
||||
try f(name)
|
||||
static public var typeNotFound(get, null):Signal<TypeResolution>;
|
||||
|
||||
static function get_typeNotFound() {
|
||||
if (typeNotFound == null) {
|
||||
var trigger = Signal.trigger();
|
||||
haxe.macro.Context.onMacroContextReused(function () return false);
|
||||
haxe.macro.Context.onTypeNotFound(function (name:String) {
|
||||
@:privateAccess Positions.errorFunc = @:privateAccess Positions.abortTypeBuild;
|
||||
|
||||
var def = Ref.to(Left(name));
|
||||
|
||||
try trigger.trigger(def)
|
||||
catch (abort:tink.macro.Positions.AbortBuild) {
|
||||
var cl = macro class {
|
||||
static var __error = ${Positions.errorExpr(abort.pos, abort.message)};
|
||||
@@ -44,12 +56,20 @@ class MacroApi {
|
||||
cl.name = path.pop();
|
||||
cl.pack = path;
|
||||
cl.pos = abort.pos;
|
||||
cl;
|
||||
def.value = Right(cl);
|
||||
}
|
||||
|
||||
@:privateAccess Positions.errorFunc = @:privateAccess Positions.contextError;
|
||||
|
||||
@:privateAccess Positions.errorFunc = @:privateAccess Positions.contextError;
|
||||
return switch def.value {
|
||||
case Right(def): def;
|
||||
default: null;
|
||||
}
|
||||
});
|
||||
|
||||
return ret;
|
||||
});
|
||||
typeNotFound = trigger.asSignal();
|
||||
}
|
||||
return typeNotFound;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user