Missed Rewrite adoption fixes

This commit is contained in:
aboyko
2023-08-09 23:48:13 -04:00
parent a498484d51
commit 8de18fd4e3
4 changed files with 26 additions and 117 deletions

View File

@@ -18,12 +18,14 @@ import java.util.stream.Collectors;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.internal.ListUtils;
import org.openrewrite.java.JavaIsoVisitor;
import org.openrewrite.java.JavaParser;
import org.openrewrite.java.JavaTemplate;
import org.openrewrite.java.MethodMatcher;
import org.openrewrite.java.tree.J;
import org.openrewrite.java.tree.JavaType;
import org.openrewrite.java.tree.JavaType.FullyQualified;
public class DefineMethod extends Recipe {
@@ -87,11 +89,22 @@ public class DefineMethod extends Recipe {
.classpath(classpath.stream().map(s -> Paths.get(s)).collect(Collectors.toList())))
.imports(imports.toArray(new String[imports.size()])).build();
J.Block body = t.apply(getCursor(), classDecl.getBody().getCoordinates().addMethodDeclaration((m, n) -> 1));
// TODO: why did this return ClassDEclaration rather than Block??? Figure this out!!!
J.ClassDeclaration templateClass = t.apply(getCursor(), classDecl.getBody().getCoordinates().addMethodDeclaration((m, n) -> 1));
FullyQualified classType = c.getType();
if (classType != null) {
J.Block body = templateClass.getBody().withStatements(ListUtils.map(templateClass.getBody().getStatements(), s -> {
if (s instanceof J.MethodDeclaration) {
J.MethodDeclaration m = (J.MethodDeclaration) s;
return m.withMethodType(m.getMethodType().withDeclaringType(classType));
}
return s;
}));
c = c.withBody(body);
}
for (String fq : imports) {
maybeAddImport(fq);
}
c = c.withBody(body);
}
}
return c;

View File

@@ -12,8 +12,6 @@ package org.springframework.ide.vscode.commons.rewrite.java;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.channels.ClosedByInterruptException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -39,6 +37,7 @@ import org.openrewrite.java.JavaParser;
import org.openrewrite.java.JavaParser.Builder;
import org.openrewrite.java.JavaParsingException;
import org.openrewrite.java.JavaVisitor;
import org.openrewrite.java.RemoveUnusedImports;
import org.openrewrite.java.UpdateSourcePositions;
import org.openrewrite.java.marker.JavaSourceSet;
import org.openrewrite.java.tree.J;
@@ -377,27 +376,6 @@ public class ORAstUtils {
return fqName;
}
@SuppressWarnings("unchecked")
private static List<TreeVisitor<?, ExecutionContext>> getAfterVisitors(TreeVisitor<?, ExecutionContext> visitor) {
try {
Method m = TreeVisitor.class.getDeclaredMethod("getAfterVisit");
m.setAccessible(true);
return (List<TreeVisitor<?, ExecutionContext>>) m.invoke(visitor);
} catch (Exception e) {
return Collections.emptyList();
}
}
private static void makeVisitorNonTopLevel(TreeVisitor<?, ExecutionContext> visitor) {
try {
Field f = TreeVisitor.class.getDeclaredField("afterVisit");
f.setAccessible(true);
f.set(visitor, new ArrayList<>());
} catch (Exception e) {
// ignore
}
}
public static Recipe nodeRecipe(JavaVisitor<ExecutionContext> v, Predicate<J> condition) {
return new NodeRecipe((JavaVisitor<ExecutionContext>) v, condition);
}
@@ -415,8 +393,13 @@ public class ORAstUtils {
this.visitor = treeVisitor;
this.condition = condition;
}
@Override
public List<Recipe> getRecipeList() {
return List.of(new RemoveUnusedImports());
}
@Override
public String getDisplayName() {
return "";
}
@@ -430,12 +413,7 @@ public class ORAstUtils {
if (tree instanceof J) {
J t = (J) tree;
if (condition.test(t)) {
makeVisitorNonTopLevel(visitor);
t = (J) visitor.visit(t, ctx, getCursor());
for (TreeVisitor<?, ExecutionContext> v : getAfterVisitors(visitor)) {
doAfterVisit(v);
}
return t;
return (J) visitor.visit(t, ctx, getCursor());
}
}
return super.visit(tree, ctx);

View File

@@ -48,9 +48,9 @@ public class NoRequestMappingAnnotationCodeAction implements RecipeCodeActionDes
String uri = getCursor().firstEnclosing(SourceFile.class).getSourcePath().toUri().toASCIIString();
FixAssistMarker fixAssistMarker = new FixAssistMarker(Tree.randomId(), getId())
.withFixes(
new FixDescriptor(ID, List.of(uri), RecipeCodeActionDescriptor.buildLabel(LABEL, RecipeScope.NODE))
.withRangeScope(a.getMarkers().findFirst(Range.class).get())
.withRecipeScope(RecipeScope.NODE),
// new FixDescriptor(ID, List.of(uri), RecipeCodeActionDescriptor.buildLabel(LABEL, RecipeScope.NODE))
// .withRangeScope(a.getMarkers().findFirst(Range.class).get())
// .withRecipeScope(RecipeScope.NODE),
new FixDescriptor(ID, List.of(uri), RecipeCodeActionDescriptor.buildLabel(LABEL, RecipeScope.FILE))
.withRecipeScope(RecipeScope.FILE),
new FixDescriptor(ID, List.of(uri), RecipeCodeActionDescriptor.buildLabel(LABEL, RecipeScope.PROJECT))

View File

@@ -1,82 +0,0 @@
/*
* Copyright 2022-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.example.order;
import static org.assertj.core.api.Assertions.*;
import org.example.order.Order;
import org.example.order.OrderCompleted;
import org.example.order.OrderManagement;
import org.example.order.EventPublicationRegistryTests.FailingAsyncTransactionalEventListener;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import org.springframework.modulith.ApplicationModuleListener;
import org.springframework.modulith.events.EventPublicationRegistry;
import org.springframework.modulith.test.ApplicationModuleTest;
import org.springframework.modulith.test.Scenario;
import org.springframework.test.annotation.DirtiesContext;
/**
* A show case for how the Spring Modulith application event publication registry keeps track of incomplete publications
* for failing transactional event listeners
*
* @author Oliver Drotbohm
*/
@ApplicationModuleTest
@Import(FailingAsyncTransactionalEventListener.class)
@DirtiesContext
@RequiredArgsConstructor
class EventPublicationRegistryTests {
private final OrderManagement orders;
private final EventPublicationRegistry registry;
private final FailingAsyncTransactionalEventListener listener;
@Test
void leavesPublicationIncompleteForFailingListener(Scenario scenario) throws Exception {
var order = new Order();
scenario.stimulate(() -> orders.complete(order))
.andWaitForStateChange(() -> listener.getEx())
.andVerify(__ -> {
assertThat(registry.findIncompletePublications()).hasSize(1);
});
}
static class FailingAsyncTransactionalEventListener {
@Getter Exception ex;
@ApplicationModuleListener
void foo(OrderCompleted event) {
var exception = new IllegalStateException("¯\\_(ツ)_/¯");
try {
throw exception;
} finally {
this.ex = exception;
}
}
}
}