Handle sources with parse errors gracefully when Recipe applied

This commit is contained in:
aboyko
2023-11-07 13:39:14 -05:00
parent 4191c85c11
commit bb1cac8939
4 changed files with 26 additions and 3 deletions

View File

@@ -61,6 +61,11 @@
<artifactId>rewrite-groovy</artifactId>
<version>${rewrite-version}</version>
</dependency>
<dependency>
<groupId>org.openrewrite</groupId>
<artifactId>rewrite-kotlin</artifactId>
<version>${rewrite-kotlin-version}</version>
</dependency>
<dependency>
<groupId>org.openrewrite</groupId>
<artifactId>rewrite-gradle</artifactId>

View File

@@ -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<Path> mainClasspath = ss.classpath();
javaParser.setClasspath(mainClasspath);
List<CompilationUnit> javaSources = ListUtils.map(javaParser.parseInputs(
() -> getInputs(ss.javaSources.stream()).iterator(), projectDir, ctx).map(CompilationUnit.class::cast).collect(Collectors.toList()), addProvenance(projectProvenance));
List<SourceFile> 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);

View File

@@ -114,6 +114,7 @@
<!-- Rewrite specific properties -->
<rewrite-version>8.9.0-SNAPSHOT</rewrite-version>
<rewrite-kotlin-version>1.5.1</rewrite-kotlin-version>
<rewrite-spring-version>5.1.0-SNAPSHOT</rewrite-spring-version>
<rewrite-gradle-tooling-api-version>1.3.2</rewrite-gradle-tooling-api-version>

View File

@@ -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<SourceFile> 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<Result> results = reciperun.getChangeset().getAllResults();
return ORDocUtils.createWorkspaceEdit(absoluteProjectDir, server.getTextDocumentService(), results);
}
private void reportParseErrors(List<ParseError> 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<List<Recipe>> listProjectRefactoringRecipes(String uri) {
if (uri != null) {
/*