diff --git a/src/bindx/Bind.hx b/src/bindx/Bind.hx index 6ce7f8e..077cc5b 100644 --- a/src/bindx/Bind.hx +++ b/src/bindx/Bind.hx @@ -79,14 +79,19 @@ class Bind { return res; } - public static function checkField(field:Expr):{e:Expr, field:ClassField, error:bindx.Error} { + public static function checkField(f:Expr):{e:Expr, field:ClassField, error:bindx.Error} { var error:bindx.Error; - switch (field.expr) { + switch (f.expr) { case EField(e, field): - var classType = Context.typeof(e).follow().getClass(); + var type = Context.typeof(e); + var classType = null; + switch (type) { + case TInst(c, _): classType = c.get(); + case _: + } if (classType == null) { - throw new FatalError('Type \'${e.toString()}\' is unknown', e.pos); - return null; + error = new FatalError('Type \'${e.toString()}\' is unknown', e.pos); + return {e:f, field:null, error:error}; } if (!isBindable(classType)) { error = new bindx.Error('\'${e.toString()}\' must be bindx.IBindable', e.pos); @@ -105,11 +110,11 @@ class Bind { return {e:e, field:field, error:error}; case EConst(CIdent(_)): - return {e:field, field:null, error:new bindx.Error('Can\'t bind \'${field.toString()}\'. Please use \'this.${field.toString()}\'', field.pos)}; + return {e:f, field:null, error:new bindx.Error('Can\'t bind \'${f.toString()}\'. Please use \'this.${f.toString()}\'', f.pos)}; case _: } - return {e:field, field:null, error:new bindx.Error('Can\'t bind field \'${field.toString()}\'', field.pos)}; + return {e:f, field:null, error:new bindx.Error('Can\'t bind field \'${f.toString()}\'', f.pos)}; } public static function isBindable(classType:ClassType):Bool { diff --git a/src/bindx/BindxExt.hx b/src/bindx/BindxExt.hx index 42b48cf..ba7b681 100644 --- a/src/bindx/BindxExt.hx +++ b/src/bindx/BindxExt.hx @@ -84,11 +84,11 @@ class BindExt { if (e != start) { var pre = '_${prefix++}'; var zeroListener = listenerName(0, pre); - chain.init.push(macro var $zeroListener = ${ecall ? methodListenerNameExpr : fieldListenerNameExpr}); - + var c = null; try { c = warnPrepareChain(start, macro $i{zeroListener}, pre); } catch (e:bindx.Error) { e.contextWarning(); } if (c != null) { + chain.init.push(macro var $zeroListener = ${ecall ? methodListenerNameExpr : fieldListenerNameExpr}); chain.init = chain.init.concat(c.init); chain.bind = chain.bind.concat(c.bind); chain.unbind = chain.unbind.concat(c.unbind); @@ -120,6 +120,8 @@ class BindExt { static function checkFields(expr:Expr):Array { var first = Bind.checkField(expr); + if (first.field == null || first.error != null) return []; + var prevField = {e:first.e, field:first.field, error:null}; var fields:Array = [ { field:first.field, bindable:true, e:first.e } ]; @@ -132,19 +134,19 @@ class BindExt { switch (prevField.e.expr) { case ECall(e, params): field = Bind.checkField(e); - if (field.field == null) throw new FatalError('Error parse ${e.toString()}.', e.pos); - fields.push( { e:field.e, field:field.field, params:params, bindable:field.error == null } ); + if (field.field == null) throw new FatalError('${e.toString()} is not bindable.', expr.pos); + else fields.push( { e:field.e, field:field.field, params:params, bindable:field.error == null } ); end = false; case _: } if (end) break; } else if (field.e == null) { - throw new FatalError('Error parse ${prevField.e.toString()}.', prevField.e.pos); + throw new FatalError('${prevField.e.toString()} is not bindable.', expr.pos); } prevField = field; } - //for (it in fields) trace(printer.printExpr(it.e) + " -> " + it.field.name + (it.params != null ? '(${printer.printExprs(it.params, ",")})' : "") + " bind:" + it.bindable); + return fields; } @@ -171,6 +173,7 @@ class BindExt { if (first != null) Context.warning('${expr.toString()} is not full bindable. Can bind only "${first.e.toString()}".', expr.pos); + //trace(fields); return prepareChain(fields, macro listener, expr.pos, prefix); } @@ -186,6 +189,7 @@ class BindExt { while (++i < fields.length - 1) { var field = fields[i + 1]; var prev = fields[i]; + trace(prev.field); var listenerName = listenerName(i+1, prefix); var listenerNameExpr = macro $i { listenerName }; diff --git a/test/ExprBindTest.hx b/test/ExprBindTest.hx index 701d231..bf219b7 100644 --- a/test/ExprBindTest.hx +++ b/test/ExprBindTest.hx @@ -24,9 +24,9 @@ class ExprBindTest extends BuddySuite { var b = new BaseTest.Bindable1(); a.str = "a1"; b.str = "b1"; - inline function val() return a.str + b.str + "ab".charAt(0); + inline function val() return a.str + b.str + a.str.charAt(0) + "ab".charAt(0) + Std.string(1); - BindExt.expr(a.str + b.str + "ab".charAt(0), function (from, to:String) { + BindExt.expr(a.str + b.str + a.str.charAt(0) + "ab".charAt(0) + Std.string(1), function (from, to:String) { to.should.be(val()); callNum ++; });