Example #1
0
        public override object VisitQueryExpression(QueryExpression queryExpression, object data)
        {
            if (this.queryExpression != null)             // prevent endloss loop: var n = from n select n; n.$ (doesn't make sense, but you can type this)
            {
                return(null);
            }
            this.queryExpression = queryExpression;
            IReturnType type = null;
            QueryExpressionSelectClause selectClause = queryExpression.SelectOrGroupClause as QueryExpressionSelectClause;

            if (selectClause != null)
            {
                InvocationExpression selectInvocation = new InvocationExpression(new MemberReferenceExpression(queryExpression.FromClause.InExpression, "Select"));
                LambdaExpression     selectLambdaExpr = new LambdaExpression();
                selectLambdaExpr.Parent = selectInvocation;
                selectLambdaExpr.Parameters.Add(new ParameterDeclarationExpression(null, "par"));
                selectLambdaExpr.ExpressionBody = selectClause.Projection;
                TypeReference typeRef = new TypeReference("System.Func");
                typeRef.GenericTypes.Add(TypeReference.Null);
                ResolveResult result = resolver.ResolveExpression(selectLambdaExpr, resolver.ResolvePosition, false);

                typeRef.GenericTypes.Add(NRefactoryResolver.ConvertToTypeReference(result.ResolvedType));

                ObjectCreateExpression createExpression = new ObjectCreateExpression(typeRef, new List <Expression> (new Expression [] {
                    null,
                    selectLambdaExpr
                }));

                selectInvocation.Arguments.Add(createExpression);
                return(CreateResult(ResolveType(selectInvocation)));
            }

            QueryExpressionGroupClause groupClause = queryExpression.SelectOrGroupClause as QueryExpressionGroupClause;

            if (groupClause != null)
            {
                InvocationExpression groupInvocation = new InvocationExpression(new MemberReferenceExpression(queryExpression.FromClause.InExpression, "GroupBy"));

                LambdaExpression keyLambdaExpr = new LambdaExpression();
                keyLambdaExpr.Parent = groupInvocation;
                keyLambdaExpr.Parameters.Add(new ParameterDeclarationExpression(null, "par"));
                keyLambdaExpr.ExpressionBody = groupClause.GroupBy;
                groupInvocation.Arguments.Add(keyLambdaExpr);

                LambdaExpression elementLambdaExpr = new LambdaExpression();
                elementLambdaExpr.Parent = groupInvocation;
                elementLambdaExpr.Parameters.Add(new ParameterDeclarationExpression(null, "par"));
                elementLambdaExpr.ExpressionBody = groupClause.Projection;
                groupInvocation.Arguments.Add(elementLambdaExpr);
                return(CreateResult(ResolveType(groupInvocation)));
            }

            if (type != null)
            {
                return(CreateResult(new DomReturnType("System.Collections.Generic.IEnumerable", false, new List <IReturnType> (new IReturnType[] { type }))));
            }
            return(null);
        }