Work around macro context cache issue.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user