fix warnings in expr binding
This commit is contained in:
+12
-7
@@ -79,14 +79,19 @@ class Bind {
|
|||||||
return res;
|
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;
|
var error:bindx.Error;
|
||||||
switch (field.expr) {
|
switch (f.expr) {
|
||||||
case EField(e, field):
|
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) {
|
if (classType == null) {
|
||||||
throw new FatalError('Type \'${e.toString()}\' is unknown', e.pos);
|
error = new FatalError('Type \'${e.toString()}\' is unknown', e.pos);
|
||||||
return null;
|
return {e:f, field:null, error:error};
|
||||||
}
|
}
|
||||||
if (!isBindable(classType)) {
|
if (!isBindable(classType)) {
|
||||||
error = new bindx.Error('\'${e.toString()}\' must be bindx.IBindable', e.pos);
|
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};
|
return {e:e, field:field, error:error};
|
||||||
|
|
||||||
case EConst(CIdent(_)):
|
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 _:
|
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 {
|
public static function isBindable(classType:ClassType):Bool {
|
||||||
|
|||||||
+10
-6
@@ -84,11 +84,11 @@ class BindExt {
|
|||||||
if (e != start) {
|
if (e != start) {
|
||||||
var pre = '_${prefix++}';
|
var pre = '_${prefix++}';
|
||||||
var zeroListener = listenerName(0, pre);
|
var zeroListener = listenerName(0, pre);
|
||||||
chain.init.push(macro var $zeroListener = ${ecall ? methodListenerNameExpr : fieldListenerNameExpr});
|
|
||||||
|
|
||||||
var c = null;
|
var c = null;
|
||||||
try { c = warnPrepareChain(start, macro $i{zeroListener}, pre); } catch (e:bindx.Error) { e.contextWarning(); }
|
try { c = warnPrepareChain(start, macro $i{zeroListener}, pre); } catch (e:bindx.Error) { e.contextWarning(); }
|
||||||
if (c != null) {
|
if (c != null) {
|
||||||
|
chain.init.push(macro var $zeroListener = ${ecall ? methodListenerNameExpr : fieldListenerNameExpr});
|
||||||
chain.init = chain.init.concat(c.init);
|
chain.init = chain.init.concat(c.init);
|
||||||
chain.bind = chain.bind.concat(c.bind);
|
chain.bind = chain.bind.concat(c.bind);
|
||||||
chain.unbind = chain.unbind.concat(c.unbind);
|
chain.unbind = chain.unbind.concat(c.unbind);
|
||||||
@@ -120,6 +120,8 @@ class BindExt {
|
|||||||
|
|
||||||
static function checkFields(expr:Expr):Array<FieldExpr> {
|
static function checkFields(expr:Expr):Array<FieldExpr> {
|
||||||
var first = Bind.checkField(expr);
|
var first = Bind.checkField(expr);
|
||||||
|
if (first.field == null || first.error != null) return [];
|
||||||
|
|
||||||
var prevField = {e:first.e, field:first.field, error:null};
|
var prevField = {e:first.e, field:first.field, error:null};
|
||||||
var fields:Array<FieldExpr> = [ { field:first.field, bindable:true, e:first.e } ];
|
var fields:Array<FieldExpr> = [ { field:first.field, bindable:true, e:first.e } ];
|
||||||
|
|
||||||
@@ -132,19 +134,19 @@ class BindExt {
|
|||||||
switch (prevField.e.expr) {
|
switch (prevField.e.expr) {
|
||||||
case ECall(e, params):
|
case ECall(e, params):
|
||||||
field = Bind.checkField(e);
|
field = Bind.checkField(e);
|
||||||
if (field.field == null) throw new FatalError('Error parse ${e.toString()}.', e.pos);
|
if (field.field == null) throw new FatalError('${e.toString()} is not bindable.', expr.pos);
|
||||||
fields.push( { e:field.e, field:field.field, params:params, bindable:field.error == null } );
|
else fields.push( { e:field.e, field:field.field, params:params, bindable:field.error == null } );
|
||||||
end = false;
|
end = false;
|
||||||
case _:
|
case _:
|
||||||
}
|
}
|
||||||
if (end) break;
|
if (end) break;
|
||||||
}
|
}
|
||||||
else if (field.e == null) {
|
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;
|
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;
|
return fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,6 +173,7 @@ class BindExt {
|
|||||||
if (first != null)
|
if (first != null)
|
||||||
Context.warning('${expr.toString()} is not full bindable. Can bind only "${first.e.toString()}".', expr.pos);
|
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);
|
return prepareChain(fields, macro listener, expr.pos, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,6 +189,7 @@ class BindExt {
|
|||||||
while (++i < fields.length - 1) {
|
while (++i < fields.length - 1) {
|
||||||
var field = fields[i + 1];
|
var field = fields[i + 1];
|
||||||
var prev = fields[i];
|
var prev = fields[i];
|
||||||
|
trace(prev.field);
|
||||||
var listenerName = listenerName(i+1, prefix);
|
var listenerName = listenerName(i+1, prefix);
|
||||||
var listenerNameExpr = macro $i { listenerName };
|
var listenerNameExpr = macro $i { listenerName };
|
||||||
|
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ class ExprBindTest extends BuddySuite {
|
|||||||
var b = new BaseTest.Bindable1();
|
var b = new BaseTest.Bindable1();
|
||||||
a.str = "a1";
|
a.str = "a1";
|
||||||
b.str = "b1";
|
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());
|
to.should.be(val());
|
||||||
callNum ++;
|
callNum ++;
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user