private LuaExpressionSyntax BuildLetClause(LuaExpressionSyntax collection, LetClauseSyntax node, ref IQueryRangeVariable rangeVariable)
        {
            var letExpression    = (LuaExpressionSyntax)node.Expression.Accept(this);
            var letRangeVariable = AddRangeIdentifier(node.Identifier);
            var anonymousType    = CreateQueryAnonymousType(rangeVariable.Name, rangeVariable.Name, letRangeVariable.Name, letExpression);

            var selectFunction = new LuaFunctionExpressionSyntax();

            selectFunction.AddParameter(rangeVariable.Name);
            selectFunction.AddStatement(new LuaReturnStatementSyntax(anonymousType));

            rangeVariable = new QueryPackVariable(rangeVariable, letRangeVariable);
            return(new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.LinqSelect, collection, selectFunction, LuaIdentifierNameSyntax.AnonymousType));
        }
        private bool BuildQueryJoin(JoinClauseSyntax node, out LuaExpressionSyntax resultSelectorExpression, out LuaExpressionSyntax resultSelectorType, ref IQueryRangeVariable rangeVariable, QueryIdentifier queryIdentifier)
        {
            var parentNode = (QueryBodySyntax)node.Parent;

            if (IsSpecialQueryNode(parentNode))
            {
                var selectClause = (SelectClauseSyntax)parentNode.SelectOrGroup;
                resultSelectorExpression = (LuaExpressionSyntax)selectClause.Expression.Accept(this);
                var typeSymbol = semanticModel_.GetTypeInfo(selectClause.Expression).Type;
                resultSelectorType = GetTypeName(typeSymbol);
                return(true);
            }
            else
            {
                resultSelectorExpression = CreateQueryAnonymousType(rangeVariable.Name, rangeVariable.Name, queryIdentifier.Name, queryIdentifier.Name);
                resultSelectorType       = LuaIdentifierNameSyntax.AnonymousType;
                rangeVariable            = new QueryPackVariable(rangeVariable, queryIdentifier);
                return(false);
            }
        }
Beispiel #3
0
        private LuaExpressionSyntax BuildFromClause(LuaExpressionSyntax collection, FromClauseSyntax node, ref IQueryRangeVariable rangeVariable, out bool isOver)
        {
            var collectionSelector = new LuaFunctionExpressionSyntax();

            PushFunction(collectionSelector);
            collectionSelector.AddParameter(rangeVariable.Name);
            var expression = (LuaExpressionSyntax)node.Expression.Accept(this);

            collectionSelector.AddStatement(new LuaReturnStatementSyntax(expression));
            PopFunction();

            var rangeVariable2 = AddRangeIdentifier(node.Identifier);
            var resultSelector = new LuaFunctionExpressionSyntax();

            PushFunction(resultSelector);
            resultSelector.AddParameter(rangeVariable.Name);
            resultSelector.AddParameter(rangeVariable2.Name);
            LuaExpressionSyntax resultSelectorExpression;
            LuaExpressionSyntax resultSelectorType;
            var parentNode = (QueryBodySyntax)node.Parent;

            if (IsSpecialQueryNode(parentNode))
            {
                var selectClause = (SelectClauseSyntax)parentNode.SelectOrGroup;
                resultSelectorExpression = (LuaExpressionSyntax)selectClause.Expression.Accept(this);
                var type = semanticModel_.GetTypeInfo(selectClause.Expression).Type;
                resultSelectorType = GetTypeName(type);
                isOver             = true;
            }
            else
            {
                resultSelectorExpression = CreateQueryAnonymousType(rangeVariable.Name, rangeVariable.Name, rangeVariable2.Name, rangeVariable2.Name);
                resultSelectorType       = LuaIdentifierNameSyntax.AnonymousType;
                rangeVariable            = new QueryPackVariable(rangeVariable, rangeVariable2);
                isOver = false;
            }
            resultSelector.AddStatement(new LuaReturnStatementSyntax(resultSelectorExpression));
            PopFunction();
            return(new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.LinqSelectMany, collection, collectionSelector, resultSelector, resultSelectorType));
        }