Missed Rewrite adoption fixes
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user