From 54c2f28f9415e716f06207c8af2466bb45afafb2 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Fri, 2 Jan 2015 15:28:28 +0200 Subject: [PATCH] store bindable fields in meta --- src/bindx/BindMacros.hx | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/bindx/BindMacros.hx b/src/bindx/BindMacros.hx index 2db7eb1..1e5660c 100644 --- a/src/bindx/BindMacros.hx +++ b/src/bindx/BindMacros.hx @@ -25,13 +25,13 @@ class BindMacros { * default value: false */ static public inline var FORCE = "force"; + + static public inline var BINDABLE_FIELDS = "bindableFields"; static var processed:Array = []; static var bindingSignalProvider:IBindingSignalProvider; - static var interfaceBindableFields:Map>; - macro static public function buildIBindable():Array { var type = Context.getLocalType(); var tName = type.toComplexType().toString(); @@ -44,7 +44,6 @@ class BindMacros { if (bindingSignalProvider == null) { bindingSignalProvider = new bindx.BindSignal.BindSignalProvider(); - interfaceBindableFields = new Map(); } var fields = Context.getBuildFields(); @@ -61,7 +60,10 @@ class BindMacros { Context.warning('Interface doesn\'t support @:bindable meta params', m.pos); } } - interfaceBindableFields.set(typeName(classType), a); + var classMeta = classType.meta; + if (classMeta.has(BINDABLE_FIELDS)) + classMeta.remove(BINDABLE_FIELDS); + classMeta.add(BINDABLE_FIELDS, [macro $v { a } ], classType.pos); return fields; } @@ -90,10 +92,18 @@ class BindMacros { var interfaceFields = new Map(); function iter(t:ClassType) { - var a = interfaceBindableFields.get(typeName(t)); - if (a != null) { - for (i in a) - interfaceFields.set(i, t); + var meta = t.meta.get(); + var m = meta.find(function (it) return it.name == BINDABLE_FIELDS); + if (m != null && m.params.length > 0) { + var a = m.params[0]; + switch a.expr { + case EArrayDecl(values): + for (v in values) { + var value = switch v.expr { case EConst(CString(s)): s; case _: null; }; + interfaceFields.set(value, t); + } + case _: + } } for (it in t.interfaces) iter(it.t.get()); }