From bf810209745cc2f90bb5f60164efaa1b6259a31f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Fri, 20 Jan 2017 16:27:38 +0100 Subject: [PATCH] code clean and comments --- src/CompilerServices/CompilerServices.cs | 38 +----------- src/IML/Node.cs | 12 ++-- src/IML/NodeAddress.cs | 76 +++++++++++++++++++++++- src/Instantiator.cs | 37 +----------- 4 files changed, 84 insertions(+), 79 deletions(-) diff --git a/src/CompilerServices/CompilerServices.cs b/src/CompilerServices/CompilerServices.cs index 86dbd66a..c626a6e2 100644 --- a/src/CompilerServices/CompilerServices.cs +++ b/src/CompilerServices/CompilerServices.cs @@ -648,7 +648,7 @@ namespace Crow il.Emit (OpCodes.Ldarg_0); //load sender ref onto the stack, the current node if (lopParts.Length > 1) { - NodeAddress lopNA = getNodeAdressFromBindingExp (currentNode, ref operandes [0]); + NodeAddress lopNA = currentNode.ResolveExpression (ref operandes [0]); CompilerServices.emitGetInstance (il, currentNode, lopNA); lopType = lopNA.NodeType; } @@ -772,7 +772,7 @@ namespace Crow il.Emit (OpCodes.Ldarg_0); //load sender ref onto the stack if (lopParts.Length > 1) { - NodeAddress lopNA = getNodeAdressFromBindingExp (currentNode, ref operandes [0]); + NodeAddress lopNA = currentNode.ResolveExpression (ref operandes [0]); CompilerServices.emitGetInstance (il, currentNode, lopNA); lopType = lopNA.NodeType; } @@ -876,40 +876,6 @@ namespace Crow exps.Add(expression); return exps.ToArray (); } - - /// - /// Gets the node adress from binding expression starting at sourceAddr - /// and return in expression remaining part - /// - internal static NodeAddress getNodeAdressFromBindingExp(NodeAddress sourceAddr, ref string expression){ - int ptr = sourceAddr.Count - 1; - string[] splitedExp = expression.Split ('/'); - - if (splitedExp.Length < 2)//dataSource binding - return null; - - if (string.IsNullOrEmpty (splitedExp [0]) || splitedExp [0] == ".") {//search template root - ptr--; - while (ptr >= 0) { - if (typeof(TemplatedControl).IsAssignableFrom (sourceAddr [ptr].CrowType)) - break; - ptr--; - } - } else if (splitedExp [0] == "..") { //search starting at current node - int levelUp = splitedExp.Length - 1; - if (levelUp > ptr + 1) - throw new Exception ("Binding error: try to bind outside IML source"); - ptr -= levelUp; - } - expression = splitedExp [splitedExp.Length - 1]; - //TODO:change Template special address identified with Nodecount = 0 to something not using array count to 0, - //here linq is working without limits checking in compile option - //but defining a 0 capacity array with limits cheking enabled, cause 'out of memory' error - return new NodeAddress (sourceAddr.Take(ptr+1).ToArray());//[ptr+1]; - //Array.Copy (sourceAddr.ToArray (), targetNode, ptr + 1); - //return new NodeAddress (targetNode); - } - } } diff --git a/src/IML/Node.cs b/src/IML/Node.cs index 4ba61c03..29f204f5 100644 --- a/src/IML/Node.cs +++ b/src/IML/Node.cs @@ -30,16 +30,18 @@ namespace Crow.IML /// public struct Node { - /// Current node type - public Type CrowType; - /// Index in parent, -1 for template - public int Index; - + #region CTOR public Node (Type crowType, int _index = 0) { CrowType = crowType; Index = _index; } + #endregion + + /// Current node type + public Type CrowType; + /// Index in parent, -1 for template + public int Index; public MethodInfo GetAddMethod(int childIdx){ if (typeof (Group).IsAssignableFrom (CrowType)) diff --git a/src/IML/NodeAddress.cs b/src/IML/NodeAddress.cs index 460998da..c81a7f66 100644 --- a/src/IML/NodeAddress.cs +++ b/src/IML/NodeAddress.cs @@ -26,13 +26,83 @@ using System.Reflection.Emit; namespace Crow.IML { + /// + /// Node address is a list of nodes from root to leaf defining a unique node + /// public class NodeAddress : List { - public NodeAddress (Node[] nodes) : base(nodes) { - } + #region CTOR + public NodeAddress (Node[] nodes) : base(nodes) {} + #endregion public Type NodeType { get { return Count == 0 ? null : this[this.Count -1].CrowType; }} + /// + /// Gets the node adress from binding expression starting from this node + /// and return in expression remaining part + /// + public NodeAddress ResolveExpression (ref string expression){ + int ptr = this.Count - 1; + string[] splitedExp = expression.Split ('/'); + + if (splitedExp.Length < 2)//dataSource binding + return null; + + if (string.IsNullOrEmpty (splitedExp [0]) || splitedExp [0] == ".") {//search template root + ptr--; + while (ptr >= 0) { + if (typeof(TemplatedControl).IsAssignableFrom (this [ptr].CrowType)) + break; + ptr--; + } + } else if (splitedExp [0] == "..") { //search starting at current node + int levelUp = splitedExp.Length - 1; + if (levelUp > ptr + 1) + throw new Exception ("Binding error: try to bind outside IML source"); + ptr -= levelUp; + } + expression = splitedExp [splitedExp.Length - 1]; + //TODO:change Template special address identified with Nodecount = 0 to something not using array count to 0, + //here linq is working without limits checking in compile option + //but defining a 0 capacity array with limits cheking enabled, cause 'out of memory' error + return new NodeAddress (this.Take(ptr+1).ToArray());//[ptr+1]; + //Array.Copy (sourceAddr.ToArray (), targetNode, ptr + 1); + //return new NodeAddress (targetNode); + } + /// + /// get BindingDefinition from binding expression + /// + public BindingDefinition GetBindingDef(string sourceMember, string expression){ + BindingDefinition bindingDef = new BindingDefinition(this, sourceMember); + if (string.IsNullOrEmpty (expression)) { + return bindingDef; + } else { + if (expression.StartsWith ("²")) { + bindingDef.TwoWay = true; + expression = expression.Substring (1); + } + + string exp = expression; + bindingDef.TargetNA = this.ResolveExpression (ref exp); + + string [] bindTrg = exp.Split ('.'); + + if (bindTrg.Length == 0) + throw new Exception ("invalid binding expression: " + expression); + if (bindTrg.Length == 1) + bindingDef.TargetMember = bindTrg [0]; + else { + if (!string.IsNullOrEmpty(bindTrg[0]))//searchByName + bindingDef.TargetName = bindTrg[0]; + + bindingDef.TargetMember = exp.Substring (bindTrg[0].Length + 1); + } + } + + return bindingDef; + } + + #region Object overrides public override bool Equals (object obj) { if (obj == null) @@ -50,7 +120,6 @@ namespace Crow.IML return hash; } } - public override string ToString () { string tmp = ""; @@ -58,6 +127,7 @@ namespace Crow.IML tmp += string.Format ("{0};", n.Index); return tmp; } + #endregion } public class NamedNodeAddress : NodeAddress { diff --git a/src/Instantiator.cs b/src/Instantiator.cs index 883f3129..6e94ae17 100644 --- a/src/Instantiator.cs +++ b/src/Instantiator.cs @@ -356,7 +356,7 @@ namespace Crow void readPropertyBinding (Context ctx, string sourceMember, string expression) { NodeAddress sourceNA = ctx.CurrentNodeAddress; - BindingDefinition bindingDef = genBindingDef (sourceNA, sourceMember, expression); + BindingDefinition bindingDef = sourceNA.GetBindingDef (sourceMember, expression); #if DEBUG_BINDING Debug.WriteLine("Property Binding: " + bindingDef.ToString()); @@ -368,39 +368,6 @@ namespace Crow ctx.StorePropertyBinding (bindingDef); } - /// - /// get BindingDefinition from binding expression - /// - BindingDefinition genBindingDef(NodeAddress sourceNA, string sourceMember, string expression){ - BindingDefinition bindingDef = new BindingDefinition(sourceNA, sourceMember); - if (string.IsNullOrEmpty (expression)) { - return bindingDef; - } else { - if (expression.StartsWith ("²")) { - bindingDef.TwoWay = true; - expression = expression.Substring (1); - } - - string exp = expression; - bindingDef.TargetNA = CompilerServices.getNodeAdressFromBindingExp (sourceNA, ref exp); - - string [] bindTrg = exp.Split ('.'); - - if (bindTrg.Length == 0) - throw new Exception ("invalid binding expression: " + expression); - if (bindTrg.Length == 1) - bindingDef.TargetMember = bindTrg [0]; - else { - if (!string.IsNullOrEmpty(bindTrg[0]))//searchByName - bindingDef.TargetName = bindTrg[0]; - - bindingDef.TargetMember = exp.Substring (bindTrg[0].Length + 1); - } - } - - return bindingDef; - } - #region Emit Helper void dataSourceChangedEmitHelper(object dscSource, object dataSource, int dynMethIdx){ if (dataSource is IValueChange) @@ -424,7 +391,7 @@ namespace Crow /// Emits handler method bindings void emitHandlerBinding (Context ctx, EventInfo sourceEvent, string expression){ NodeAddress currentNode = ctx.CurrentNodeAddress; - BindingDefinition bindingDef = genBindingDef (currentNode, sourceEvent.Name, expression); + BindingDefinition bindingDef = currentNode.GetBindingDef (sourceEvent.Name, expression); #if DEBUG_BINDING Debug.WriteLine("Event Binding: " + bindingDef.ToString()); -- 2.47.3