Skip to content

Commit a250361

Browse files
committed
GH-1499: re-validating bean registrars now when config classes change their import annotation expressions
1 parent 3d1ccd7 commit a250361

File tree

36 files changed

+501
-119
lines changed

36 files changed

+501
-119
lines changed

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public void addSymbols(IJavaProject project, WorkspaceSymbol[] enhancedSymbols,
235235
@Override
236236
public void removeSymbols(IJavaProject project, String docURI) {
237237
SpringSymbolIndex.this.removeSymbolsByDoc(project, docURI);
238-
springIndex.removeElements(project.getElementName(), docURI);
238+
// springIndex.removeElements(project.getElementName(), docURI);
239239

240240
// TODO remove diagnostics ?!? maybe, maybe not
241241

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/index/SpringMetamodelIndex.java

+20
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import java.util.ArrayDeque;
1414
import java.util.ArrayList;
15+
import java.util.Collection;
1516
import java.util.HashMap;
1617
import java.util.List;
1718
import java.util.Map;
@@ -249,4 +250,23 @@ public Bean[] getMatchingBeans(String projectName, String matchType) {
249250
return (Bean[]) result.toArray(new Bean[result.size()]);
250251
}
251252

253+
public static <T extends SpringIndexElement> List<T> getNodesOfType(Class<T> type, Collection<SpringIndexElement> rootNodes) {
254+
List<T> result = new ArrayList<>();
255+
256+
ArrayDeque<SpringIndexElement> elementsToVisit = new ArrayDeque<>();
257+
elementsToVisit.addAll(rootNodes);
258+
259+
while (!elementsToVisit.isEmpty()) {
260+
SpringIndexElement element = elementsToVisit.pop();
261+
262+
if (type.isInstance(element)) {
263+
result.add(type.cast(element));
264+
}
265+
266+
elementsToVisit.addAll(element.getChildren());
267+
}
268+
269+
return result;
270+
}
271+
252272
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/cron/JdtCronReconciler.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import org.eclipse.jdt.core.dom.NormalAnnotation;
1818
import org.springframework.ide.vscode.boot.java.embedded.lang.EmbeddedLanguageSnippet;
1919
import org.springframework.ide.vscode.boot.java.reconcilers.JdtAstReconciler;
20+
import org.springframework.ide.vscode.boot.java.reconcilers.ReconcilingContext;
2021
import org.springframework.ide.vscode.commons.java.IJavaProject;
2122
import org.springframework.ide.vscode.commons.java.SpringProjectUtil;
22-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
2323
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
2424

2525
public class JdtCronReconciler implements JdtAstReconciler {
@@ -41,14 +41,13 @@ public ProblemType getProblemType() {
4141
}
4242

4343
@Override
44-
public ASTVisitor createVisitor(IJavaProject project, URI docURI, CompilationUnit cu,
45-
IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
44+
public ASTVisitor createVisitor(IJavaProject project, URI docURI, CompilationUnit cu, ReconcilingContext context) {
4645
return new ASTVisitor() {
4746
@Override
4847
public boolean visit(NormalAnnotation node) {
4948
EmbeddedLanguageSnippet e = JdtCronVisitorUtils.extractCron(node);
5049
if (e != null) {
51-
cronReconciler.reconcile(e.getText(), e::toSingleJavaRange, problemCollector);
50+
cronReconciler.reconcile(e.getText(), e::toSingleJavaRange, context.getProblemCollector());
5251
}
5352
return super.visit(node);
5453
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/QueryJdtAstReconciler.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525
import org.springframework.ide.vscode.boot.java.embedded.lang.AntlrReconcilerWithSpel;
2626
import org.springframework.ide.vscode.boot.java.handlers.Reconciler;
2727
import org.springframework.ide.vscode.boot.java.reconcilers.JdtAstReconciler;
28+
import org.springframework.ide.vscode.boot.java.reconcilers.ReconcilingContext;
2829
import org.springframework.ide.vscode.boot.java.reconcilers.RequiredCompleteAstException;
2930
import org.springframework.ide.vscode.boot.java.spel.SpelReconciler;
3031
import org.springframework.ide.vscode.commons.java.IJavaProject;
3132
import org.springframework.ide.vscode.commons.java.SpringProjectUtil;
32-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
3333
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
3434
import org.springframework.ide.vscode.parser.mysql.MySqlLexer;
3535
import org.springframework.ide.vscode.parser.mysql.MySqlParser;
@@ -54,7 +54,7 @@ public QueryJdtAstReconciler(Reconciler hqlReconciler, Reconciler jpqlReconciler
5454
}
5555

5656
@Override
57-
public ASTVisitor createVisitor(IJavaProject project, URI docURI, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) throws RequiredCompleteAstException {
57+
public ASTVisitor createVisitor(IJavaProject project, URI docURI, CompilationUnit cu, ReconcilingContext context) throws RequiredCompleteAstException {
5858
AnnotationHierarchies annotationHierarchies = AnnotationHierarchies.get(cu);
5959
return new ASTVisitor() {
6060

@@ -63,7 +63,7 @@ public boolean visit(NormalAnnotation node) {
6363
EmbeddedQueryExpression q = JdtQueryVisitorUtils.extractQueryExpression(annotationHierarchies, node);
6464
if (q != null) {
6565
Optional<Reconciler> reconcilerOpt = q.isNative() ? getSqlReconciler(project) : Optional.of(getQueryReconciler(project));
66-
reconcilerOpt.ifPresent(r -> r.reconcile(q.query().getText(), q.query()::toSingleJavaRange, problemCollector));
66+
reconcilerOpt.ifPresent(r -> r.reconcile(q.query().getText(), q.query()::toSingleJavaRange, context.getProblemCollector()));
6767
}
6868
return super.visit(node);
6969
}
@@ -72,7 +72,7 @@ public boolean visit(NormalAnnotation node) {
7272
public boolean visit(SingleMemberAnnotation node) {
7373
EmbeddedQueryExpression q = JdtQueryVisitorUtils.extractQueryExpression(annotationHierarchies, node);
7474
if (q != null) {
75-
getQueryReconciler(project).reconcile(q.query().getText(), q.query()::toSingleJavaRange, problemCollector);
75+
getQueryReconciler(project).reconcile(q.query().getText(), q.query()::toSingleJavaRange, context.getProblemCollector());
7676
}
7777
return super.visit(node);
7878
}
@@ -81,7 +81,7 @@ public boolean visit(SingleMemberAnnotation node) {
8181
public boolean visit(MethodInvocation node) {
8282
EmbeddedQueryExpression q = JdtQueryVisitorUtils.extractQueryExpression(node);
8383
if (q != null) {
84-
getQueryReconciler(project).reconcile(q.query().getText(), q.query()::toSingleJavaRange, problemCollector);
84+
getQueryReconciler(project).reconcile(q.query().getText(), q.query()::toSingleJavaRange, context.getProblemCollector());
8585
}
8686
return super.visit(node);
8787
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/AbstractSecurityLamdaDslReconciler.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.eclipse.jdt.core.dom.MethodInvocation;
2121
import org.springframework.ide.vscode.commons.java.IJavaProject;
2222
import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixRegistry;
23-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
2423
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
2524
import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope;
2625
import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor;
@@ -34,9 +33,9 @@ public AbstractSecurityLamdaDslReconciler(QuickfixRegistry registry) {
3433
}
3534

3635
@Override
37-
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
36+
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, ReconcilingContext context) {
3837

39-
if (isCompleteAst) {
38+
if (context.isCompleteAst()) {
4039
return new ASTVisitor() {
4140

4241
@Override
@@ -59,7 +58,7 @@ public boolean visit(MethodInvocation node) {
5958
ReconcileUtils.buildLabel(getFixLabel(), RecipeScope.PROJECT))
6059
.withRecipeScope(RecipeScope.PROJECT)
6160
));
62-
problemCollector.accept(problem);
61+
context.getProblemCollector().accept(problem);
6362
return false;
6463
}
6564
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/AddConfigurationIfBeansPresentReconciler.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.ide.vscode.commons.java.IJavaProject;
3434
import org.springframework.ide.vscode.commons.java.SpringProjectUtil;
3535
import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixRegistry;
36-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
3736
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
3837
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
3938
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
@@ -65,7 +64,7 @@ public ProblemType getProblemType() {
6564
}
6665

6766
@Override
68-
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
67+
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, ReconcilingContext context) {
6968
return new ASTVisitor() {
7069

7170
@Override
@@ -85,7 +84,7 @@ public boolean visit(TypeDeclaration classDecl) {
8584
ReconcileUtils.buildLabel(FIX_LABEL, RecipeScope.PROJECT))
8685
.withRecipeScope(RecipeScope.PROJECT)));
8786

88-
problemCollector.accept(problem);
87+
context.getProblemCollector().accept(problem);
8988
}
9089
return true;
9190
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/AuthorizeHttpRequestsReconciler.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.springframework.ide.vscode.commons.java.IJavaProject;
2424
import org.springframework.ide.vscode.commons.java.SpringProjectUtil;
2525
import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixRegistry;
26-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
2726
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
2827
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
2928
import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope;
@@ -57,9 +56,9 @@ public ProblemType getProblemType() {
5756
}
5857

5958
@Override
60-
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
59+
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, ReconcilingContext context) {
6160

62-
if (isCompleteAst) {
61+
if (context.isCompleteAst()) {
6362
return new ASTVisitor() {
6463

6564
@Override
@@ -82,7 +81,7 @@ public boolean visit(MethodInvocation node) {
8281
ReconcileUtils.buildLabel(AUTHORIZE_REQUESTS_FIX_LABEL,
8382
RecipeScope.PROJECT))
8483
.withRecipeScope(RecipeScope.PROJECT)));
85-
problemCollector.accept(problem);
84+
context.getProblemCollector().accept(problem);
8685
return false;
8786
}
8887
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/AutowiredFieldIntoConstructorParameterReconciler.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.springframework.ide.vscode.commons.java.IClasspathUtil;
4040
import org.springframework.ide.vscode.commons.java.IJavaProject;
4141
import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixRegistry;
42-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
4342
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
4443
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
4544
import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope;
@@ -67,7 +66,7 @@ public ProblemType getProblemType() {
6766
}
6867

6968
@Override
70-
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
69+
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, ReconcilingContext context) {
7170
Path sourceFile = Paths.get(docUri);
7271
// Check if source file belongs to non-test java sources folder
7372
if (IClasspathUtil.getProjectJavaSourceFoldersWithoutTests(project.getClasspath())
@@ -91,26 +90,26 @@ public boolean visit(FieldDeclaration field) {
9190
String fieldName = variableDeclarationFragment.getName().getIdentifier();
9291

9392
if (constructors.isEmpty()) {
94-
problemCollector.accept(createProblem(cu, field, fieldName, docUri));
93+
context.getProblemCollector().accept(createProblem(cu, field, fieldName, docUri));
9594
} else if (constructors.size() == 1) {
96-
if (!isCompleteAst) {
95+
if (!context.isCompleteAst()) {
9796
throw new RequiredCompleteAstException();
9897
}
9998
if (!isAssigningField(constructors.get(0), variableDeclarationFragment.resolveBinding(),
10099
fieldName)) {
101-
problemCollector.accept(createProblem(cu, field, fieldName, docUri));
100+
context.getProblemCollector().accept(createProblem(cu, field, fieldName, docUri));
102101
}
103102
} else {
104103
List<MethodDeclaration> autowiredConstructors = constructors.stream()
105104
.filter(constr -> ReconcileUtils.findAnnotation(annotationHierarchies, constr,
106105
Annotations.AUTOWIRED, true) != null)
107106
.limit(2).collect(Collectors.toList());
108107
if (autowiredConstructors.size() == 1) {
109-
if (!isCompleteAst) {
108+
if (!context.isCompleteAst()) {
110109
throw new RequiredCompleteAstException();
111110
} else if (!isAssigningField(autowiredConstructors.get(0),
112111
variableDeclarationFragment.resolveBinding(), fieldName)) {
113-
problemCollector.accept(createProblem(cu, field, fieldName, docUri));
112+
context.getProblemCollector().accept(createProblem(cu, field, fieldName, docUri));
114113
}
115114
}
116115
}

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/BeanMethodNotPublicReconciler.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ public ProblemType getProblemType() {
6666
}
6767

6868
@Override
69-
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
69+
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, ReconcilingContext context) {
7070

7171
return new ASTVisitor() {
7272

7373
@Override
7474
public boolean visit(SingleMemberAnnotation node) {
7575
try {
76-
visitAnnotation(project, cu, docUri, node, problemCollector);
76+
visitAnnotation(project, cu, docUri, node, context.getProblemCollector());
7777
} catch (Exception e) {
7878
}
7979
return super.visit(node);
@@ -82,7 +82,7 @@ public boolean visit(SingleMemberAnnotation node) {
8282
@Override
8383
public boolean visit(NormalAnnotation node) {
8484
try {
85-
visitAnnotation(project, cu, docUri, node, problemCollector);
85+
visitAnnotation(project, cu, docUri, node, context.getProblemCollector());
8686
} catch (Exception e) {
8787
}
8888
return super.visit(node);
@@ -91,7 +91,7 @@ public boolean visit(NormalAnnotation node) {
9191
@Override
9292
public boolean visit(MarkerAnnotation node) {
9393
try {
94-
visitAnnotation(project, cu, docUri, node, problemCollector);
94+
visitAnnotation(project, cu, docUri, node, context.getProblemCollector());
9595
} catch (Exception e) {
9696
}
9797
return super.visit(node);

Diff for: headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/BeanPostProcessingIgnoreInAotReconciler.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.springframework.ide.vscode.boot.java.SpringAotJavaProblemType;
2626
import org.springframework.ide.vscode.commons.java.IJavaProject;
2727
import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixRegistry;
28-
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
2928
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
3029
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
3130
import org.springframework.ide.vscode.commons.rewrite.config.RecipeScope;
@@ -56,7 +55,7 @@ public ProblemType getProblemType() {
5655
}
5756

5857
@Override
59-
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, IProblemCollector problemCollector, boolean isCompleteAst, boolean isIndexComplete) {
58+
public ASTVisitor createVisitor(IJavaProject project, URI docUri, CompilationUnit cu, ReconcilingContext context) {
6059

6160
return new ASTVisitor() {
6261

@@ -73,7 +72,7 @@ public boolean visit(TypeDeclaration typeDecl) {
7372
}
7473
}
7574
if (foundMethod != null) {
76-
if (isCompleteAst) {
75+
if (context.isCompleteAst()) {
7776
AtomicBoolean returnsTrue = new AtomicBoolean(false);
7877
foundMethod.accept(new ASTVisitor() {
7978
@Override
@@ -99,7 +98,7 @@ public boolean visit(ReturnStatement node) {
9998
.withRangeScope(ReconcileUtils.createOpenRewriteRange(cu, typeDecl, null))
10099
.withRecipeScope(RecipeScope.NODE)
101100
));
102-
problemCollector.accept(problem);
101+
context.getProblemCollector().accept(problem);
103102
}
104103
}
105104
return true;

0 commit comments

Comments
 (0)