From 94d86b091fa8267004cef96e83ec155b70ad5a24 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Mon, 10 Nov 2014 22:17:02 +0200 Subject: [PATCH] bindTo fixes --- src/bindx/Bind.hx | 2 +- src/bindx/BindMacros.hx | 24 ++++++++++++------------ src/bindx/BindSignal.hx | 7 ++++--- test/TestProperty.hx | 9 +++++++++ 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/bindx/Bind.hx b/src/bindx/Bind.hx index 5d144f9..7a85b02 100644 --- a/src/bindx/Bind.hx +++ b/src/bindx/Bind.hx @@ -65,7 +65,7 @@ class Bind { public static function checkField(field:Expr):{e:Expr, field:ClassField} { switch (field.expr) { case EField(e, field): - var classType = Context.typeof(e).getClass(); + var classType = Context.typeof(e).follow().getClass(); if (classType == null || !isBindable(classType)) { Context.error('\'${e.toString()}\' must be bindx.IBindable', e.pos); return null; diff --git a/src/bindx/BindMacros.hx b/src/bindx/BindMacros.hx index e5dce7b..f005cf8 100644 --- a/src/bindx/BindMacros.hx +++ b/src/bindx/BindMacros.hx @@ -94,18 +94,18 @@ class BindMacros { Context.warning('$INLINE_SETTER ignored. Setter already exist', inlineSetter.pos); var fieldName = field.name; var setter = fields.find(function (it) return it.name == 'set_$fieldName'); - if (setter == null) return; - switch (setter.kind) { - case FFun(func): - patchField = field; - func.expr = macro { - var $OLD_VALUE = this.$fieldName; - if ($i{OLD_VALUE} == $i{func.args[0].name}) return $i{OLD_VALUE}; - $e{func.expr.map(patchSetter)}; - }; - patchField = null; - case _: - + if (setter != null) { + switch (setter.kind) { + case FFun(func): + patchField = field; + func.expr = macro { + var $OLD_VALUE = this.$fieldName; + if ($i{OLD_VALUE} == $i{func.args[0].name}) return $i{OLD_VALUE}; + $e{func.expr.map(patchSetter)}; + }; + patchField = null; + case _: + } } res.push(field); diff --git a/src/bindx/BindSignal.hx b/src/bindx/BindSignal.hx index ef6a1af..ed5dbe1 100644 --- a/src/bindx/BindSignal.hx +++ b/src/bindx/BindSignal.hx @@ -63,8 +63,9 @@ class BindSignalProvider implements IBindingSignalProvider { function __unbind__() $expr.$signalName.remove(listener); } case FVar(_, _): + var type = field.type.follow().toComplexType(); macro { - var listener = function (from, to) $target = to; + var listener = function (from:$type, to:$type) $target = to; $expr.$signalName.add(listener); function __unbind__() $expr.$signalName.remove(listener); } @@ -89,7 +90,7 @@ class BindSignalProvider implements IBindingSignalProvider { public function getDisposeBindingsExpr(expr:ExprOf, type:Type):Expr { return macro { - var meta = haxe.rtti.Meta.getFields($p{type.toString().split(".")}); + var meta = haxe.rtti.Meta.getFields(std.Type.getClass($expr)); if (meta != null) for (m in std.Reflect.fields(meta)) { var data:Dynamic = std.Reflect.field(meta, m); if (std.Reflect.hasField(data, $v{BIND_SIGNAL_META})) { @@ -127,7 +128,7 @@ class BindSignalProvider implements IBindingSignalProvider { } return $i{signalPrivateName}; }; - var getterAccess = []; + var getterAccess = [APrivate]; if (inlineSignalGetter.isNotNullAndTrue()) getterAccess.push(AInline); res.push({ diff --git a/test/TestProperty.hx b/test/TestProperty.hx index 83bdd56..a78a94f 100644 --- a/test/TestProperty.hx +++ b/test/TestProperty.hx @@ -31,6 +31,15 @@ class TestProperty extends haxe.unit.TestCase { assertEquals(callNum, 2); } + + function test2() { + var p = new BindableProperty(); + var t = {a:""}; + Bind.bindTo(p.s, t.a); + + p.s = "123"; + assertEquals(t.a, p.s); + } } class BindableProperty implements bindx.IBindable {