From a498484d51e619807de0635e1b50adb6f2f1ef03 Mon Sep 17 00:00:00 2001 From: Alex Boyko Date: Fri, 4 Aug 2023 23:43:13 -0400 Subject: [PATCH 1/3] Re-enable snapshot build on every push --- .../snapshot-eclipse-ls-extensions-build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/snapshot-eclipse-ls-extensions-build.yml b/.github/workflows/snapshot-eclipse-ls-extensions-build.yml index c0307c642..d2f9a7771 100644 --- a/.github/workflows/snapshot-eclipse-ls-extensions-build.yml +++ b/.github/workflows/snapshot-eclipse-ls-extensions-build.yml @@ -4,16 +4,16 @@ concurrency: group: eclipse-ls-extension-snapshot cancel-in-progress: true +# on: +# workflow_dispatch: on: - workflow_dispatch: -#on: -# push: -# branches: -# - 'main' + push: + branches: + - 'main' jobs: eclipse-ls-extensions: uses: ./.github/workflows/eclipse-ls-extensions-build.yml with: build_type: 'snapshot' - secrets: inherit \ No newline at end of file + secrets: inherit From 8de18fd4e311332ad21abafab9db290100b36e12 Mon Sep 17 00:00:00 2001 From: aboyko Date: Wed, 9 Aug 2023 23:48:13 -0400 Subject: [PATCH 2/3] Missed Rewrite adoption fixes --- .../commons/rewrite/java/DefineMethod.java | 17 +++- .../commons/rewrite/java/ORAstUtils.java | 38 ++------- .../NoRequestMappingAnnotationCodeAction.java | 6 +- .../order/EventPublicationRegistryTests.java | 82 ------------------- 4 files changed, 26 insertions(+), 117 deletions(-) delete mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/spring-modulith-example-full/src/test/java/org/example/order/EventPublicationRegistryTests.java diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/DefineMethod.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/DefineMethod.java index ba43f2699..601321449 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/DefineMethod.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/DefineMethod.java @@ -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; diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ORAstUtils.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ORAstUtils.java index 06f432592..82aa89673 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ORAstUtils.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ORAstUtils.java @@ -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> getAfterVisitors(TreeVisitor visitor) { - try { - Method m = TreeVisitor.class.getDeclaredMethod("getAfterVisit"); - m.setAccessible(true); - return (List>) m.invoke(visitor); - } catch (Exception e) { - return Collections.emptyList(); - } - } - - private static void makeVisitorNonTopLevel(TreeVisitor 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 v, Predicate condition) { return new NodeRecipe((JavaVisitor) v, condition); } @@ -415,8 +393,13 @@ public class ORAstUtils { this.visitor = treeVisitor; this.condition = condition; } - + @Override + public List 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 v : getAfterVisitors(visitor)) { - doAfterVisit(v); - } - return t; + return (J) visitor.visit(t, ctx, getCursor()); } } return super.visit(tree, ctx); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java index 2a95eb75c..78103a2d4 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java @@ -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)) diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/spring-modulith-example-full/src/test/java/org/example/order/EventPublicationRegistryTests.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/spring-modulith-example-full/src/test/java/org/example/order/EventPublicationRegistryTests.java deleted file mode 100644 index 92adb7718..000000000 --- a/headless-services/spring-boot-language-server/src/test/resources/test-projects/spring-modulith-example-full/src/test/java/org/example/order/EventPublicationRegistryTests.java +++ /dev/null @@ -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; - } - } - } -} From 61089ad04f6597e723fe8db4849ffc00c2981531 Mon Sep 17 00:00:00 2001 From: aboyko Date: Fri, 11 Aug 2023 16:46:57 -0400 Subject: [PATCH 3/3] Include test code if main type from test java sources --- .../launch/BootLaunchConfigurationDelegate.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/eclipse-extensions/org.springframework.ide.eclipse.boot.launch/src/org/springframework/ide/eclipse/boot/launch/BootLaunchConfigurationDelegate.java b/eclipse-extensions/org.springframework.ide.eclipse.boot.launch/src/org/springframework/ide/eclipse/boot/launch/BootLaunchConfigurationDelegate.java index 4c9224f9d..f22509a79 100644 --- a/eclipse-extensions/org.springframework.ide.eclipse.boot.launch/src/org/springframework/ide/eclipse/boot/launch/BootLaunchConfigurationDelegate.java +++ b/eclipse-extensions/org.springframework.ide.eclipse.boot.launch/src/org/springframework/ide/eclipse/boot/launch/BootLaunchConfigurationDelegate.java @@ -37,9 +37,12 @@ import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jdt.launching.IRuntimeClasspathEntry; import org.eclipse.jdt.launching.JavaRuntime; @@ -518,9 +521,22 @@ public class BootLaunchConfigurationDelegate extends AbstractBootLaunchConfigura projectName+" - "+shortTypeName)); BootLaunchConfigurationDelegate.setDefaults(wc, project, typeName); wc.setMappedResources(new IResource[] {type.getUnderlyingResource()}); + wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_EXCLUDE_TEST_CODE, !isTestCode(type)); return wc; } + private static boolean isTestCode(IType type) throws JavaModelException { + IPackageFragmentRoot packageFragmentRoot = (IPackageFragmentRoot) type.getPackageFragment().getParent(); + IJavaProject javaProject = packageFragmentRoot.getJavaProject(); + if (javaProject != null) { + IClasspathEntry entry = javaProject.getClasspathEntryFor(packageFragmentRoot.getPath()); + if (entry != null && !entry.isTest()) { + return false; + } + } + return true; + } + public static ILaunchConfiguration createConf(IProject project) throws CoreException { return createConf(JavaCore.create(project)); }