ICSharpCode.NRefactory.CSharp.CombineQueryExpressions.CombineQuery C# (CSharp) Method

CombineQuery() public method

public CombineQuery ( AstNode node, AstNode rootQuery = null ) : string
node AstNode
rootQuery AstNode
return string
		public string CombineQuery(AstNode node, AstNode rootQuery = null)
		{
			if (rootQuery == null) {
				rootQuery = node;
			}

			QueryExpression query = node as QueryExpression;
			if (query != null) {
				string continuationIdentifier = null;

				foreach (var clause in query.Clauses) {
					var continuation = clause as QueryContinuationClause;
					if (continuation != null) {
						CombineQuery(continuation.PrecedingQuery);
					}

					var from = clause as QueryFromClause;
					if (from != null) {
						continuationIdentifier = CombineQuery(from.Expression, rootQuery);
					}
				}

				QueryFromClause fromClause = (QueryFromClause)query.Clauses.First();
				QueryExpression innerQuery = fromClause.Expression as QueryExpression;
				if (innerQuery != null) {
					continuationIdentifier = continuationIdentifier ?? ((QueryFromClause)innerQuery.Clauses.First()).Identifier;

					string transparentIdentifier;
					if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery, continuationIdentifier, out transparentIdentifier)) {
						RemoveTransparentIdentifierReferences(rootQuery, transparentIdentifier);
					} else if (fromClause.Type.IsNull) {
						QueryContinuationClause continuation = new QueryContinuationClause();
						continuation.PrecedingQuery = innerQuery.Detach();
						continuation.Identifier = fromClause.Identifier;
						fromClause.ReplaceWith(continuation);
					}

					return transparentIdentifier;
				} else {
					Match m = castPattern.Match(fromClause.Expression);
					if (m.Success) {
						fromClause.Type = m.Get<AstType>("targetType").Single().Detach();
						fromClause.Expression = m.Get<Expression>("inExpr").Single().Detach();
					}
				}
			}

			return null;
		}