private IExpressionNode VisitExpression(IExpressionNode node) { var nodes = new List <IExpressionNode>(); string memberName = node.TryGetMemberName(true, true, nodes); if (memberName == null) { _isMulti = true; return(node); } if (nodes[0] is ResourceExpressionNode) { return(GetResourceMember(node, memberName, nodes)); } IBindingPath path = BindingServiceProvider.BindingPathFactory(memberName); if (path.IsEmpty) { return(GetOrAddBindingMember(memberName, (s, i) => new BindingMemberExpressionNode(memberName, s, i))); } string firstMember = path.Parts[0]; if (_lamdaParameters.Contains(firstMember)) { return(node); } return(GetOrAddBindingMember(memberName, (s, i) => new BindingMemberExpressionNode(memberName, s, i))); }
/// <summary> /// Dispatches the expression. /// </summary> /// <param name="node">The expression to visit.</param> /// <returns>The modified expression, if it or any subexpression was modified; otherwise, returns the original expression.</returns> public IExpressionNode Visit(IExpressionNode node) { var nodes = new List <IExpressionNode>(); var members = new List <string>(); string memberName = node.TryGetMemberName(true, true, nodes, members); if (memberName == null) { var relativeExp = nodes[0] as IRelativeSourceExpressionNode; if (relativeExp != null) { relativeExp.MergePath(string.Join(".", members)); return(relativeExp); } var methodCall = nodes[0] as MethodCallExpressionNode; if (methodCall != null && methodCall.Target is ResourceExpressionNode) { if (RelativeSourceAliases.Contains(methodCall.Method)) { if ((methodCall.Arguments.Count == 1 || methodCall.Arguments.Count == 2) && methodCall.Arguments[0] is IMemberExpressionNode) { int level = 1; var relativeType = (IMemberExpressionNode)methodCall.Arguments[0]; if (methodCall.Arguments.Count == 2) { level = (int)((IConstantExpressionNode)methodCall.Arguments[1]).Value; } return(new RelativeSourceExpressionNode(relativeType.Member, (uint)level, string.Join(".", members))); } } if (ElementSourceAliases.Contains(methodCall.Method)) { if (methodCall.Arguments.Count == 1 && methodCall.Arguments[0] is IMemberExpressionNode) { var elementSource = (IMemberExpressionNode)methodCall.Arguments[0]; return(new RelativeSourceExpressionNode(elementSource.Member, string.Join(".", members))); } } } } return(node); }
/// <summary> /// Dispatches the expression. /// </summary> /// <param name="node">The expression to visit.</param> /// <returns>The modified expression, if it or any subexpression was modified; otherwise, returns the original expression.</returns> public IExpressionNode Visit(IExpressionNode node) { var nodes = new List<IExpressionNode>(); var members = new List<string>(); string memberName = node.TryGetMemberName(true, true, nodes, members); if (memberName == null) { var relativeExp = nodes[0] as IRelativeSourceExpressionNode; if (relativeExp != null) { relativeExp.MergePath(BindingExtensions.MergePath(members)); return relativeExp; } var methodCall = nodes[0] as MethodCallExpressionNode; if (methodCall != null && methodCall.Target is ResourceExpressionNode) { if (RelativeSourceAliases.Contains(methodCall.Method)) { if ((methodCall.Arguments.Count == 1 || methodCall.Arguments.Count == 2) && methodCall.Arguments[0] is IMemberExpressionNode) { int level = 1; var relativeType = (IMemberExpressionNode)methodCall.Arguments[0]; if (methodCall.Arguments.Count == 2) level = (int)((IConstantExpressionNode)methodCall.Arguments[1]).Value; return RelativeSourceExpressionNode.CreateRelativeSource(relativeType.Member, (uint)level, BindingExtensions.MergePath(members)); } } if (ElementSourceAliases.Contains(methodCall.Method)) { if (methodCall.Arguments.Count == 1 && methodCall.Arguments[0] is IMemberExpressionNode) { var elementSource = (IMemberExpressionNode)methodCall.Arguments[0]; return RelativeSourceExpressionNode.CreateElementSource(elementSource.Member, BindingExtensions.MergePath(members)); } } } } return node; }
private object GetConstantValue(IExpressionNode argument) { var node = argument as IConstantExpressionNode; if (node != null) return node.Value; var name = argument.TryGetMemberName(false, false); if (name == null) throw BindingExceptionManager.InvalidExpressionParser(argument.ToString(), Tokenizer, Expression); return name; }
public IExpressionNode Visit(IExpressionNode node) { var member = node as IMemberExpressionNode; var resourceExpressionNode = member?.Target as ResourceExpressionNode; if (resourceExpressionNode != null) { //$self, $this --> $BindingServiceProvider.ResourceResolver.SelfResourceName if (member.Member == "self" || member.Member == "this") { if (resourceExpressionNode.Dynamic) { return(new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.SelfResourceName)); } return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetSelfMethod, null, null)); } //$context --> $BindingServiceProvider.ResourceResolver.DataContextResourceName if (member.Member == "context") { return(new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.DataContextResourceName)); } //$args, $arg --> $GetEventArgs() if (member.Member == "args" || member.Member == "arg") { return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetEventArgsMethod, null, null)); } //$binding --> $GetBinding() if (member.Member == "binding") { return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetBindingMethod, null, null)); } } var methodCallExp = node as IMethodCallExpressionNode; if (methodCallExp != null && methodCallExp.Target is ResourceExpressionNode) { //$OneTime(Expression) --> oneTimeImpl.GetValue(GetBinding(), () => Expression) if (methodCallExp.Method == "OneTime" && methodCallExp.Arguments.Count == 1) { DataConstant <object> constant = Guid.NewGuid().ToString("n"); var idEx = new ConstantExpressionNode(constant); var getBindEx = new MethodCallExpressionNode(ResourceExpressionNode.DynamicInstance, DefaultBindingParserHandler.GetBindingMethod, null, null); IExpressionNode getValueEx = new LambdaExpressionNode(methodCallExp.Arguments[0], null); return(new MethodCallExpressionNode(new ConstantExpressionNode(typeof(BindingExtensions)), "GetOrAddValue", new[] { getBindEx, idEx, getValueEx }, null).Accept(this)); } //Alias ($Format(), $MethodName, etc) --> type.Format() Type type; string method; if (BindingServiceProvider.ResourceResolver.TryGetMethodAlias(methodCallExp.Method, out type, out method)) { return(new MethodCallExpressionNode(new ConstantExpressionNode(type), method, methodCallExp.Arguments, methodCallExp.TypeArgs).Accept(this)); } } var nodes = new List <IExpressionNode>(); var members = new List <string>(); string memberName = node.TryGetMemberName(true, true, nodes, members); if (memberName == null) { var relativeExp = nodes[0] as IRelativeSourceExpressionNode; if (relativeExp != null) { relativeExp.MergePath(BindingExtensions.MergePath(members)); return(relativeExp); } var methodCall = nodes[0] as IMethodCallExpressionNode; if (methodCall != null && methodCall.Target is ResourceExpressionNode) { if (RelativeSourceAliases.Contains(methodCall.Method)) { if ((methodCall.Arguments.Count == 1 || methodCall.Arguments.Count == 2) && methodCall.Arguments[0] is IMemberExpressionNode) { int level = 1; var relativeType = (IMemberExpressionNode)methodCall.Arguments[0]; if (methodCall.Arguments.Count == 2) { level = (int)((IConstantExpressionNode)methodCall.Arguments[1]).Value; } return(RelativeSourceExpressionNode.CreateRelativeSource(relativeType.Member, (uint)level, BindingExtensions.MergePath(members))); } } if (ElementSourceAliases.Contains(methodCall.Method)) { if (methodCall.Arguments.Count == 1 && methodCall.Arguments[0] is IMemberExpressionNode) { var elementSource = (IMemberExpressionNode)methodCall.Arguments[0]; return(RelativeSourceExpressionNode.CreateElementSource(elementSource.Member, BindingExtensions.MergePath(members))); } } } } return(node); }
private IExpressionNode VisitExpression(IExpressionNode node) { var nodes = new List<IExpressionNode>(); string memberName = node.TryGetMemberName(true, true, nodes); if (memberName == null) { _isMulti = true; return node; } if (nodes[0] is ResourceExpressionNode) return GetResourceMember(node, memberName, nodes); IBindingPath path = BindingServiceProvider.BindingPathFactory(memberName); if (path.IsEmpty) return GetOrAddBindingMember(memberName, (s, i) => new BindingMemberExpressionNode(memberName, s, i)); string firstMember = path.Parts[0]; if (_lamdaParameters.Contains(firstMember)) return node; return GetOrAddBindingMember(memberName, (s, i) => new BindingMemberExpressionNode(memberName, s, i)); }
public IExpressionNode Visit(IExpressionNode node) { var member = node as IMemberExpressionNode; if (member != null && member.Target is ResourceExpressionNode) { //$self, $this --> $BindingServiceProvider.ResourceResolver.SelfResourceName if (member.Member == "self" || member.Member == "this") return new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.SelfResourceName); //$context --> $BindingServiceProvider.ResourceResolver.DataContextResourceName if (member.Member == "context") return new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.DataContextResourceName); //$args, $arg --> $GetEventArgs() if (member.Member == "args" || member.Member == "arg") return new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetEventArgsMethod, null, null); //$binding --> $GetBinding() if (member.Member == "binding") return new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetBindingMethod, null, null); } var methodCallExp = node as IMethodCallExpressionNode; if (methodCallExp != null && methodCallExp.Target is ResourceExpressionNode) { //$OneTime(Expression) --> oneTimeImpl.GetValue(GetBinding(), () => Expression) if (methodCallExp.Method == "OneTime" && methodCallExp.Arguments.Count == 1) { DataConstant<object> constant = Guid.NewGuid().ToString("n"); var idEx = new ConstantExpressionNode(constant); var getBindEx = new MethodCallExpressionNode(ResourceExpressionNode.DynamicInstance, DefaultBindingParserHandler.GetBindingMethod, null, null); IExpressionNode getValueEx = new LambdaExpressionNode(methodCallExp.Arguments[0], null); return new MethodCallExpressionNode(new ConstantExpressionNode(typeof(BindingExtensions)), "GetOrAddValue", new[] { getBindEx, idEx, getValueEx }, null).Accept(this); } //Alias ($Format(), $MethodName, etc) --> type.Format() Type type; string method; if (BindingServiceProvider.ResourceResolver.TryGetMethodAlias(methodCallExp.Method, out type, out method)) return new MethodCallExpressionNode(new ConstantExpressionNode(type), method, methodCallExp.Arguments, methodCallExp.TypeArgs).Accept(this); } var nodes = new List<IExpressionNode>(); var members = new List<string>(); string memberName = node.TryGetMemberName(true, true, nodes, members); if (memberName == null) { var relativeExp = nodes[0] as IRelativeSourceExpressionNode; if (relativeExp != null) { relativeExp.MergePath(BindingExtensions.MergePath(members)); return relativeExp; } var methodCall = nodes[0] as IMethodCallExpressionNode; if (methodCall != null && methodCall.Target is ResourceExpressionNode) { if (RelativeSourceAliases.Contains(methodCall.Method)) { if ((methodCall.Arguments.Count == 1 || methodCall.Arguments.Count == 2) && methodCall.Arguments[0] is IMemberExpressionNode) { int level = 1; var relativeType = (IMemberExpressionNode)methodCall.Arguments[0]; if (methodCall.Arguments.Count == 2) level = (int)((IConstantExpressionNode)methodCall.Arguments[1]).Value; return RelativeSourceExpressionNode.CreateRelativeSource(relativeType.Member, (uint)level, BindingExtensions.MergePath(members)); } } if (ElementSourceAliases.Contains(methodCall.Method)) { if (methodCall.Arguments.Count == 1 && methodCall.Arguments[0] is IMemberExpressionNode) { var elementSource = (IMemberExpressionNode)methodCall.Arguments[0]; return RelativeSourceExpressionNode.CreateElementSource(elementSource.Member, BindingExtensions.MergePath(members)); } } } } return node; }
private Action<IDataContext> GetBindingValueSetterMain(IExpressionNode node, Action<IDataContext, object> setSimpleValue, Action<IDataContext, Func<IDataContext, object>> setComplexValue, bool useBindingForMember) { var constantNode = node as IConstantExpressionNode; if (constantNode != null) { object value = constantNode.Value; return context => setSimpleValue(context, value); } var nodes = new List<IExpressionNode>(); var members = new List<string>(); string memberName = node.TryGetMemberName(true, true, nodes, members); var resourceExpression = nodes[0] as ResourceExpressionNode; if (memberName != null) { if (resourceExpression != null) { if (resourceExpression.Dynamic) return context => setComplexValue(context, d => GetResourceObject(memberName, d)); return context => setSimpleValue(context, GetResourceObject(memberName, context)); } if (!useBindingForMember) return context => setSimpleValue(context, memberName); node = RelativeSourceExpressionNode.CreateBindingContextSource(memberName); } var methodCall = nodes[0] as IMethodCallExpressionNode; if (methodCall == null) { var relativeSrc = node as IRelativeSourceExpressionNode; if (relativeSrc == null) throw BindingExceptionManager.UnknownIdentifierParser(node.ToString(), Tokenizer, Expression); return context => { var src = BindingExtensions.CreateBindingSource(relativeSrc, context.GetData(BindingBuilderConstants.Target, true), null); setComplexValue(context, d => src.GetCurrentValue()); }; } resourceExpression = methodCall.Target as ResourceExpressionNode; if (resourceExpression == null || methodCall.Arguments.Any(expressionNode => !(expressionNode is IConstantExpressionNode))) throw BindingExceptionManager.UnknownIdentifierParser(node.ToString(), Tokenizer, Expression); var method = methodCall.Method; var args = methodCall.Arguments.ToArrayEx(ex => ((IConstantExpressionNode)ex).Value); var memberPath = members.Count == 0 ? null : BindingExtensions.MergePath(members); if (resourceExpression.Dynamic) return context => setComplexValue(context, d => InvokeMethod(d, method, args, memberPath)); return context => setSimpleValue(context, InvokeMethod(context, method, args, memberPath)); }
public IExpressionNode Visit(IExpressionNode node) { var member = node as IMemberExpressionNode; if (member != null && member.Target is ResourceExpressionNode) { //$self, $this --> $BindingServiceProvider.ResourceResolver.SelfResourceName if (member.Member == "self" || member.Member == "this") { return(new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.SelfResourceName)); } //$context --> $BindingServiceProvider.ResourceResolver.DataContextResourceName if (member.Member == "context") { return(new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.DataContextResourceName)); } //$args, $arg --> $GetEventArgs() if (member.Member == "args" || member.Member == "arg") { return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetEventArgsMethod, Empty.Array <IExpressionNode>(), Empty.Array <string>())); } } var methodCallExp = node as IMethodCallExpressionNode; if (methodCallExp != null && methodCallExp.Target is ResourceExpressionNode) { //$Format() --> string.Format() if (methodCallExp.Method == "Format") { return(new MethodCallExpressionNode(new ConstantExpressionNode(typeof(string)), methodCallExp.Method, methodCallExp.Arguments, methodCallExp.TypeArgs)); } //$OneTime(Expression) --> oneTimeImpl.GetValue(() => Expression) if (methodCallExp.Method == "OneTime" && methodCallExp.Arguments.Count == 1) { var item = new ConstantExpressionNode(new OneTimeImpl()); IExpressionNode parameter = new LambdaExpressionNode(methodCallExp.Arguments[0], null); return(new MethodCallExpressionNode(item, OneTimeImpl.GetValueMethodName, new[] { parameter }, null)); } } var nodes = new List <IExpressionNode>(); var members = new List <string>(); string memberName = node.TryGetMemberName(true, true, nodes, members); if (memberName == null) { var relativeExp = nodes[0] as IRelativeSourceExpressionNode; if (relativeExp != null) { relativeExp.MergePath(BindingExtensions.MergePath(members)); return(relativeExp); } var methodCall = nodes[0] as IMethodCallExpressionNode; if (methodCall != null && methodCall.Target is ResourceExpressionNode) { if (RelativeSourceAliases.Contains(methodCall.Method)) { if ((methodCall.Arguments.Count == 1 || methodCall.Arguments.Count == 2) && methodCall.Arguments[0] is IMemberExpressionNode) { int level = 1; var relativeType = (IMemberExpressionNode)methodCall.Arguments[0]; if (methodCall.Arguments.Count == 2) { level = (int)((IConstantExpressionNode)methodCall.Arguments[1]).Value; } return(RelativeSourceExpressionNode.CreateRelativeSource(relativeType.Member, (uint)level, BindingExtensions.MergePath(members))); } } if (ElementSourceAliases.Contains(methodCall.Method)) { if (methodCall.Arguments.Count == 1 && methodCall.Arguments[0] is IMemberExpressionNode) { var elementSource = (IMemberExpressionNode)methodCall.Arguments[0]; return(RelativeSourceExpressionNode.CreateElementSource(elementSource.Member, BindingExtensions.MergePath(members))); } } } } return(node); }