public override Expression VisitPrimaryExpression([NotNull] RuleEngineParser.PrimaryExpressionContext context) { var primaryExpressionStartContext = context.primaryExpressionStart(); var expression = VisitPrimaryExpressionStart(primaryExpressionStartContext); var bracketExpressionContexts = context.bracketExpression();//Not Implemented var memberAccessContexts = context.memberAccess(); var methodInvocationContexts = context.methodInvocation(); if (memberAccessContexts.Length > 0 || memberAccessContexts.Length > 0) { for (int i = 1; i < context.ChildCount; i++) { var parseTree = context.GetChild(i); if (parseTree is RuleEngineParser.MemberAccessContext) { var constantExpression = VisitMemberAccess(parseTree as RuleEngineParser.MemberAccessContext) as ConstantExpression; var parseTree1 = context.GetChild(i + 1); if (parseTree1 is RuleEngineParser.MethodInvocationContext) { var blockExpression = VisitMethodInvocation(parseTree1 as RuleEngineParser.MethodInvocationContext) as BlockExpression; expression = Expression.Call(expression, expression.Type.GetMethod(constantExpression.Value.ToString(), blockExpression.Expressions.Select(v => v.Type).ToArray()), blockExpression.Expressions); i++; } else { expression = Expression.Property(expression, constantExpression.Value.ToString()); } } } } return(expression); }
/// <summary> /// Visit a parse tree produced by <see cref="RuleEngineParser.primaryExpression"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitPrimaryExpression([NotNull] RuleEngineParser.PrimaryExpressionContext context) { return(VisitChildren(context)); }