Skip to content

Commit 517ffa7

Browse files
authored
C#: Improve TreeVisitor combining and handle null expression statements (#7435)
1 parent 5cac27f commit 517ffa7

3 files changed

Lines changed: 23 additions & 9 deletions

File tree

rewrite-csharp/csharp/OpenRewrite/Core/Preconditions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,15 @@ public static ITreeVisitor<ExecutionContext> And(
6767
{
6868
return new AndVisitor(visitors);
6969
}
70+
71+
public static ITreeVisitor<ExecutionContext> And(this ITreeVisitor<ExecutionContext> first, params ITreeVisitor<ExecutionContext>[] others)
72+
{
73+
return And(others.Prepend(first).ToArray());
74+
}
75+
76+
public static ITreeVisitor<ExecutionContext> And(
77+
params Recipe[] recipes)
78+
{
79+
return new AndVisitor(recipes.Select(x => x.GetVisitor()).ToArray());
80+
}
7081
}

rewrite-csharp/csharp/OpenRewrite/Core/TreeVisitor.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,13 @@ public static class TreeVisitorExtensions
154154
{
155155
public static ITreeVisitor<T> Combine<T>(this ITreeVisitor<T> first, ITreeVisitor<T> second) where T : class
156156
{
157-
return new TreeVisitor<T>(first, second);
157+
return new CombinedTreeVisitor<T>(first, second);
158158
}
159-
private class TreeVisitor<T>(ITreeVisitor<T> first, ITreeVisitor<T> second) : ITreeVisitor<T>
159+
public static ITreeVisitor<T> Combine<T>(this IEnumerable<ITreeVisitor<T>> visitors) where T : class => new CombinedTreeVisitor<T>(visitors);
160+
public static ITreeVisitor<ExecutionContext> GetVisitor(this Recipe[] recipes) => recipes.Select(x => x.GetVisitor()).Combine();
161+
162+
private class CombinedTreeVisitor<T>(params IEnumerable<ITreeVisitor<T>> visitors) : ITreeVisitor<T>
160163
{
161-
public Tree? Visit(Tree? tree, T p)
162-
{
163-
tree = first.Visit(tree, p);
164-
tree = second.Visit(tree, p);
165-
return tree;
166-
}
164+
public Tree? Visit(Tree? tree, T p) => visitors.Aggregate(tree, (current, visitor) => visitor.Visit(current, p));
167165
}
168166
}

rewrite-csharp/src/main/java/org/openrewrite/csharp/CSharpVisitor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,12 @@ public J visitExpressionStatement(Cs.ExpressionStatement expressionStatement, P
372372
}
373373
expressionStatement = (Cs.ExpressionStatement) tempStatement;
374374
expressionStatement = expressionStatement.withMarkers(visitMarkers(expressionStatement.getMarkers(), p));
375-
return expressionStatement.getPadding().withExpression(visitRightPadded(expressionStatement.getPadding().getExpression(), CsRightPadded.Location.EXPRESSION_STATEMENT_EXPRESSION, p));
375+
JRightPadded<Expression> expr = visitRightPadded(expressionStatement.getPadding().getExpression(), CsRightPadded.Location.EXPRESSION_STATEMENT_EXPRESSION, p);
376+
if (expr == null) {
377+
//noinspection DataFlowIssue
378+
return null;
379+
}
380+
return expressionStatement.getPadding().withExpression(expr);
376381
}
377382

378383
public J visitExternAlias(Cs.ExternAlias externAlias, P p) {

0 commit comments

Comments
 (0)