diff --git a/src/bindx/Bindx.hx b/src/bindx/Bindx.hx new file mode 100644 index 0000000..c838950 --- /dev/null +++ b/src/bindx/Bindx.hx @@ -0,0 +1,48 @@ +package bindx; + +#if macro + +import bindx.Error; +import haxe.macro.Expr; + +#end +class Bindx { + + @:noUsing macro static public function bindChain(expr:Expr, listener:Expr):Expr { + return internalBindChain(expr, listener); + } + + #if macro + static function internalBindChain(expr:Expr, listener:Expr):Expr { + var prevField = Bind.checkField(expr); + var field = prevField; + var fields = []; + var rest:Expr; + while (field != null) { + try { + field = Bind.tryCheckField(prevField.expr); + fields.push(field.field); + rest = field.expr; + } + catch (e:FatalError) { + e.contextFatal(); + } + catch (e:Error) { + switch (prevField.expr) { + case EField(e, field): + var classType = Context.typeof(e).follow().getClass(); + var field:ClassField = classType.findField(field, null); + fields.push(field); + rest = e; + case EConst(CIdent(_)): + rest = prevField.expr; + case _: + rest = prevField.expr; + } + } + prevField = field; + } + } + #end + +} \ No newline at end of file