Improvements to type building.

This commit is contained in:
back2dos
2014-06-05 12:33:46 +02:00
parent 69072e8e18
commit 8ca2259629
2 changed files with 157 additions and 109 deletions

View File

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