Work around macro context cache issue.

This commit is contained in:
back2dos
2014-06-15 07:07:25 +02:00
parent 613ebff7a0
commit 2acb539b00

View File

@@ -3,6 +3,7 @@ package tink;
import haxe.macro.Expr.TypeDefinition; import haxe.macro.Expr.TypeDefinition;
using tink.CoreApi; using tink.CoreApi;
using tink.macro.Positions;
typedef Positions = tink.macro.Positions; typedef Positions = tink.macro.Positions;
typedef ExprTools = haxe.macro.ExprTools; typedef ExprTools = haxe.macro.ExprTools;
@@ -41,33 +42,51 @@ class MacroApi {
static function get_typeNotFound() { static function get_typeNotFound() {
if (typeNotFound == null) { if (typeNotFound == null) {
var trigger = Signal.trigger(); 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)); var listening = false;
try trigger.trigger(def) function register() {
catch (abort:tink.macro.Positions.AbortBuild) { if (listening) return;
var cl = macro class { listening = true;
static var __error = ${Positions.errorExpr(abort.pos, abort.message)};
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)};
}
var path = name.split('.');
cl.name = path.pop();
cl.pack = path;
cl.pos = abort.pos;
def.value = Right(cl);
} }
var path = name.split('.');
cl.name = path.pop();
cl.pack = path;
cl.pos = abort.pos;
def.value = Right(cl);
}
@:privateAccess Positions.errorFunc = @:privateAccess Positions.contextError; @:privateAccess Positions.errorFunc = @:privateAccess Positions.contextError;
return switch def.value { return switch def.value {
case Right(def): def; case Right(def): def;
default: null; default: null;
} }
});
}
register();
haxe.macro.Context.onMacroContextReused(function () {
listening = false;
return true;
}); });
typeNotFound = trigger.asSignal(); var ret = trigger.asSignal();
typeNotFound = new Signal(function (cb) {
register();
return ret.handle(cb);
});
} }
return typeNotFound; return typeNotFound;
} }