- haxe 3.4.x changes

- Reflect.compareMethods for all platforms
This commit is contained in:
Dima Granetchi
2017-02-02 21:12:57 +03:00
parent 86c765c7b6
commit b1cbea09ec
6 changed files with 83 additions and 88 deletions
-1
View File
@@ -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`
-1
View File
@@ -110,5 +110,4 @@ Log level | Description
## Дополнительно
- `-D bindx_compareMethods` включает сравнение методов с помощью `Reflect.compareMethods` (включено для neko по умолчанию)
- BindExt и `this`. Используйте `this.bindableA.bindableB` если необходимо слушать изменения `bindableA`, а не только `bindableB`
+10 -83
View File
@@ -1,5 +1,7 @@
package bindx;
import haxe.Constraints.Function;
class MethodSignal extends Signal<Void -> Void> {
public function dispatch():Void {
@@ -19,7 +21,7 @@ class FieldSignal<T> extends Signal<T -> T -> Void> {
}
}
class Signal<T> {
class Signal<T:Function> {
var listeners:Array<T>;
@@ -35,20 +37,14 @@ class Signal<T> {
}
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<T> {
}
}
}
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<Dynamic> = cast std.Reflect.field(bindable, m);
if (signal != null) {
signal.removeAll();
var args:Array<Dynamic> = 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<bindx.BindSignal.Signal<Dynamic>, 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<String, bindx.BindSignal.Signal<Dynamic>> {
var signals = new Map<String, bindx.BindSignal.Signal<Dynamic>>();
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<Dynamic> = std.Reflect.field(data, BIND_SIGNAL_META);
var signal:bindx.BindSignal.Signal<Dynamic> = 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;
}
}
+70
View File
@@ -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<Dynamic> = cast std.Reflect.field(bindable, m);
if (signal != null) {
signal.removeAll();
var args:Array<Dynamic> = 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<bindx.BindSignal.Signal<Dynamic>, 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<String, bindx.BindSignal.Signal<Dynamic>> {
var signals = new Map<String, bindx.BindSignal.Signal<Dynamic>>();
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<Dynamic> = std.Reflect.field(data, BIND_SIGNAL_META);
var signal:bindx.BindSignal.Signal<Dynamic> = 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;
}
}
+2 -2
View File
@@ -90,11 +90,11 @@ class BindSignalProvider implements IBindingSignalProvider {
}
public function getUnbindAllExpr(expr:ExprOf<IBindable>, type:Type):Expr {
return macro bindx.BindSignal.SignalTools.unbindAll($expr);
return macro bindx.SignalTools.unbindAll($expr);
}
public function getBindAllExpr(expr:ExprOf<IBindable>, 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<Field>):Void {
+1 -1
View File
@@ -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)
*/