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); } }
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)); }