diff --git a/headless-services/commons/commons-rewrite/pom.xml b/headless-services/commons/commons-rewrite/pom.xml index 07d258bc8..2c9fd116f 100644 --- a/headless-services/commons/commons-rewrite/pom.xml +++ b/headless-services/commons/commons-rewrite/pom.xml @@ -61,6 +61,11 @@ rewrite-groovy ${rewrite-version} + + org.openrewrite + rewrite-kotlin + ${rewrite-kotlin-version} + org.openrewrite rewrite-gradle 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 916ee90c3..2e3c4421c 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 @@ -28,7 +28,6 @@ import org.openrewrite.SourceFile; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaParser; import org.openrewrite.java.marker.JavaSourceSet; -import org.openrewrite.java.tree.J.CompilationUnit; import org.openrewrite.marker.Marker; import org.openrewrite.properties.PropertiesParser; import org.openrewrite.text.PlainTextParser; @@ -64,8 +63,8 @@ public abstract class ProjectParser { Collection mainClasspath = ss.classpath(); javaParser.setClasspath(mainClasspath); - List javaSources = ListUtils.map(javaParser.parseInputs( - () -> getInputs(ss.javaSources.stream()).iterator(), projectDir, ctx).map(CompilationUnit.class::cast).collect(Collectors.toList()), addProvenance(projectProvenance)); + List javaSources = ListUtils.map(javaParser.parseInputs( + () -> getInputs(ss.javaSources.stream()).iterator(), projectDir, ctx).collect(Collectors.toList()), addProvenance(projectProvenance)); JavaSourceSet javaSourceSet = ORAstUtils.addJavaSourceSet(javaSources, ss.name(), mainClasspath); sources.addAll(javaSources); diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml index 987cc5d07..d9439418e 100644 --- a/headless-services/commons/pom.xml +++ b/headless-services/commons/pom.xml @@ -114,6 +114,7 @@ 8.9.0-SNAPSHOT + 1.5.1 5.1.0-SNAPSHOT 1.3.2 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 673ba0663..96780a5f1 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 @@ -37,6 +37,7 @@ import org.eclipse.lsp4j.ApplyWorkspaceEditParams; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.WorkspaceEdit; import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.ParseExceptionResult; import org.openrewrite.Parser; import org.openrewrite.Recipe; import org.openrewrite.RecipeRun; @@ -50,6 +51,7 @@ import org.openrewrite.config.YamlResourceLoader; import org.openrewrite.internal.InMemoryLargeSourceSet; import org.openrewrite.java.JavaParser; import org.openrewrite.maven.MavenParser; +import org.openrewrite.tree.ParseError; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.app.BootJavaConfig; @@ -368,12 +370,28 @@ public class RewriteRecipeRepository { return null; }); List sources = projectParser.parse(absoluteProjectDir, new InMemoryExecutionContext()); + reportParseErrors(sources.stream().filter(ParseError.class::isInstance).map(ParseError.class::cast).collect(Collectors.toList())); progressTask.progressEvent("Computing changes..."); 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); } + private void reportParseErrors(List parseErrors) { + if (!parseErrors.isEmpty()) { + for (ParseError err : parseErrors) { + ParseExceptionResult parseException = err.getMarkers().findFirst(ParseExceptionResult.class).get(); + if (parseException == null) { + log.warn("OpenRewrite failed to parse '{}' with unknown error", err.getSourcePath()); + } else { + log.warn("OpenRewrite parser '{}' failed to parse '{}' with error:\n{}", parseException.getParserType(), err.getSourcePath(), parseException.getMessage()); + } + } + server.getMessageService().warning("Failed to parse %d files (See Language Server :\n%s".formatted(parseErrors.size(), parseErrors + .stream().map(pe -> pe.getSourcePath().toFile().toString()).collect(Collectors.joining("\n")))); + } + } + private CompletableFuture> listProjectRefactoringRecipes(String uri) { if (uri != null) { /*