diff --git a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameRecipe.java b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameRecipe.java index eb622dcb0..65533abcf 100644 --- a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameRecipe.java +++ b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameRecipe.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 VMware, Inc. + * Copyright (c) 2022, 2023 VMware, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -30,7 +30,7 @@ public class HelloMethodRenameRecipe extends Recipe { } @Override - protected TreeVisitor getVisitor() { + public TreeVisitor getVisitor() { return new JavaIsoVisitor<>() { @Override diff --git a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/OssPackageRecipe.java b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/OssPackageRecipe.java index e8cef39a6..bb949a610 100644 --- a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/OssPackageRecipe.java +++ b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/OssPackageRecipe.java @@ -10,13 +10,21 @@ *******************************************************************************/ package org.springframework.rewrite.test; +import org.openrewrite.ExecutionContext; import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; import org.openrewrite.java.ChangePackage; public class OssPackageRecipe extends Recipe { - public OssPackageRecipe() { - doNext(new ChangePackage("com.example", "org.example", true)); + @Override + public String getDescription() { + return "Change package 'com.example' to 'org.example'"; + } + + @Override + public TreeVisitor getVisitor() { + return new ChangePackage("com.example", "org.example", true).getVisitor(); } @Override diff --git a/headless-services/commons/commons-rewrite/pom.xml b/headless-services/commons/commons-rewrite/pom.xml index 006b7ee57..a26fb5a24 100644 --- a/headless-services/commons/commons-rewrite/pom.xml +++ b/headless-services/commons/commons-rewrite/pom.xml @@ -107,7 +107,73 @@ org.gradle gradle-tooling-api - 7.6 + ${gradle-tooling.version} + runtime + + + org.gradle + gradle-base-services + ${gradle-core.version} + runtime + + + org.gradle + gradle-core-api + ${gradle-core.version} + runtime + + + org.gradle + gradle-language-groovy + ${gradle-core.version} + runtime + + + org.gradle + gradle-language-java + ${gradle-core.version} + runtime + + + org.gradle + gradle-logging + ${gradle-core.version} + runtime + + + org.gradle + gradle-messaging + ${gradle-core.version} + runtime + + + org.gradle + gradle-native + ${gradle-core.version} + runtime + + + org.gradle + gradle-process-services + ${gradle-core.version} + runtime + + + org.gradle + gradle-resources + ${gradle-core.version} + runtime + + + org.gradle + gradle-testing-base + ${gradle-core.version} + runtime + + + org.gradle + gradle-testing-jvm + ${gradle-core.version} runtime diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/LoadUtils.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/LoadUtils.java index 88757b379..db6de870c 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/LoadUtils.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/LoadUtils.java @@ -57,7 +57,7 @@ public class LoadUtils { DeclarativeRecipe recipe = new DeclarativeRecipe(d.getName(), d.getDisplayName(), d.getDescription(), d.getTags(), d.getEstimatedEffortPerOccurrence(), d.getSource(), false, d.getMaintainers()); for (RecipeDescriptor subDescriptor : d.getRecipeList()) { - recipe.doNext(createRecipe(subDescriptor, getRecipeClass)); + recipe.getRecipeList().add(createRecipe(subDescriptor, getRecipeClass)); } return recipe; } else { diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/gradle/GradleIJavaProjectParser.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/gradle/GradleIJavaProjectParser.java index 559ea28fc..de98345a7 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/gradle/GradleIJavaProjectParser.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/gradle/GradleIJavaProjectParser.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.openrewrite.ExecutionContext; @@ -28,6 +29,7 @@ import org.openrewrite.gradle.marker.GradleProject; import org.openrewrite.gradle.toolingapi.OpenRewriteModel; import org.openrewrite.gradle.toolingapi.OpenRewriteModelBuilder; import org.openrewrite.groovy.GroovyParser; +import org.openrewrite.groovy.tree.G; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaParser.Builder; import org.openrewrite.java.marker.JavaProject; @@ -72,9 +74,10 @@ public class GradleIJavaProjectParser extends AbstractJavaProjectParser { Path buildFilePath = Paths.get(jp.getProjectBuild().getBuildFile()); + List gradleFiles = gradleParser.parseInputs(() -> + getInputs(Stream.of(buildFilePath)).iterator(), null, ctx).collect(Collectors.toList()); return ListUtils.map( - gradleParser.parseInputs(() -> - getInputs(Stream.of(buildFilePath)).iterator(), null, ctx), gb -> gb.withMarkers(gb.getMarkers().addIfAbsent(gradleProject)) + gradleFiles, (i, gb) -> gb.withMarkers(gb.getMarkers().addIfAbsent(gradleProject)) ); } diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/BeanPostProcessingIgnoreInAot.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/BeanPostProcessingIgnoreInAot.java index 5766fa60c..d29b13fbc 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/BeanPostProcessingIgnoreInAot.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/BeanPostProcessingIgnoreInAot.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 VMware, Inc. + * Copyright (c) 2022, 2023 VMware, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.java.JavaIsoVisitor; @@ -22,6 +23,7 @@ import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeUtils; +import org.openrewrite.marker.SearchResult; public class BeanPostProcessingIgnoreInAot extends Recipe { @@ -80,57 +82,56 @@ public class BeanPostProcessingIgnoreInAot extends Recipe { } @Override - protected TreeVisitor getApplicableTest() { - return new JavaIsoVisitor() { - @Override - public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext executionContext) { - if (isApplicableClass(classDecl)) { - return classDecl.withMarkers(classDecl.getMarkers().searchResult()); - } - return super.visitClassDeclaration(classDecl, executionContext); - } - }; - } + public TreeVisitor getVisitor() { + return Preconditions.check( + new JavaIsoVisitor() { + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, + ExecutionContext executionContext) { + if (isApplicableClass(classDecl)) { + return SearchResult.found(classDecl); + } + return super.visitClassDeclaration(classDecl, executionContext); + } + }, + new JavaIsoVisitor() { - @Override - protected TreeVisitor getVisitor() { - return new JavaIsoVisitor() { + private JavaTemplate createTemplate() { + return JavaTemplate.builder("@Override\n" + + "public boolean isBeanExcludedFromAotProcessing() {\n" + + " return false;\n" + + "}\n" + ) + .javaParser(JavaParser.fromJavaVersion()) + .build(); + } - private JavaTemplate createTemplate() { - return JavaTemplate.builder(this::getCursor, "@Override\n" - + "public boolean isBeanExcludedFromAotProcessing() {\n" - + " return false;\n" - + "}\n" - ) - .javaParser(() -> JavaParser.fromJavaVersion().build()) - .build(); - } + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext executionContext) { + J.ClassDeclaration c = super.visitClassDeclaration(classDecl, executionContext); + if (isApplicableClass(classDecl)) { + J.MethodDeclaration method = c.getBody().getStatements().stream().filter(J.MethodDeclaration.class::isInstance).map(J.MethodDeclaration.class::cast).filter(BeanPostProcessingIgnoreInAot::isApplicableMethod).findFirst().orElse(null); + if (method == null) { + c = c.withBody(createTemplate().apply(getCursor(), classDecl.getBody().getCoordinates().addMethodDeclaration((m1, m2) -> 1))); + } + } + return c; + } - @Override - public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext executionContext) { - J.ClassDeclaration c = super.visitClassDeclaration(classDecl, executionContext); - if (isApplicableClass(classDecl)) { - J.MethodDeclaration method = c.getBody().getStatements().stream().filter(J.MethodDeclaration.class::isInstance).map(J.MethodDeclaration.class::cast).filter(BeanPostProcessingIgnoreInAot::isApplicableMethod).findFirst().orElse(null); - if (method == null) { - J.Block body = c.getBody().withTemplate(createTemplate(), classDecl.getBody().getCoordinates().addMethodDeclaration((m1, m2) -> 1)); - c = c.withBody(body); - } - } - return c; - } - - @Override - public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext executionContext) { - J.MethodDeclaration m = super.visitMethodDeclaration(method, executionContext); - if (isApplicableMethod(m)) { - J.ClassDeclaration c = getCursor().firstEnclosing(J.ClassDeclaration.class); - if (c != null && isApplicableClass(c) && isReturnTrue(m)) { - m = m.withTemplate(createTemplate(), m.getCoordinates().replace()); - } - } - return m; - } - }; + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext executionContext) { + J.MethodDeclaration m = super.visitMethodDeclaration(method, executionContext); + if (isApplicableMethod(m)) { + J.ClassDeclaration c = getCursor().firstEnclosing(J.ClassDeclaration.class); + if (c != null && isApplicableClass(c) && isReturnTrue(m)) { + m = createTemplate().apply(getCursor(), m.getCoordinates().replace()); + } + } + return m; + } + } + ); + } private static List findReturnStatementsInMethod(J.MethodDeclaration m) { diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ConvertAutowiredFieldIntoConstructorParameter.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ConvertAutowiredFieldIntoConstructorParameter.java index cde8442b1..e2411a771 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ConvertAutowiredFieldIntoConstructorParameter.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ConvertAutowiredFieldIntoConstructorParameter.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.commons.rewrite.java; import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.java.search.UsesType; @@ -34,13 +35,13 @@ public class ConvertAutowiredFieldIntoConstructorParameter extends Recipe { } @Override - protected TreeVisitor getSingleSourceApplicableTest() { - return new UsesType(AUTOWIRED, false); + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesType(AUTOWIRED, false), new AutowiredFieldIntoConstructorParameterVisitor(classFqName, fieldName)); } @Override - protected TreeVisitor getVisitor() { - return new AutowiredFieldIntoConstructorParameterVisitor(classFqName, fieldName); + public String getDescription() { + return "Converts autowired fields into constructor parameters"; } } \ No newline at end of file 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 943b96608..ba43f2699 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 VMware, Inc. + * Copyright (c) 2022, 2023 VMware, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -59,7 +59,7 @@ public class DefineMethod extends Recipe { } @Override - protected TreeVisitor getVisitor() { + public TreeVisitor getVisitor() { return new JavaIsoVisitor() { private MethodMatcher matcher = new MethodMatcher(targetFqName + ' ' + signature); @@ -80,15 +80,14 @@ public class DefineMethod extends Recipe { if (template != null && methodPresent == null) { JavaType.FullyQualified type = c.getType(); if (type != null && targetFqName.equals(type.getFullyQualifiedName())) { - JavaTemplate t = JavaTemplate.builder(() -> getCursor(), template) - .javaParser(() -> JavaParser + JavaTemplate t = JavaTemplate.builder(template) + .javaParser(JavaParser .fromJavaVersion() .dependsOn(typeStubs.toArray(new String[typeStubs.size()])) - .classpath(classpath.stream().map(s -> Paths.get(s)).collect(Collectors.toList())) - .build()) + .classpath(classpath.stream().map(s -> Paths.get(s)).collect(Collectors.toList()))) .imports(imports.toArray(new String[imports.size()])).build(); - J.Block body = classDecl.getBody().withTemplate(t, classDecl.getBody().getCoordinates().addMethodDeclaration((m, n) -> 1)); + J.Block body = t.apply(getCursor(), classDecl.getBody().getCoordinates().addMethodDeclaration((m, n) -> 1)); for (String fq : imports) { maybeAddImport(fq); } @@ -100,4 +99,9 @@ public class DefineMethod extends Recipe { }; } + @Override + public String getDescription() { + return "Defines a bean declaration method in a type"; + } + } 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 04aba01a5..f29ca5078 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 @@ -34,7 +34,6 @@ import org.openrewrite.Recipe; import org.openrewrite.SourceFile; import org.openrewrite.Tree; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.RecipeIntrospectionUtils; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaParser.Builder; @@ -297,7 +296,7 @@ public class ORAstUtils { ctx.putMessage(JavaParser.SKIP_SOURCE_SET_TYPE_GENERATION, true); List cus = Collections.emptyList(); synchronized(parser) { - cus = parser.parse(sourceFiles, null, ctx); + cus = parser.parse(sourceFiles, null, ctx).collect(Collectors.toList()); } List finalCus = new ArrayList<>(cus.size()); for (CompilationUnit cu : cus) { @@ -322,7 +321,7 @@ public class ORAstUtils { List cus = Collections.emptyList(); // long start = System.currentTimeMillis(); synchronized (parser) { - cus = parser.parseInputs(inputs, null, ctx); + cus = parser.parseInputs(inputs, null, ctx).collect(Collectors.toList()); } // log.info("Rewrite parser: " + (System.currentTimeMillis() - start)); List finalCus = new ArrayList<>(cus.size()); @@ -379,17 +378,17 @@ public class ORAstUtils { } @SuppressWarnings("unchecked") - private static List> getAfterVisitors(TreeVisitor visitor) { + private static List> getAfterVisitors(TreeVisitor visitor) { try { Method m = TreeVisitor.class.getDeclaredMethod("getAfterVisit"); m.setAccessible(true); - return (List>) m.invoke(visitor); + return (List>) m.invoke(visitor); } catch (Exception e) { return Collections.emptyList(); } } - private static void makeVisitorNonTopLevel(JavaVisitor visitor) { + private static void makeVisitorNonTopLevel(TreeVisitor visitor) { try { Field f = TreeVisitor.class.getDeclaredField("afterVisit"); f.setAccessible(true); @@ -403,18 +402,17 @@ public class ORAstUtils { return new NodeRecipe((JavaVisitor) v, condition); } - @SuppressWarnings("unchecked") public static Recipe nodeRecipe(Recipe r, Predicate condition) { - return new NodeRecipe((JavaVisitor) RecipeIntrospectionUtils.recipeVisitor(r), condition); + return new NodeRecipe(r.getVisitor(), condition); } private static class NodeRecipe extends Recipe { - private JavaVisitor visitor; + private TreeVisitor visitor; private Predicate condition; - public NodeRecipe(JavaVisitor visitor, Predicate condition) { - this.visitor = visitor; + public NodeRecipe(TreeVisitor treeVisitor, Predicate condition) { + this.visitor = treeVisitor; this.condition = condition; } @@ -424,7 +422,7 @@ public class ORAstUtils { } @Override - protected TreeVisitor getVisitor() { + public TreeVisitor getVisitor() { return new JavaVisitor<>() { @Override @@ -433,8 +431,8 @@ public class ORAstUtils { J t = (J) tree; if (condition.test(t)) { makeVisitorNonTopLevel(visitor); - t = visitor.visit(t, ctx, getCursor()); - for (TreeVisitor v : getAfterVisitors(visitor)) { + t = (J) visitor.visit(t, ctx, getCursor()); + for (TreeVisitor v : getAfterVisitors(visitor)) { doAfterVisit(v); } return t; @@ -444,7 +442,12 @@ public class ORAstUtils { } }; - } + } + + @Override + public String getDescription() { + return ""; + } } public static boolean isExceptionFromInterrupedThread(Throwable t) { diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ProjectParser.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ProjectParser.java index 6a0ceee08..20da69ab8 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ProjectParser.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/java/ProjectParser.java @@ -17,7 +17,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.function.UnaryOperator; +import java.util.function.BiFunction; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -65,7 +65,7 @@ public abstract class ProjectParser { javaParser.setClasspath(mainClasspath); List javaSources = ListUtils.map(javaParser.parseInputs( - () -> getInputs(ss.javaSources.stream()).iterator(), projectDir, ctx), addProvenance(projectProvenance)); + () -> getInputs(ss.javaSources.stream()).iterator(), projectDir, ctx).collect(Collectors.toList()), addProvenance(projectProvenance)); JavaSourceSet javaSourceSet = ORAstUtils.addJavaSourceSet(javaSources, ss.name(), mainClasspath); sources.addAll(javaSources); @@ -92,7 +92,7 @@ public abstract class ProjectParser { .collect(Collectors.toList()), projectDirectory, ctx - ), addProvenance(provenance))); + ).collect(Collectors.toList()), addProvenance(provenance))); sourceFiles.addAll(ListUtils.map(new YamlParser().parseInputs( resources.stream() @@ -100,7 +100,7 @@ public abstract class ProjectParser { .collect(Collectors.toList()), projectDirectory, ctx - ), addProvenance(provenance))); + ).collect(Collectors.toList()), addProvenance(provenance))); sourceFiles.addAll(ListUtils.map(new PropertiesParser().parseInputs( resources.stream() @@ -108,7 +108,7 @@ public abstract class ProjectParser { .collect(Collectors.toList()), projectDirectory, ctx - ), addProvenance(provenance))); + ).collect(Collectors.toList()), addProvenance(provenance))); sourceFiles.addAll(ListUtils.map(new PlainTextParser().parseInputs( resources.stream() @@ -116,7 +116,7 @@ public abstract class ProjectParser { .collect(Collectors.toList()), projectDirectory, ctx - ), addProvenance(provenance))); + ).collect(Collectors.toList()), addProvenance(provenance))); } @@ -127,8 +127,8 @@ public abstract class ProjectParser { return s; } - private UnaryOperator addProvenance(List projectProvenance) { - return s -> { + private BiFunction addProvenance(List projectProvenance) { + return (i, s) -> { if (projectProvenance != null) { s = addProjectProvenance(s, projectProvenance); } diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenIJavaProjectParser.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenIJavaProjectParser.java index 7ef107dd9..333657abf 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenIJavaProjectParser.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenIJavaProjectParser.java @@ -23,6 +23,7 @@ import java.util.Properties; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.openrewrite.ExecutionContext; @@ -103,7 +104,7 @@ public class MavenIJavaProjectParser extends AbstractJavaProjectParser { @Override protected List parseBuildFiles(Path projectDir, ExecutionContext ctx) { MavenParser mavenParser = mavenParserBuilder.build(); - return mavenParser.parseInputs(() -> getInputs(Stream.of(Paths.get(jp.getProjectBuild().getBuildFile()))).iterator(), projectDir, ctx); + return mavenParser.parseInputs(() -> getInputs(Stream.of(Paths.get(jp.getProjectBuild().getBuildFile()))).iterator(), projectDir, ctx).collect(Collectors.toList()); } private static ResolvedPom getModel(Xml.Document maven) { diff --git a/headless-services/commons/commons-rewrite/src/test/java/org/springframework/ide/vscode/commons/rewrite/LoadUtilsTest.java b/headless-services/commons/commons-rewrite/src/test/java/org/springframework/ide/vscode/commons/rewrite/LoadUtilsTest.java index ff63a5d43..ee4c0cb56 100644 --- a/headless-services/commons/commons-rewrite/src/test/java/org/springframework/ide/vscode/commons/rewrite/LoadUtilsTest.java +++ b/headless-services/commons/commons-rewrite/src/test/java/org/springframework/ide/vscode/commons/rewrite/LoadUtilsTest.java @@ -44,11 +44,10 @@ public class LoadUtilsTest { @SuppressWarnings("unchecked") @Test public void createRecipeTest() throws Exception { - Recipe r = env.listRecipes().stream().filter(d -> "org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0".equals(d.getName())).findFirst().orElse(null); - RecipeDescriptor recipeDescriptor = r.getDescriptor(); + RecipeDescriptor recipeDescriptor = env.listRecipeDescriptors().stream().filter(d -> "org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0".equals(d.getName())).findFirst().orElse(null); assertNotNull(recipeDescriptor); - r = LoadUtils.createRecipe(recipeDescriptor, id -> { + Recipe r = LoadUtils.createRecipe(recipeDescriptor, id -> { try { return (Class) Class.forName(id); } catch (ClassNotFoundException e) { diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml index 5ddfc1760..765f3504c 100644 --- a/headless-services/commons/pom.xml +++ b/headless-services/commons/pom.xml @@ -113,9 +113,12 @@ 1.13 - 7.41.0-SNAPSHOT - 4.37.0-SNAPSHOT - 0.9.0-SNAPSHOT + 8.1.0-SNAPSHOT + 5.1.0-SNAPSHOT + 1.1.0-SNAPSHOT + + 7.6 + 6.1.1 true vmware diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java index 7c7382ea8..482777ca3 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java @@ -48,6 +48,7 @@ import org.openrewrite.Validated; import org.openrewrite.config.DeclarativeRecipe; import org.openrewrite.config.RecipeDescriptor; import org.openrewrite.config.YamlResourceLoader; +import org.openrewrite.internal.InMemoryLargeSourceSet; import org.openrewrite.java.JavaParser; import org.openrewrite.java.tree.J.CompilationUnit; import org.openrewrite.maven.MavenParser; @@ -427,8 +428,8 @@ public class RewriteRecipeRepository implements ApplicationContextAware { }); List sources = projectParser.parse(absoluteProjectDir, new InMemoryExecutionContext()); progressTask.progressEvent("Computing changes..."); - RecipeRun reciperun = r.run(sources, new InMemoryExecutionContext(e -> log.error("Recipe execution failed", e))); - List results = reciperun.getResults(); + RecipeRun reciperun = r.run(new InMemoryLargeSourceSet(sources), new InMemoryExecutionContext(e -> log.error("Recipe execution failed", e))); + List results = reciperun.getChangeset().getAllResults(); return ORDocUtils.createWorkspaceEdit(absoluteProjectDir, server.getTextDocumentService(), results); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRefactorings.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRefactorings.java index b4a280426..464e0bdce 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRefactorings.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRefactorings.java @@ -27,14 +27,16 @@ import org.eclipse.lsp4j.TextDocumentEdit; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.WorkspaceEdit; import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.Parser.Input; import org.openrewrite.Recipe; import org.openrewrite.RecipeRun; import org.openrewrite.Result; +import org.openrewrite.SourceFile; import org.openrewrite.config.DeclarativeRecipe; +import org.openrewrite.internal.InMemoryLargeSourceSet; import org.openrewrite.internal.RecipeIntrospectionUtils; import org.openrewrite.java.JavaParser; -import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.J.CompilationUnit; import org.openrewrite.marker.Range; import org.slf4j.Logger; @@ -121,9 +123,10 @@ public class RewriteRefactorings implements CodeActionResolver, QuickfixHandler return null; } - private WorkspaceEdit applyRecipe(Recipe r, IJavaProject project, List cus) { - RecipeRun reciperun = r.run(cus); - List results = reciperun.getResults(); + private WorkspaceEdit applyRecipe(Recipe r, IJavaProject project, List cus) { + List sources = cus.stream().map(cu -> (SourceFile) cu).collect(Collectors.toList()); + RecipeRun reciperun = r.run(new InMemoryLargeSourceSet(sources), new InMemoryExecutionContext()); + List results = reciperun.getChangeset().getAllResults(); List> edits = results.stream().filter(res -> res.getAfter() != null).map(res -> { URI docUri = res.getAfter().getSourcePath().isAbsolute() ? res.getAfter().getSourcePath().toUri() : project.getLocationUri().resolve(res.getAfter().getSourcePath().toString()); TextDocument doc = server.getTextDocumentService().getLatestSnapshot(docUri.toASCIIString()); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/SpringBootUpgrade.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/SpringBootUpgrade.java index 9f489199a..a3531bd6a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/SpringBootUpgrade.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/SpringBootUpgrade.java @@ -102,8 +102,8 @@ public class SpringBootUpgrade { if (version.getMajor() == targetVersion.getMajor() && version.getMinor() == targetVersion.getMinor()) { // patch version upgrade - treat as pom versions only upgrade - recipe.doNext(new UpgradeDependencyVersion("org.springframework.boot", "*", version.getMajor() + "." + version.getMinor() + ".x", null, null, null)); - recipe.doNext(new UpgradeParentVersion("org.springframework.boot", "spring-boot-starter-parent", version.getMajor() + "." + version.getMinor() + ".x", null, null)); + recipe.getRecipeList().add(new UpgradeDependencyVersion("org.springframework.boot", "*", version.getMajor() + "." + version.getMinor() + ".x", null, null, null)); + recipe.getRecipeList().add(new UpgradeParentVersion("org.springframework.boot", "spring-boot-starter-parent", version.getMajor() + "." + version.getMinor() + ".x", null, null)); } else /*if (version.getMajor() == targetVersion.getMajor())*/ { List recipedIds = createRecipeIdsChain(version.getMajor(), version.getMinor() + 1, targetVersion.getMajor(), targetVersion.getMinor(), versionsToRecipeId); if (!recipedIds.isEmpty()) { @@ -117,7 +117,7 @@ public class SpringBootUpgrade { // getRecipeFromId(recipedIds.get(i)).ifPresent(recipe::doNext); // } // } - getRecipeFromId(recipeId).ifPresent(recipe::doNext); + getRecipeFromId(recipeId).ifPresent(r -> recipe.getRecipeList().add(r)); } }