From c9558d8a8f9ae90b4067b06394403dd93798ba17 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Wed, 19 Nov 2014 22:20:39 +0200 Subject: [PATCH] chain bindings + tests --- src/bindx/BindxExt.hx | 19 ++++++++++--------- test/ChainBindTest.hx | 14 +++++++++----- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/bindx/BindxExt.hx b/src/bindx/BindxExt.hx index 22984be..4b0d834 100644 --- a/src/bindx/BindxExt.hx +++ b/src/bindx/BindxExt.hx @@ -37,13 +37,13 @@ class BindExt { try { field = Bind.tryCheckField(prevField.e); if (field.field != null) - fields.unshift({field:field.field, bindable:field.error == null, e:field.e}); + fields.push({field:field.field, bindable:field.error == null, e:field.e}); else if (field.error != null) { var end = true; switch (prevField.e.expr) { case ECall(e, params): field = Bind.tryCheckField(e); - fields.unshift({e:field.e, field:field.field, params:params, bindable:field.error == null}); + fields.push({e:field.e, field:field.field, params:params, bindable:field.error == null}); end = false; case _: } @@ -58,17 +58,17 @@ class BindExt { for (it in fields) trace(printer.printExpr(it.e) + " -> " + it.field.name + (it.params != null ? '(${printer.printExprs(it.params, ",")})' : "") + " bind:" + it.bindable); - var i = fields.length - 1; + var i = -1; var res = []; var unbindRes = []; res.push(macro var listener0 = $ { listener } ); var zeroListener = null; - while (--i >= 0) { - var field = fields[i]; - var next = fields[i + 1]; + while (++i < fields.length - 1) { + var field = fields[i + 1]; + var next = fields[i]; var listenerName = 'listener${i+1}'; var listenerNameExpr = macro $i { listenerName }; - var nextListenerName = i == fields.length - 2 ? 'listener0' : 'listener${i+2}'; + var nextListenerName = i == 0 ? 'listener0' : 'listener${i}'; var nextListenerNameExpr = macro $i { nextListenerName }; var value = 'value${i+1}'; var valueExpr = macro $i { value }; @@ -78,8 +78,9 @@ class BindExt { var fieldListenerBody = []; var fieldListener:Expr; - if (field.bindable) zeroListener = { f:field, l:listenerNameExpr }; if (next.bindable) zeroListener = { f:next, l:nextListenerNameExpr }; + if (field.bindable) zeroListener = { f:field, l:listenerNameExpr }; + if (field.bindable) { var type = Context.typeof(field.e).toComplexType(); @@ -105,7 +106,7 @@ class BindExt { fieldListenerBody.unshift(macro $valueExpr = n ); fieldListenerBody.unshift(macro if ($valueExpr != null) $unbind ); - fieldListener = macro function $listenerName (o, n) { + fieldListener = macro function $listenerName (o:Null<$type>, n:Null<$type>) { $b { fieldListenerBody }; }; } diff --git a/test/ChainBindTest.hx b/test/ChainBindTest.hx index 672acf0..128610b 100644 --- a/test/ChainBindTest.hx +++ b/test/ChainBindTest.hx @@ -15,12 +15,15 @@ class ChainBindTest extends BuddySuite { describe("Using BindExt.chain", { var b:BindableChain; + var b2:BindableChain; var callNum:Int; before({ b = new BindableChain(); b.c = new BindableChain(); b.c.c = new BindableChain(); + b2 = new BindableChain(); + b2.c = new BindableChain(); callNum = 0; }); @@ -42,15 +45,16 @@ class ChainBindTest extends BuddySuite { }); it("BindExt.chain should bind chain changes (double gap)", { - b.c.c.d = "a"; + b.c.d = "a"; - BindExt.chain(b.c.c.d, function (_, _) callNum++); + BindExt.chain(b.c.d, function (_, _) callNum++); callNum.should.be(1); - BindExt.chain(b.c.c.c.d, function (_, _) callNum++ ); + b2.d = "b"; + b.c = b2; - callNum.should.be(1); + callNum.should.be(2); }); }); @@ -65,7 +69,7 @@ class BindableChain implements bindx.IBindable { public var nd:String; - + @:bindable public var c:BindableChain; @:bindable