bindTo fixes

This commit is contained in:
Dima Granetchi
2014-11-10 22:17:02 +02:00
parent 5f1da93724
commit 94d86b091f
4 changed files with 26 additions and 16 deletions
+1 -1
View File
@@ -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;
+12 -12
View File
@@ -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);
+4 -3
View File
@@ -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<IBindable>, 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<String> = 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({
+9
View File
@@ -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 {