diff --git a/src/bindx/Bind.hx b/src/bindx/Bind.hx index d6ecab6..d27d5f8 100644 --- a/src/bindx/Bind.hx +++ b/src/bindx/Bind.hx @@ -39,13 +39,8 @@ class Bind { public static function internalBind(field:Expr, listener:Expr, doBind:Bool):Expr { var fieldData = warnCheckField(field); - return if (fieldData != null) { - if (doBind) BindMacros.bindingSignalProvider.getClassFieldBindExpr(fieldData.e, fieldData.field, listener); - else BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(fieldData.e, fieldData.field, listener); - } else { - Context.fatalError('can\'t bind field ${field.expr}', field.pos); - macro {}; - } + return if (doBind) BindMacros.bindingSignalProvider.getClassFieldBindExpr(fieldData.e, fieldData.field, listener); + else BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(fieldData.e, fieldData.field, listener); } public static function internalBindTo(field:Expr, target:Expr):Expr { @@ -114,15 +109,16 @@ class Bind { } public static function isBindable(classType:ClassType):Bool { - if (classType.module == "bindx.IBindable" && classType.name == "IBindable") - return true; - - var t = classType; - while (t != null) { - for (it in t.interfaces) - if (isBindable(it.t.get())) - return true; - t = t.superClass != null ? t.superClass.t.get() : null; + var check = [classType]; + while (check.length > 0) { + var t = check.shift(); + while (t != null) { + if (t.module == "bindx.IBindable" && t.name == "IBindable") + return true; + for (it in t.interfaces) + check.push(it.t.get()); + t = t.superClass != null ? t.superClass.t.get() : null; + } } return false; } diff --git a/src/bindx/BindMacros.hx b/src/bindx/BindMacros.hx index 819ab2c..05046d3 100644 --- a/src/bindx/BindMacros.hx +++ b/src/bindx/BindMacros.hx @@ -1,5 +1,6 @@ package bindx; +import bindx.Error; import haxe.macro.Type; import haxe.macro.Expr; import haxe.macro.Context; @@ -62,7 +63,7 @@ class BindMacros { var inlineSetter = meta.findParam(INLINE_SETTER); if (forceParam.isNotNullAndTrue()) { if (inlineSetter != null) - Context.warning('\'$INLINE_SETTER\' ignored. \'$FORCE\' mode', inlineSetter.pos); + Warn.w('\'$INLINE_SETTER\' ignored. \'$FORCE\' mode', inlineSetter.pos, WarnPriority.INFO); res.push(field); return; } @@ -91,7 +92,7 @@ class BindMacros { case FProp(get, set, type, expr): if (inlineSetter != null) - Context.warning('$INLINE_SETTER ignored. Setter already exist', inlineSetter.pos); + Warn.w('$INLINE_SETTER ignored. Setter already exist', inlineSetter.pos, WarnPriority.INFO); var fieldName = field.name; var setter = fields.find(function (it) return it.name == 'set_$fieldName'); if (setter != null) { @@ -111,7 +112,7 @@ class BindMacros { case FFun(f): if (inlineSetter != null) - Context.warning('methods doesn\'t support \'$INLINE_SETTER\'', inlineSetter.pos); + Warn.w('methods doesn\'t support \'$INLINE_SETTER\'', inlineSetter.pos, WarnPriority.INFO); res.push(field); } } @@ -150,8 +151,7 @@ class BindMacros { static function isFieldBindable(field:Field, fields:Array, force = false):Bool { if (field.name == "new") return false; - if (field.access.exists(function (it) return it.equals(AMacro) || it.equals(ADynamic) || it.equals(AStatic))) - return false; + if (field.access.exists(function (it) return it.equals(AMacro) || it.equals(ADynamic) || it.equals(AStatic))) return false; if (field.name.startsWith("set_") || field.name.startsWith("get_")) { var propName = field.name.substr(4); diff --git a/src/bindx/IBindingSignalProvider.hx b/src/bindx/IBindingSignalProvider.hx index 17b3918..ccc5f62 100644 --- a/src/bindx/IBindingSignalProvider.hx +++ b/src/bindx/IBindingSignalProvider.hx @@ -1,10 +1,12 @@ package bindx; +#if macro + import haxe.macro.Expr; import haxe.macro.Type; interface IBindingSignalProvider { - #if macro + function getFieldDispatcher(field:Field, result:Array):Void; function getFieldChangedExpr(field:Field, oldValue:Expr, newValue:Expr):Expr; @@ -13,5 +15,7 @@ interface IBindingSignalProvider { function getClassFieldUnbindExpr(expr:Expr, field:ClassField, listener:Expr):Expr; function getClassFieldChangedExpr(expr:Expr, field:ClassField, oldValue:Expr, newValue:Expr):Expr; function getUnbindAllExpr(expr:ExprOf, type:Type):Expr; - #end + } + +#end \ No newline at end of file