From b1cbea09ec835d7bd0373778c96659e6b6590ee5 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Thu, 2 Feb 2017 21:12:57 +0300 Subject: [PATCH] - haxe 3.4.x changes - Reflect.compareMethods for all platforms --- README.md | 1 - README_ru.md | 1 - src/bindx/BindSignal.hx | 93 +++------------------------ src/bindx/SignalTools.hx | 70 ++++++++++++++++++++ src/bindx/macro/BindSignalProvider.hx | 4 +- src/bindx/macro/BindableMacros.hx | 2 +- 6 files changed, 83 insertions(+), 88 deletions(-) create mode 100644 src/bindx/SignalTools.hx diff --git a/README.md b/README.md index d110e52..9a24f2e 100644 --- a/README.md +++ b/README.md @@ -110,5 +110,4 @@ Log level | Description ## Additional -- `-D bindx_compareMethods` enables methods comparing with `Reflect.compareMethods` (enabled for Neko by default) - BindExt and `this`. Use `this.bindableA.bindableB` to listen changes of `bindableA`, not only `bindableB` diff --git a/README_ru.md b/README_ru.md index 7826ef1..302faed 100644 --- a/README_ru.md +++ b/README_ru.md @@ -110,5 +110,4 @@ Log level | Description ## Дополнительно -- `-D bindx_compareMethods` включает сравнение методов с помощью `Reflect.compareMethods` (включено для neko по умолчанию) - BindExt и `this`. Используйте `this.bindableA.bindableB` если необходимо слушать изменения `bindableA`, а не только `bindableB` diff --git a/src/bindx/BindSignal.hx b/src/bindx/BindSignal.hx index 52a0880..755ee0e 100644 --- a/src/bindx/BindSignal.hx +++ b/src/bindx/BindSignal.hx @@ -1,5 +1,7 @@ package bindx; +import haxe.Constraints.Function; + class MethodSignal extends Signal Void> { public function dispatch():Void { @@ -19,7 +21,7 @@ class FieldSignal extends Signal T -> Void> { } } -class Signal { +class Signal { var listeners:Array; @@ -35,20 +37,14 @@ class Signal { } inline function indexOf(listener:T):Int { - #if (neko || bindx_compareMethods) - var res = -1; - var i = 0; - for (l in listeners) { - if (Reflect.compareMethods(listener, l)) { - res = i; - break; - } - i++; + var res = -1; + for (i in 0...listeners.length) { + if (Reflect.compareMethods(listeners[i], listener)) { + res = i; + break; } - return res; - #else - return listeners.indexOf(listener); - #end + } + return res; } public function add(listener:T):Void { @@ -73,72 +69,3 @@ class Signal { } } } - -class SignalTools { - static public inline var BIND_SIGNAL_META = "BindSignal"; - - static public inline var SIGNAL_POSTFIX = "Changed"; - - static public function unbindAll(bindable:bindx.IBindable):Void { - var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable)); - if (meta != null) for (m in std.Reflect.fields(meta)) { - var data = std.Reflect.field(meta, m); - if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { - var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); - if (signal != null) { - signal.removeAll(); - var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); - var lazy:Bool = args[1]; - if (lazy) std.Reflect.setField(bindable, m, null); - } - } - } - } - - static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void { - var listeners = new Map, Dynamic>(); - - var signals = getSignals(bindable, force); - for (name in signals.keys()) { - var signal = signals.get(name); - if (std.Std.is(signal, FieldSignal)) { - var listener = function (from:Dynamic, to:Dynamic) callback(name, from, to); - listeners.set(signal, listener); - signal.add(listener); - } else { - var listener = function () callback(name, null, null); - listeners.set(signal, listener); - signal.add(listener); - } - } - - return function () { - for (signal in listeners.keys()) { - var listener = listeners.get(signal); - if (Std.is(signal, FieldSignal)) signal.remove(listener); - else signal.remove(listener); - } - } - } - - static function getSignals(bindable:bindx.IBindable, force = true):Map> { - var signals = new Map>(); - var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable)); - if (meta != null) for (m in std.Reflect.fields(meta)) { - var data = std.Reflect.field(meta, m); - if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { - var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); - var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); - if (signal == null && force) { - var lazy:Bool = args[1]; - if (lazy) signal = cast std.Reflect.getProperty(bindable, m.substr(1)); - } - if (signal != null) { - var name = args[0]; - signals.set(name, signal); - } - } - } - return signals; - } -} \ No newline at end of file diff --git a/src/bindx/SignalTools.hx b/src/bindx/SignalTools.hx new file mode 100644 index 0000000..809ae37 --- /dev/null +++ b/src/bindx/SignalTools.hx @@ -0,0 +1,70 @@ +package bindx; + +class SignalTools { + static public inline var BIND_SIGNAL_META = "BindSignal"; + + static public inline var SIGNAL_POSTFIX = "Changed"; + + static public function unbindAll(bindable:bindx.IBindable):Void { + var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable)); + if (meta != null) for (m in std.Reflect.fields(meta)) { + var data = std.Reflect.field(meta, m); + if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { + var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); + if (signal != null) { + signal.removeAll(); + var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); + var lazy:Bool = args[1]; + if (lazy) std.Reflect.setField(bindable, m, null); + } + } + } + } + + static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void { + var listeners = new Map, Dynamic>(); + + var signals = getSignals(bindable, force); + for (name in signals.keys()) { + var signal = signals.get(name); + if (std.Std.is(signal, bindx.BindSignal.FieldSignal)) { + var listener = function (from:Dynamic, to:Dynamic) callback(name, from, to); + listeners.set(signal, listener); + signal.add(listener); + } else { + var listener = function () callback(name, null, null); + listeners.set(signal, listener); + signal.add(listener); + } + } + + return function () { + for (signal in listeners.keys()) { + var listener = listeners.get(signal); + if (Std.is(signal, bindx.BindSignal.FieldSignal)) signal.remove(listener); + else signal.remove(listener); + } + } + } + + static function getSignals(bindable:bindx.IBindable, force = true):Map> { + var signals = new Map>(); + var meta = haxe.rtti.Meta.getFields(std.Type.getClass(bindable)); + if (meta != null) for (m in std.Reflect.fields(meta)) { + var data = std.Reflect.field(meta, m); + if (std.Reflect.hasField(data, BIND_SIGNAL_META)) { + var args:Array = std.Reflect.field(data, BIND_SIGNAL_META); + var signal:bindx.BindSignal.Signal = cast std.Reflect.field(bindable, m); + if (signal == null && force) { + var lazy:Bool = args[1]; + if (lazy) signal = cast std.Reflect.getProperty(bindable, m.substr(1)); + } + if (signal != null) { + var name = args[0]; + signals.set(name, signal); + } + } + } + return signals; + } +} \ No newline at end of file diff --git a/src/bindx/macro/BindSignalProvider.hx b/src/bindx/macro/BindSignalProvider.hx index 8c29d25..5145792 100644 --- a/src/bindx/macro/BindSignalProvider.hx +++ b/src/bindx/macro/BindSignalProvider.hx @@ -90,11 +90,11 @@ class BindSignalProvider implements IBindingSignalProvider { } public function getUnbindAllExpr(expr:ExprOf, type:Type):Expr { - return macro bindx.BindSignal.SignalTools.unbindAll($expr); + return macro bindx.SignalTools.unbindAll($expr); } public function getBindAllExpr(expr:ExprOf, type:Type, listener:Expr, force:Bool = true):Expr { - return macro bindx.BindSignal.SignalTools.bindAll($expr, $listener, $v{force}); + return macro bindx.SignalTools.bindAll($expr, $listener, $v{force}); } function generateSignal(field:Field, type:ComplexType, builder:Expr, res:Array):Void { diff --git a/src/bindx/macro/BindableMacros.hx b/src/bindx/macro/BindableMacros.hx index 5e73875..dbf0401 100644 --- a/src/bindx/macro/BindableMacros.hx +++ b/src/bindx/macro/BindableMacros.hx @@ -22,7 +22,7 @@ class BindableMacros { /** * default value: false */ - static public inline var FORCE = "force";/** + static public inline var FORCE = "force"; /** * meta store bindable fields (interfaces only) */