コード例 #1
0
        //private bool IsMethodMatching

        public override void ExitLambdaExpression([NotNull] SBP.LambdaExpressionContext context)
        {
            var lambdaExpressionCode = m_expressionData.Pop();

            lambdaExpressionCode = this.ResolveForGetOperation(lambdaExpressionCode);

            var scope        = m_scopeStack.Pop();
            var parameters   = new List <ParameterExpression>(scope.GetLambdaParameters());
            var delegateType = m_lambdaDelegateTargetType;


            if (m_lambdaParentRule == SBP.RULE_argument)
            {
                // Udfordringen: finde typen, som typisk er parameter til metoden som kaldes.
                // Dette er faktisk nødvendigt for at kende data-typen af parametrene til denne lambda-expression.

                // Det bør være sådan at ALLE input-parametre til delegate (lambda expression) er kendte, så en eventuelt
                // ukendt type for retur parameter kan bestemmes ved at parse lambda expression.
                // Det er derfor nødvendigt at der i denne parsing kan ignoreres at retur typen er ukendt.


                //m_scopeStack.Peek().AddStatementCode();

                if (delegateType == null)
                {
                    var methodGenericTypedef = m_lambdaLeftExpression.GetMethods().First();
                    var returnType           = lambdaExpressionCode.DataType;
                    int i = m_lambdaDelegateGenericArguments.FindIndex(tt => tt.Item2 == m_lambdaDelegateReturnType);
                    if (i >= 0)
                    {
                        m_lambdaDelegateGenericArguments[i] = new Tuple <string, Type>(m_lambdaDelegateGenericArguments[i].Item1, returnType.Type);
                        var method = methodGenericTypedef.MakeGenericMethod(m_lambdaDelegateGenericArguments);
                        m_lambdaLeftExpression.RemoveMethod(methodGenericTypedef);
                        m_lambdaLeftExpression.AddMethod(method);
                        bool isExtension    = method.IsExtension();
                        var  parameterIndex = m_argumentIndex + (isExtension ? 1 : 0);
                        delegateType = method.GetParameters()[parameterIndex].ParameterType;
                    }
                }
            }
            else if (m_lambdaParentRule == SBP.RULE_variableInitializer)
            {
                if (delegateType == null)
                {
                    var returnType = lambdaExpressionCode.DataType;
                    delegateType = Expression.GetDelegateType(
                        parameters.Select(p => p.Type).Concat(returnType.Type).ToArray());
                }
                else
                {
                    // TODO: Check the parameters.
                }
            }

            var lambda = Expression.Lambda(delegateType, lambdaExpressionCode.ExpressionCode, true, parameters);

            m_expressionData.Push(new SBExpressionData(lambda));
        }
コード例 #2
0
        public override void EnterLambdaExpression([NotNull] SBP.LambdaExpressionContext context)
        {
            m_lambdaDelegateTargetType       = null;
            m_lambdaDelegateGenericArguments = null;
            m_lambdaDelegateReturnType       = null;
            m_lambdaLeftExpression           = null;
            m_lambdaParentRule      = context.Parent.Parent.RuleIndex;
            m_lambdaTypedParameters = null;

            switch (m_lambdaParentRule)
            {
            case SBP.RULE_argument:
                m_lambdaLeftExpression = m_leftOfMethodCallExpression;
                break;

            case SBP.RULE_variableInitializer:
                break;

            default:
                throw new NotImplementedException();
            }
        }