Skip to content

Commit

Permalink
Use recursion to reduce scoping bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
GrahamTheCoder committed May 29, 2018
1 parent 570352d commit 9db166d
Showing 1 changed file with 34 additions and 26 deletions.
60 changes: 34 additions & 26 deletions ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1184,42 +1184,50 @@ private CSharpSyntaxNode ConvertClauses(SyntaxList<VBSyntax.QueryClauseSyntax> c
var vbFromClause = (VBSyntax.FromClauseSyntax) vbBodyClauses.Dequeue();
var fromClauseSyntax = ConvertFromClauseSyntax(vbFromClause);

var querySectionsReversed = new Stack<(SyntaxList<QueryClauseSyntax>, VBSyntax.QueryClauseSyntax)>();
var querySectionsReversed = new Queue<(SyntaxList<QueryClauseSyntax>, VBSyntax.QueryClauseSyntax)>();
while (vbBodyClauses.Any()) {
querySectionsReversed.Push(ConvertQueryBodyClauses(vbBodyClauses));
querySectionsReversed.Enqueue(ConvertQueryBodyClauses(vbBodyClauses));
}

QueryContinuationSyntax queryContinuation = null;
QueryBodySyntax nestedQueryBody = null;
while (querySectionsReversed.Any()) {
var (convertedClauses, clauseEnd) = querySectionsReversed.Pop();
SelectOrGroupClauseSyntax selectOrGroup = null;
switch (clauseEnd) {
case null:
selectOrGroup = CreateDefaultSelectClause(fromClauseSyntax);
break;
var query = ConvertClauseGroup(querySectionsReversed, fromClauseSyntax);
return SyntaxFactory.QueryExpression(fromClauseSyntax, query);
}

case VBSyntax.GroupByClauseSyntax gcs:
queryContinuation = CreateGroupByContinuation(gcs, convertedClauses, nestedQueryBody, queryContinuation);
selectOrGroup = ConvertGroupByClause(gcs);
break;
private QueryBodySyntax ConvertClauseGroup(Queue<(SyntaxList<QueryClauseSyntax>, VBSyntax.QueryClauseSyntax)> querySectionsReversed, FromClauseSyntax fromClauseSyntax)
{
if (!querySectionsReversed.Any()) return null;
var (convertedClauses, clauseEnd) = querySectionsReversed.Dequeue();

case VBSyntax.SelectClauseSyntax scs:
selectOrGroup = ConvertSelectClauseSyntax(scs);
break;
var nestedClause = ConvertClauseGroup(querySectionsReversed, fromClauseSyntax);
var (selectOrGroup, queryContinuation) = ConvertClause(fromClauseSyntax, clauseEnd, convertedClauses, nestedClause);

default:
throw new NotImplementedException($"Clause kind '{clauseEnd.Kind()}' is not yet implemented");
}
nestedQueryBody = SyntaxFactory.QueryBody(convertedClauses, selectOrGroup, queryContinuation);
}
return SyntaxFactory.QueryBody(convertedClauses, selectOrGroup, queryContinuation);
}

private (SelectOrGroupClauseSyntax, QueryContinuationSyntax) ConvertClause(FromClauseSyntax fromClauseSyntax, VBSyntax.QueryClauseSyntax clauseEnd, SyntaxList<QueryClauseSyntax> convertedClauses,
QueryBodySyntax nestedClause)
{
switch (clauseEnd)
{
case null:
return (CreateDefaultSelectClause(fromClauseSyntax), null);

return SyntaxFactory.QueryExpression(fromClauseSyntax, nestedQueryBody);
case VBSyntax.GroupByClauseSyntax gcs:
var queryContinuation = CreateGroupByContinuation(gcs, convertedClauses, nestedClause);
var selectOrGroup = ConvertGroupByClause(gcs);
return (selectOrGroup, queryContinuation);

case VBSyntax.SelectClauseSyntax scs:
return (ConvertSelectClauseSyntax(scs), null);

default:
throw new NotImplementedException($"Clause kind '{clauseEnd.Kind()}' is not yet implemented");
}
}

private QueryContinuationSyntax CreateGroupByContinuation(VBSyntax.GroupByClauseSyntax gcs, SyntaxList<QueryClauseSyntax> convertedClauses, QueryBodySyntax body, QueryContinuationSyntax queryContinuation)
private QueryContinuationSyntax CreateGroupByContinuation(VBSyntax.GroupByClauseSyntax gcs, SyntaxList<QueryClauseSyntax> convertedClauses, QueryBodySyntax body)
{
var queryBody = SyntaxFactory.QueryBody(convertedClauses, body?.SelectOrGroup, queryContinuation);
var queryBody = SyntaxFactory.QueryBody(convertedClauses, body?.SelectOrGroup, null);
return SyntaxFactory.QueryContinuation(GetGroupIdentifier(gcs), queryBody);
}

Expand Down

0 comments on commit 9db166d

Please sign in to comment.