From c76044cf6560069251203f3153ef7b4c08d5d6e6 Mon Sep 17 00:00:00 2001 From: aboyko Date: Tue, 22 Nov 2022 22:22:29 -0500 Subject: [PATCH] JavaSourceSet marker name (main or test) --- .../commons/rewrite/java/ORAstUtils.java | 9 ++- .../rewrite/maven/MavenProjectParser.java | 8 ++- .../rewrite/RewriteCompilationUnitCache.java | 8 ++- .../java/rewrite/RewriteRecipeRepository.java | 10 ---- .../boot/java/rewrite/RewriteReconciler.java | 59 +++++++++++++------ ...eldIntoConstructorParameterCodeAction.java | 12 ++++ 6 files changed, 72 insertions(+), 34 deletions(-) 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 eefd51dee..484aa594e 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 @@ -47,6 +47,7 @@ import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.commons.java.IClasspathUtil; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; +import org.springframework.ide.vscode.commons.rewrite.maven.MavenProjectParser; import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -418,5 +419,11 @@ public class ORAstUtils { return false; } - + public static String getSourceSetName(IJavaProject project, Path sourcePath) { + if (IClasspathUtil.getProjectTestJavaSources(project.getClasspath()).anyMatch(f -> sourcePath.startsWith(f.toPath()))) { + return MavenProjectParser.TEST; + } else { + return MavenProjectParser.MAIN; + } + } } diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenProjectParser.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenProjectParser.java index 97f500f69..c83bad7f8 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenProjectParser.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/maven/MavenProjectParser.java @@ -62,7 +62,9 @@ import org.slf4j.LoggerFactory; */ public class MavenProjectParser { - private static final Pattern mavenWrapperVersionPattern = Pattern.compile(".*apache-maven/(.*?)/.*"); + public static final String TEST = "test"; + public static final String MAIN = "main"; + private static final Pattern mavenWrapperVersionPattern = Pattern.compile(".*apache-maven/(.*?)/.*"); private static final Logger logger = LoggerFactory.getLogger(MavenProjectParser.class); private final MavenParser mavenParser; @@ -123,7 +125,7 @@ public class MavenProjectParser { sourceFiles.add(addProjectProvenance(maven, projectProvenance)); // List dependencies = downloadArtifacts(getResolvedPom(maven).getDependencies().get(Scope.Compile)); - javaParser.setSourceSet("main"); + javaParser.setSourceSet(MAIN); javaParser.setClasspath(dependencies); sourceFiles.addAll(ListUtils.map(javaParser.parseInputs( getJavaSources(getModel(maven).getRequested(), projectDirectory, ctx, parserInputProvider), projectDirectory, ctx), addProvenance(projectProvenance))); @@ -131,7 +133,7 @@ public class MavenProjectParser { parseResources(getResources(getModel(maven).getRequested(), projectDirectory, ctx, parserInputProvider), projectDirectory, sourceFiles, projectProvenance, javaParser.getSourceSet(ctx)); // List testDependencies = downloadArtifacts(maven.getModel().getDependencies(Scope.Test)); - javaParser.setSourceSet("test"); + javaParser.setSourceSet(TEST); // javaParser.setClasspath(testDependencies); sourceFiles.addAll(ListUtils.map(javaParser.parseInputs( getTestJavaSources(getModel(maven).getRequested(), projectDirectory, ctx, parserInputProvider), projectDirectory, ctx), addProvenance(projectProvenance))); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCompilationUnitCache.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCompilationUnitCache.java index f38e3f725..2fd9cbcc4 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCompilationUnitCache.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteCompilationUnitCache.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.boot.java.rewrite; import java.io.ByteArrayInputStream; import java.net.URI; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashSet; import java.util.List; @@ -225,14 +226,17 @@ public class RewriteCompilationUnitCache implements DocumentContentProvider, Dis logger.debug("Parsing CU {}", uri); JavaParser javaParser = loadJavaParser(project); - Input input = new Input(Paths.get(uri), () -> { + Path sourcePath = Paths.get(uri); + javaParser.setSourceSet(ORAstUtils.getSourceSetName(project, sourcePath)); + + Input input = new Input(sourcePath, () -> { try { return new ByteArrayInputStream(fetchContent(uri).getBytes()); } catch (Exception e) { throw new IllegalStateException("Unexpected error fetching document content"); } }); - List cus = ORAstUtils.parseInputs(javaParser, List.of(input)); + List cus = ORAstUtils.parseInputs(javaParser, List.of(input)); CompilationUnit cu = cus.get(0); if (cu != null) { 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 1bf4a8178..a41ecbe8f 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 @@ -279,16 +279,6 @@ public class RewriteRecipeRepository implements ApplicationContextAware { return l; } - public List getApplicableCodeActionRecipeDescriptors(IJavaProject project, List descriptors) { - List filtered = new ArrayList<>(descriptors.size()); - for (RecipeCodeActionDescriptor d : descriptors) { - if (d.isApplicable(project)) { - filtered.add(d); - } - } - return filtered; - } - public CompilationUnit mark(List descriptors, CompilationUnit compilationUnit) { CompilationUnit cu = compilationUnit; for (RecipeCodeActionDescriptor d : descriptors) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java index 01e8a1b3b..83dbac479 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteReconciler.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.boot.java.rewrite; import java.io.ByteArrayInputStream; import java.net.URI; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; @@ -37,6 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.app.BootJavaConfig; import org.springframework.ide.vscode.boot.java.reconcilers.JavaReconciler; +import org.springframework.ide.vscode.commons.java.IClasspathUtil; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.languageserver.quickfix.Quickfix.QuickfixData; @@ -50,6 +52,7 @@ import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDes import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.ORAstUtils; +import org.springframework.ide.vscode.commons.rewrite.maven.MavenProjectParser; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -136,26 +139,46 @@ public class RewriteReconciler implements JavaReconciler { public Map> reconcile(IJavaProject project, List docs, Function problemCollectorFactory) { Map> allProblems = new HashMap<>(); + List testSourceFolders = IClasspathUtil.getProjectTestJavaSources(project.getClasspath()).map(f -> f.toPath()).collect(Collectors.toList()); + List testSources = new ArrayList<>(docs.size()); + List mainSources = new ArrayList<>(docs.size()); + for (TextDocument d : docs) { + Path p = Paths.get(URI.create(d.getUri())); + if (testSourceFolders.stream().anyMatch(t -> p.startsWith(t))) { + testSources.add(d); + } else { + mainSources.add(d); + } + } + JavaParser javaParser = ORAstUtils.createJavaParser(project); + javaParser.setSourceSet(MavenProjectParser.MAIN); + allProblems.putAll(doReconcile(project, mainSources, problemCollectorFactory, javaParser)); + javaParser.setSourceSet(MavenProjectParser.TEST); + allProblems.putAll(doReconcile(project, testSources, problemCollectorFactory, javaParser)); + return allProblems; + } + + private Map> doReconcile(IJavaProject project, List docs, + Function problemCollectorFactory, JavaParser javaParser) { + Map> allProblems = new HashMap<>(); - if (config.isRewriteReconcileEnabled()) { + if (javaParser != null && config.isRewriteReconcileEnabled()) { try { List descriptors = getProblemRecipeDescriptors(project); - - JavaParser javaParser = ORAstUtils.createJavaParser(project); - if (javaParser != null) { - List cus = ORAstUtils.parseInputs(javaParser, docs.stream().map(d -> new Parser.Input(Paths.get(URI.create(d.getUri())), () -> { - return new ByteArrayInputStream(d.get().getBytes()); - })).collect(Collectors.toList())); - - if (!descriptors.isEmpty()) { - - for(int i = 0; i < cus.size(); i++) { - final IDocument doc = docs.get(i); - List problems = new ArrayList<>(); - collectProblems(descriptors, doc, cus.get(i), problems::add); - if (!problems.isEmpty()) { - allProblems.put(doc, problems); - } + + List cus = ORAstUtils.parseInputs(javaParser, + docs.stream().map(d -> new Parser.Input(Paths.get(URI.create(d.getUri())), () -> { + return new ByteArrayInputStream(d.get().getBytes()); + })).collect(Collectors.toList())); + + if (!descriptors.isEmpty()) { + + for (int i = 0; i < cus.size(); i++) { + final IDocument doc = docs.get(i); + List problems = new ArrayList<>(); + collectProblems(descriptors, doc, cus.get(i), problems::add); + if (!problems.isEmpty()) { + allProblems.put(doc, problems); } } } @@ -196,7 +219,7 @@ public class RewriteReconciler implements JavaReconciler { List markers = t.getMarkers().findAll(FixAssistMarker.class); for (FixAssistMarker m : markers) { for (ReconcileProblem problem : createProblems(doc, m, t)) { - problemHandler.accept(problem);; + problemHandler.accept(problem); } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java index c73485278..28ddd6c1e 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java @@ -23,9 +23,11 @@ import org.openrewrite.SourceFile; import org.openrewrite.Tree; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaVisitor; +import org.openrewrite.java.marker.JavaSourceSet; import org.openrewrite.java.spring.AutowiredFieldIntoConstructorParameterVisitor; import org.openrewrite.java.tree.J.Block; import org.openrewrite.java.tree.J.ClassDeclaration; +import org.openrewrite.java.tree.J.CompilationUnit; import org.openrewrite.java.tree.J.MethodDeclaration; import org.openrewrite.java.tree.J.VariableDeclarations; import org.openrewrite.java.tree.JavaType.FullyQualified; @@ -41,6 +43,7 @@ import org.springframework.ide.vscode.commons.rewrite.java.AnnotationHierarchies import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.ORAstUtils; +import org.springframework.ide.vscode.commons.rewrite.maven.MavenProjectParser; public class AutowiredFieldIntoConstructorParameterCodeAction implements RecipeCodeActionDescriptor { @@ -52,6 +55,15 @@ public class AutowiredFieldIntoConstructorParameterCodeAction implements RecipeC public JavaVisitor getMarkerVisitor(ApplicationContext applicationContext) { return new JavaIsoVisitor<>() { + @Override + public CompilationUnit visitCompilationUnit(CompilationUnit cu, ExecutionContext p) { + JavaSourceSet sourceSet = cu.getMarkers().findFirst(JavaSourceSet.class).orElse(null); + if (sourceSet != null && MavenProjectParser.TEST.equals(sourceSet.getName())) { + return cu; + } + return super.visitCompilationUnit(cu, p); + } + @Override public VariableDeclarations visitVariableDeclarations(VariableDeclarations multiVariable, ExecutionContext p) {