diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/DiagnosticSeverityProvider.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/DiagnosticSeverityProvider.java index c0503c0dc..75e9ec83e 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/DiagnosticSeverityProvider.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/reconcile/DiagnosticSeverityProvider.java @@ -32,10 +32,15 @@ public interface DiagnosticSeverityProvider { } } - DiagnosticSeverity getDiagnosticSeverity(ReconcileProblem problem); + DiagnosticSeverity getDiagnosticSeverity(ProblemType problem); + default DiagnosticSeverity getDiagnosticSeverity(ReconcileProblem problem) { + return getDiagnosticSeverity(problem.getType()); + } + static final DiagnosticSeverityProvider DEFAULT = (problem) -> { - ProblemSeverity severity = problem.getType().getDefaultSeverity(); + ProblemSeverity severity = problem.getDefaultSeverity(); return diagnosticSeverity(severity); }; + } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index 3b2d95f8e..43290632c 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -753,7 +753,7 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC @Override public void accept(ReconcileProblem problem) { try { - DiagnosticSeverity severity = getDiagnosticSeverity(problem); + DiagnosticSeverity severity = severityProvider.getDiagnosticSeverity(problem); if (severity!=null) { Diagnostic d = new Diagnostic(); d.setCode(problem.getCode()); @@ -788,10 +788,6 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC }; } - public DiagnosticSeverity getDiagnosticSeverity(ReconcileProblem problem) { - return severityProvider.getDiagnosticSeverity(problem); - } - /** * If reconciling is in progress, waits until reconciling has caught up to * all the document changes. @@ -824,6 +820,10 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC public DiagnosticService getDiagnosticService() { return diagnosticService; } + + public DiagnosticSeverityProvider getDiagnosticSeverityProvider() { + return severityProvider; + } @Override public SimpleLanguageServer getServer() { diff --git a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java index 6adf43e8f..65436c53e 100644 --- a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java +++ b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/HelloMethodRenameProblemDescriptor.java @@ -27,11 +27,10 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTy import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTypes; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; -public class HelloMethodRenameProblemDescriptor implements RecipeSpringJavaProblemDescriptor { +public class HelloMethodRenameProblemDescriptor implements RecipeCodeActionDescriptor { private static final String LABEL = "Switch hello method into bye"; private static final String RECIPE_ID = "org.springframework.rewrite.test.HelloMethodRenameRecipe"; diff --git a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/StsTestCodeActionRepo.java b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/StsTestCodeActionRepo.java index b2779e573..57d26914e 100644 --- a/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/StsTestCodeActionRepo.java +++ b/headless-services/commons/commons-rewrite-test/src/main/java/org/springframework/rewrite/test/StsTestCodeActionRepo.java @@ -10,22 +10,15 @@ *******************************************************************************/ package org.springframework.rewrite.test; -import java.util.Collections; import java.util.List; import org.springframework.ide.vscode.commons.rewrite.config.CodeActionRepository; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; public class StsTestCodeActionRepo extends CodeActionRepository { @Override public List getCodeActionDescriptors() { - return Collections.emptyList(); - } - - @Override - public List getProblemDescriptors() { return List.of(new HelloMethodRenameProblemDescriptor()); } diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/CodeActionRepository.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/CodeActionRepository.java index 81e4ea325..25d7f41f8 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/CodeActionRepository.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/CodeActionRepository.java @@ -16,6 +16,4 @@ public abstract class CodeActionRepository { public abstract List getCodeActionDescriptors(); - public abstract List getProblemDescriptors(); - } diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java index 632f2073b..5bce924e2 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeCodeActionDescriptor.java @@ -14,6 +14,7 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.java.JavaVisitor; import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; public interface RecipeCodeActionDescriptor { @@ -24,6 +25,10 @@ public interface RecipeCodeActionDescriptor { JavaVisitor getMarkerVisitor(ApplicationContext applicationContext); boolean isApplicable(IJavaProject project); + + default ProblemType getProblemType() { + return null; + } static String buildLabel(String label, RecipeScope s) { switch (s) { diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeSpringJavaProblemDescriptor.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeSpringJavaProblemDescriptor.java deleted file mode 100644 index 6d9801639..000000000 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/RecipeSpringJavaProblemDescriptor.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 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 - * https://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VMware, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.vscode.commons.rewrite.config; - -import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; - -public interface RecipeSpringJavaProblemDescriptor extends RecipeCodeActionDescriptor { - - ProblemType getProblemType(); - -} diff --git a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/StsEnvironment.java b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/StsEnvironment.java index 40f55a572..a6bf8724a 100644 --- a/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/StsEnvironment.java +++ b/headless-services/commons/commons-rewrite/src/main/java/org/springframework/ide/vscode/commons/rewrite/config/StsEnvironment.java @@ -77,10 +77,6 @@ public class StsEnvironment extends Environment { return codeActionRepos.get().flatMap(r -> r.getCodeActionDescriptors().stream()).collect(Collectors.toList()); } - public List listProblemDescriptors() { - return codeActionRepos.get().flatMap(r -> r.getProblemDescriptors().stream()).collect(Collectors.toList()); - } - public static Builder builder() { return new Builder(new Properties()); } diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDiagnosticSeverities.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDiagnosticSeverities.java index 791192c75..42cbe5636 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDiagnosticSeverities.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseDiagnosticSeverities.java @@ -13,7 +13,6 @@ package org.springframework.ide.vscode.concourse; import org.eclipse.lsp4j.DiagnosticSeverity; import org.springframework.ide.vscode.commons.languageserver.reconcile.DiagnosticSeverityProvider; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; -import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems; import org.springframework.stereotype.Component; @@ -21,12 +20,11 @@ import org.springframework.stereotype.Component; public class ConcourseDiagnosticSeverities implements DiagnosticSeverityProvider { @Override - public DiagnosticSeverity getDiagnosticSeverity(ReconcileProblem problem) { - ProblemType type = problem.getType(); + public DiagnosticSeverity getDiagnosticSeverity(ProblemType type) { if (YamlSchemaProblems.PROPERTY_CONSTRAINT.contains(type)) { return DiagnosticSeverity.Warning; } - return DEFAULT.getDiagnosticSeverity(problem); + return DEFAULT.getDiagnosticSeverity(type); } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java index b92a2a517..f23fce37d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/ProblemSeverityConfigurer.java @@ -17,7 +17,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ide.vscode.commons.languageserver.reconcile.DiagnosticSeverityProvider; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity; -import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; +import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.languageserver.util.Settings; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.Assert; @@ -51,10 +51,10 @@ public class ProblemSeverityConfigurer implements InitializingBean { severityOverrides.put(code, ProblemSeverity.valueOf(severity)); } } - server.setDiagnosticSeverityProvider((ReconcileProblem problem) -> { - ProblemSeverity severity = severityOverrides.get(problem.getType().getCode()); + server.setDiagnosticSeverityProvider((ProblemType problem) -> { + ProblemSeverity severity = severityOverrides.get(problem.getCode()); if (severity==null) { - severity = problem.getType().getDefaultSeverity(); + severity = problem.getDefaultSeverity(); } return DiagnosticSeverityProvider.diagnosticSeverity(severity); }); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java index 1304d4b6f..472306b27 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Boot2JavaProblemType.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java; +import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.IGNORE; import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.HINT; import static org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemSeverity.WARNING; @@ -24,7 +25,11 @@ public enum Boot2JavaProblemType implements ProblemType { JAVA_PUBLIC_BEAN_METHOD(HINT, "Public modifier on `@Bean` method. They no longer have to be public visibility to be usable by Spring.", "public `@Bean` method"), - JAVA_TEST_SPRING_EXTENSION(WARNING, "`@SpringBootTest` and all test slice annotations already applies `@SpringExtension` as of Spring Boot 2.1.0.", "Unnecessary `@SpringExtension`"); + JAVA_TEST_SPRING_EXTENSION(WARNING, "`@SpringBootTest` and all test slice annotations already applies `@SpringExtension` as of Spring Boot 2.1.0.", "Unnecessary `@SpringExtension`"), + + JAVA_CONSTRUCTOR_PARAMETER_INJECTION(IGNORE, "Use constrcutor parameter injection", "Use constrcutor parameter injection"), + + JAVA_PRECISE_REQUEST_MAPPING(HINT, "Use precise mapping annotation, i.e. '@GetMapping', '@PostMapping', etc.", "Use precise mapping annotation, i.e. '@GetMapping', '@PostMapping', etc."); private final ProblemSeverity defaultSeverity; private String description; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java index 397f90f2a..de26ddaf9 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/BootCodeActionRepository.java @@ -12,31 +12,22 @@ package org.springframework.ide.vscode.boot.java.rewrite; import java.util.List; -import org.springframework.ide.vscode.boot.java.rewrite.codeaction.AutowiredFieldIntoConstructorParameterCodeAction; -import org.springframework.ide.vscode.boot.java.rewrite.codeaction.NoRequestMappingAnnotationCodeAction; +import org.springframework.ide.vscode.boot.java.rewrite.reconcile.AutowiredFieldIntoConstructorParameterCodeAction; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.BeanMethodNotPublicProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.BeanPostProcessingIgnoreInAotProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.Boot3NotSupportedTypeProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.NoAutowiredOnConstructorProblem; +import org.springframework.ide.vscode.boot.java.rewrite.reconcile.NoRequestMappingAnnotationCodeAction; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.NotRegisteredBeansProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.PreciseBeanTypeProblem; import org.springframework.ide.vscode.boot.java.rewrite.reconcile.UnnecessarySpringExtensionProblem; import org.springframework.ide.vscode.commons.rewrite.config.CodeActionRepository; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; public class BootCodeActionRepository extends CodeActionRepository { @Override public List getCodeActionDescriptors() { - return List.of( - new AutowiredFieldIntoConstructorParameterCodeAction(), - new NoRequestMappingAnnotationCodeAction() - ); - } - - @Override - public List getProblemDescriptors() { return List.of( new BeanMethodNotPublicProblem(), new NoAutowiredOnConstructorProblem(), @@ -44,7 +35,9 @@ public class BootCodeActionRepository extends CodeActionRepository { new PreciseBeanTypeProblem(), new BeanPostProcessingIgnoreInAotProblem(), new NotRegisteredBeansProblem(), - new Boot3NotSupportedTypeProblem() + new Boot3NotSupportedTypeProblem(), + new NoRequestMappingAnnotationCodeAction(), + new AutowiredFieldIntoConstructorParameterCodeAction() ); } 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 a660d9301..07735066e 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 @@ -70,7 +70,6 @@ import org.springframework.ide.vscode.commons.rewrite.LoadUtils; import org.springframework.ide.vscode.commons.rewrite.LoadUtils.DurationTypeConverter; import org.springframework.ide.vscode.commons.rewrite.ORDocUtils; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.StsEnvironment; import org.springframework.ide.vscode.commons.rewrite.maven.MavenProjectParser; @@ -99,8 +98,6 @@ public class RewriteRecipeRepository implements ApplicationContextAware { final private List codeActionDescriptors; - final private List javaProblemDescriptors; - final private ListenerList loadListeners; private ApplicationContext applicationContext; @@ -121,7 +118,6 @@ public class RewriteRecipeRepository implements ApplicationContextAware { this.recipes = new HashMap<>(); this.globalCommandRecipes = new ArrayList<>(); this.codeActionDescriptors = new ArrayList<>(); - this.javaProblemDescriptors = new ArrayList<>(); this.loadListeners = new ListenerList<>(); server.doOnInitialized(() -> { @@ -159,7 +155,6 @@ public class RewriteRecipeRepository implements ApplicationContextAware { recipes.clear(); globalCommandRecipes.clear(); codeActionDescriptors.clear(); - javaProblemDescriptors.clear(); } private synchronized void loadRecipes() { @@ -180,7 +175,6 @@ public class RewriteRecipeRepository implements ApplicationContextAware { } } } - javaProblemDescriptors.addAll(env.listProblemDescriptors()); codeActionDescriptors.addAll(env.listCodeActionDescriptors()); log.info("Done loading Rewrite Recipes"); } catch (Throwable t) { @@ -264,15 +258,6 @@ public class RewriteRecipeRepository implements ApplicationContextAware { return Optional.ofNullable(recipes.get(name)); } - public RecipeSpringJavaProblemDescriptor getProblemRecipeDescriptor(String id) { - for (RecipeSpringJavaProblemDescriptor d : javaProblemDescriptors) { - if (id.equals(d.getId())) { - return d; - } - } - return null; - } - public RecipeCodeActionDescriptor getCodeActionRecipeDescriptor(String id) { for (RecipeCodeActionDescriptor d : codeActionDescriptors) { if (id.equals(d.getId())) { @@ -282,12 +267,24 @@ public class RewriteRecipeRepository implements ApplicationContextAware { return null; } - public List getProblemRecipeDescriptors() { - return javaProblemDescriptors; + public List getProblemRecipeDescriptors() { + List l = new ArrayList<>(codeActionDescriptors.size()); + for (RecipeCodeActionDescriptor d : codeActionDescriptors) { + if (d.getProblemType() != null && server.getDiagnosticSeverityProvider().getDiagnosticSeverity(d.getProblemType()) != null) { + l.add(d); + } + } + return l; } public List getCodeActionRecipeDescriptors() { - return codeActionDescriptors; + List l = new ArrayList<>(codeActionDescriptors.size()); + for (RecipeCodeActionDescriptor d : codeActionDescriptors) { + if (d.getProblemType() == null || server.getDiagnosticSeverityProvider().getDiagnosticSeverity(d.getProblemType()) == null) { + l.add(d); + } + } + return l; } public List getApplicableCodeActionRecipeDescriptors(IJavaProject project, List 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 6aeb3b0c9..01e8a1b3b 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 @@ -46,7 +46,7 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemC import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; +import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; 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; @@ -81,7 +81,7 @@ public class RewriteReconciler implements JavaReconciler { try { problemCollector.beginCollecting(); - List descriptors = getProblemRecipeDescriptors(project); + List descriptors = getProblemRecipeDescriptors(project); if (!descriptors.isEmpty()) { CompilationUnit cu = cuCache.getCU(project, URI.create(doc.getUri())); @@ -104,7 +104,7 @@ public class RewriteReconciler implements JavaReconciler { if (astNode != null) { Range range = astNode.getMarkers().findFirst(Range.class).orElse(null); if (range != null) { - RecipeSpringJavaProblemDescriptor recipeFixDescriptor = recipeRepo.getProblemRecipeDescriptor(m.getDescriptorId()); + RecipeCodeActionDescriptor recipeFixDescriptor = recipeRepo.getCodeActionRecipeDescriptor(m.getDescriptorId()); if (recipeFixDescriptor != null) { return List.of(createProblem(doc, recipeFixDescriptor, m, range)); } @@ -113,7 +113,7 @@ public class RewriteReconciler implements JavaReconciler { return Collections.emptyList(); } - private ReconcileProblemImpl createProblem(IDocument doc, RecipeSpringJavaProblemDescriptor recipeFixDescriptor, + private ReconcileProblemImpl createProblem(IDocument doc, RecipeCodeActionDescriptor recipeFixDescriptor, FixAssistMarker m, Range range) { ProblemType problemType = recipeFixDescriptor.getProblemType(); ReconcileProblemImpl problem = new ReconcileProblemImpl(problemType, m.getLabel() == null ? problemType.getLabel() : m.getLabel(), range.getStart().getOffset(), range.getEnd().getOffset() - range.getStart().getOffset()); @@ -139,7 +139,7 @@ public class RewriteReconciler implements JavaReconciler { if (config.isRewriteReconcileEnabled()) { try { - List descriptors = getProblemRecipeDescriptors(project); + List descriptors = getProblemRecipeDescriptors(project); JavaParser javaParser = ORAstUtils.createJavaParser(project); if (javaParser != null) { @@ -170,7 +170,7 @@ public class RewriteReconciler implements JavaReconciler { return allProblems; } - private List getProblemRecipeDescriptors(IJavaProject project) + private List getProblemRecipeDescriptors(IJavaProject project) throws InterruptedException, ExecutionException { return recipeRepo.getProblemRecipeDescriptors().stream().filter(d -> d.getProblemType() != null).filter(d -> { switch (config.getProblemApplicability(d.getProblemType())) { @@ -184,7 +184,7 @@ public class RewriteReconciler implements JavaReconciler { }).collect(Collectors.toList()); } - private void collectProblems(List descriptors, IDocument doc, CompilationUnit compilationUnit, Consumer problemHandler) { + private void collectProblems(List descriptors, IDocument doc, CompilationUnit compilationUnit, Consumer problemHandler) { CompilationUnit cu = recipeRepo.mark(descriptors, compilationUnit); new JavaIsoVisitor() { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/codeaction/AutowiredFieldIntoConstructorParameterCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java similarity index 94% rename from headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/codeaction/AutowiredFieldIntoConstructorParameterCodeAction.java rename to headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java index 5a8c605e5..c73485278 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/codeaction/AutowiredFieldIntoConstructorParameterCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/AutowiredFieldIntoConstructorParameterCodeAction.java @@ -8,7 +8,7 @@ * Contributors: * VMware, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.boot.java.rewrite.codeaction; +package org.springframework.ide.vscode.boot.java.rewrite.reconcile; import static org.springframework.ide.vscode.commons.java.SpringProjectUtil.springBootVersionGreaterOrEqual; @@ -32,7 +32,9 @@ import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.TypeUtils; import org.openrewrite.marker.Range; import org.springframework.context.ApplicationContext; +import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.AnnotationHierarchies; @@ -107,4 +109,9 @@ public class AutowiredFieldIntoConstructorParameterCodeAction implements RecipeC return springBootVersionGreaterOrEqual(2, 0, 0).test(project); } + @Override + public ProblemType getProblemType() { + return Boot2JavaProblemType.JAVA_CONSTRUCTOR_PARAMETER_INJECTION; + } + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java index bddb35dcf..479fc5a68 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanMethodNotPublicProblem.java @@ -28,11 +28,10 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; -public class BeanMethodNotPublicProblem implements RecipeSpringJavaProblemDescriptor { +public class BeanMethodNotPublicProblem implements RecipeCodeActionDescriptor { private static final String ID = "org.openrewrite.java.spring.BeanMethodsNotPublic"; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java index 753e76916..f2e396582 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/BeanPostProcessingIgnoreInAotProblem.java @@ -29,12 +29,11 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.BeanPostProcessingIgnoreInAot; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; -public class BeanPostProcessingIgnoreInAotProblem implements RecipeSpringJavaProblemDescriptor { +public class BeanPostProcessingIgnoreInAotProblem implements RecipeCodeActionDescriptor { private static final String RECIPE_ID = "org.springframework.ide.vscode.commons.rewrite.java.BeanPostProcessingIgnoreInAot"; private static final String LABEL = "Add method 'isBeanExcludedFromAotProcessing' that returns 'false'"; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java index 17673ed9e..1f385ce00 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/Boot3NotSupportedTypeProblem.java @@ -29,10 +29,10 @@ import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Boot3JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; +import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; -public class Boot3NotSupportedTypeProblem implements RecipeSpringJavaProblemDescriptor { +public class Boot3NotSupportedTypeProblem implements RecipeCodeActionDescriptor { private static final List TYPE_FQNAMES = List.of( "org.springframework.web.multipart.commons.CommonsMultipartResolver", diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java index 69d830a8a..db2b98a48 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoAutowiredOnConstructorProblem.java @@ -24,20 +24,20 @@ import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.J.ClassDeclaration; import org.openrewrite.java.tree.J.MethodDeclaration; import org.openrewrite.java.tree.JavaType.FullyQualified; -import org.openrewrite.marker.Range; import org.openrewrite.java.tree.Statement; import org.openrewrite.java.tree.TypeUtils; +import org.openrewrite.marker.Range; import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; 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; -public class NoAutowiredOnConstructorProblem implements RecipeSpringJavaProblemDescriptor { +public class NoAutowiredOnConstructorProblem implements RecipeCodeActionDescriptor { private static final String ID = "org.openrewrite.java.spring.NoAutowiredOnConstructor"; private static final String LABEL = "Remove Unnecessary @Autowired"; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/codeaction/NoRequestMappingAnnotationCodeAction.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java similarity index 91% rename from headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/codeaction/NoRequestMappingAnnotationCodeAction.java rename to headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java index 9692fc9d1..207a0dddc 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/codeaction/NoRequestMappingAnnotationCodeAction.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NoRequestMappingAnnotationCodeAction.java @@ -8,7 +8,7 @@ * Contributors: * VMware, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.boot.java.rewrite.codeaction; +package org.springframework.ide.vscode.boot.java.rewrite.reconcile; import static org.springframework.ide.vscode.commons.java.SpringProjectUtil.springBootVersionGreaterOrEqual; @@ -23,7 +23,9 @@ import org.openrewrite.java.JavaVisitor; import org.openrewrite.java.tree.J; import org.openrewrite.marker.Range; import org.springframework.context.ApplicationContext; +import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; @@ -66,4 +68,9 @@ public class NoRequestMappingAnnotationCodeAction implements RecipeCodeActionDes return springBootVersionGreaterOrEqual(2, 0, 0).test(project); } + @Override + public ProblemType getProblemType() { + return Boot2JavaProblemType.JAVA_PRECISE_REQUEST_MAPPING; + } + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java index 614ac1a63..d687d75e0 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/NotRegisteredBeansProblem.java @@ -40,8 +40,8 @@ import org.springframework.ide.vscode.commons.java.IClasspathUtil; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType; +import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; @@ -49,7 +49,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableSet; -public class NotRegisteredBeansProblem implements RecipeSpringJavaProblemDescriptor { +public class NotRegisteredBeansProblem implements RecipeCodeActionDescriptor { private static final String DEFINE_METHOD_RECIPE = "org.springframework.ide.vscode.commons.rewrite.java.DefineMethod"; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java index 861626ce4..0c22aab86 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/PreciseBeanTypeProblem.java @@ -30,11 +30,10 @@ import org.springframework.ide.vscode.boot.java.Boot3JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; -public class PreciseBeanTypeProblem implements RecipeSpringJavaProblemDescriptor { +public class PreciseBeanTypeProblem implements RecipeCodeActionDescriptor { private static final String RECIPE_ID = "org.openrewrite.java.spring.boot3.PreciseBeanType"; diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java index 652a131b2..07b8e96ab 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/reconcile/UnnecessarySpringExtensionProblem.java @@ -30,11 +30,10 @@ import org.springframework.ide.vscode.boot.java.Boot2JavaProblemType; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.rewrite.config.RecipeCodeActionDescriptor; import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope; -import org.springframework.ide.vscode.commons.rewrite.config.RecipeSpringJavaProblemDescriptor; import org.springframework.ide.vscode.commons.rewrite.java.FixAssistMarker; import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor; -public class UnnecessarySpringExtensionProblem implements RecipeSpringJavaProblemDescriptor { +public class UnnecessarySpringExtensionProblem implements RecipeCodeActionDescriptor { private static final String LABEL = "Remove unnecessary @SpringExtension"; private static final String ID = "org.openrewrite.java.spring.boot2.UnnecessarySpringExtension"; diff --git a/headless-services/spring-boot-language-server/src/main/resources/problem-types.json b/headless-services/spring-boot-language-server/src/main/resources/problem-types.json index 56269efca..2ff2e26a8 100644 --- a/headless-services/spring-boot-language-server/src/main/resources/problem-types.json +++ b/headless-services/spring-boot-language-server/src/main/resources/problem-types.json @@ -31,6 +31,18 @@ "label": "Unnecessary `@SpringExtension`", "description": "`@SpringBootTest` and all test slice annotations already applies `@SpringExtension` as of Spring Boot 2.1.0.", "defaultSeverity": "WARNING" + }, + { + "code": "JAVA_CONSTRUCTOR_PARAMETER_INJECTION", + "label": "Use constrcutor parameter injection", + "description": "Use constrcutor parameter injection", + "defaultSeverity": "IGNORE" + }, + { + "code": "JAVA_PRECISE_REQUEST_MAPPING", + "label": "Use precise mapping annotation, i.e. '@GetMapping', '@PostMapping', etc.", + "description": "Use precise mapping annotation, i.e. '@GetMapping', '@PostMapping', etc.", + "defaultSeverity": "HINT" } ] }, diff --git a/vscode-extensions/vscode-spring-boot/package.json b/vscode-extensions/vscode-spring-boot/package.json index 56bc619b3..8123afcc3 100644 --- a/vscode-extensions/vscode-spring-boot/package.json +++ b/vscode-extensions/vscode-spring-boot/package.json @@ -336,6 +336,30 @@ "HINT", "ERROR" ] + }, + "spring-boot.ls.problem.boot2.JAVA_CONSTRUCTOR_PARAMETER_INJECTION": { + "type": "string", + "default": "IGNORE", + "description": "Use constrcutor parameter injection", + "enum": [ + "IGNORE", + "INFO", + "WARNING", + "HINT", + "ERROR" + ] + }, + "spring-boot.ls.problem.boot2.JAVA_PRECISE_REQUEST_MAPPING": { + "type": "string", + "default": "HINT", + "description": "Use precise mapping annotation, i.e. '@GetMapping', '@PostMapping', etc.", + "enum": [ + "IGNORE", + "INFO", + "WARNING", + "HINT", + "ERROR" + ] } } },