Skip to content

Commit 4aeaf05

Browse files
committed
refactored annotation attribute completion proecessors to allow more specific proposals to be created
1 parent 54df530 commit 4aeaf05

17 files changed

+177
-128
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProcessor.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
import java.util.Collection;
1414
import java.util.HashSet;
15-
import java.util.LinkedHashMap;
1615
import java.util.List;
1716
import java.util.Map;
1817
import java.util.Optional;
@@ -134,21 +133,22 @@ private void createCompletionProposals(IJavaProject project, TextDocument doc, A
134133
AnnotationAttributeCompletionProvider completionProvider = this.completionProviders.get(attributeName);
135134
if (completionProvider != null) {
136135

137-
Map<String, String> proposals = completionProvider.getCompletionCandidates(project, node);
138-
Map<String, String> filteredProposals = proposals.entrySet().stream()
139-
.filter(candidate -> candidate.getKey().toLowerCase().contains(filterPrefix.toLowerCase()))
140-
.filter(candidate -> !alreadyMentionedValues.contains(candidate.getKey()))
141-
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (u, v) -> u, LinkedHashMap::new));
136+
List<AnnotationAttributeProposal> proposals = completionProvider.getCompletionCandidates(project, node);
137+
138+
List<AnnotationAttributeProposal> filteredProposals = proposals.stream()
139+
.filter(proposal -> proposal.getLabel().toLowerCase().contains(filterPrefix.toLowerCase()))
140+
.filter(proposal -> !alreadyMentionedValues.contains(proposal.getLabel()))
141+
.collect(Collectors.toList());
142+
142143
double score = filteredProposals.size();
143-
for (Map.Entry<String, String> entry : filteredProposals.entrySet()) {
144-
String candidate = entry.getKey();
144+
for (AnnotationAttributeProposal candidate : filteredProposals) {
145145
DocumentEdits edits = new DocumentEdits(doc, false);
146-
edits.replace(startOffset, endOffset, createReplacementText.apply(candidate));
146+
edits.replace(startOffset, endOffset, createReplacementText.apply(candidate.getLabel()));
147147

148148
AnnotationAttributeCompletionProposal proposal = new AnnotationAttributeCompletionProposal(edits,
149-
candidate, entry.getValue(), null, score--);
150-
completions.add(proposal);
149+
candidate, null, score--);
151150

151+
completions.add(proposal);
152152
}
153153
}
154154
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProposal.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,26 @@
2020
*/
2121
public class AnnotationAttributeCompletionProposal extends ScoreableProposal {
2222

23-
private static final String EMPTY_DETAIL = "";
23+
private final AnnotationAttributeProposal coreProposal;
2424

2525
private final DocumentEdits edits;
26-
private final String label;
27-
private final String detail;
2826
private final Renderable documentation;
2927
private final double score;
3028

31-
public AnnotationAttributeCompletionProposal(DocumentEdits edits, String label, String detail, Renderable documentation, double score) {
29+
public AnnotationAttributeCompletionProposal(DocumentEdits edits, AnnotationAttributeProposal coreProposal, Renderable documentation, double score) {
3230
this.edits = edits;
33-
this.label = label;
34-
this.detail = detail == null ? EMPTY_DETAIL : detail;
31+
this.coreProposal = coreProposal;
3532
this.documentation = documentation;
3633
this.score = score;
3734
}
3835

36+
// public AnnotationAttributeCompletionProposal(DocumentEdits edits, String label, String detail, Renderable documentation, double score) {
37+
// this(edits, new AnnotationAttributeProposal(label, detail), documentation, score);
38+
// }
39+
3940
@Override
4041
public String getLabel() {
41-
return this.label;
42+
return this.coreProposal.getLabel();
4243
}
4344

4445
@Override
@@ -53,7 +54,7 @@ public DocumentEdits getTextEdit() {
5354

5455
@Override
5556
public String getDetail() {
56-
return this.detail;
57+
return this.coreProposal.getDetail();
5758
}
5859

5960
@Override

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationAttributeCompletionProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.annotations;
1212

13-
import java.util.Map;
13+
import java.util.List;
1414

1515
import org.eclipse.jdt.core.dom.ASTNode;
1616
import org.springframework.ide.vscode.commons.java.IJavaProject;
1717

1818
public interface AnnotationAttributeCompletionProvider {
1919

20-
Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node);
20+
List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node);
2121

2222
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Broadcom
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Broadcom - initial API and implementation
10+
*******************************************************************************/
11+
package org.springframework.ide.vscode.boot.java.annotations;
12+
13+
/**
14+
* @author Martin Lippert
15+
*/
16+
public class AnnotationAttributeProposal {
17+
18+
private static final String EMPTY_DETAIL = "";
19+
20+
private final String filterText;
21+
private final String label;
22+
private final String detail;
23+
24+
public AnnotationAttributeProposal(String label) {
25+
this(label, label, label);
26+
}
27+
28+
public AnnotationAttributeProposal(String label, String detail) {
29+
this(label, detail, label);
30+
}
31+
32+
public AnnotationAttributeProposal(String label, String detail, String filterText) {
33+
this.label = label;
34+
this.detail = detail == null ? EMPTY_DETAIL : detail;
35+
this.filterText = filterText;
36+
}
37+
38+
public String getLabel() {
39+
return label;
40+
}
41+
42+
public String getDetail() {
43+
return detail;
44+
}
45+
46+
public String getFilterText() {
47+
return filterText;
48+
}
49+
50+
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanNamesCompletionProcessor.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.LinkedHashMap;
15-
import java.util.Map;
14+
import java.util.List;
1615
import java.util.stream.Collectors;
1716

1817
import org.eclipse.jdt.core.dom.ASTNode;
1918
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
2019
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
20+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeProposal;
2121
import org.springframework.ide.vscode.commons.java.IJavaProject;
2222
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
2323

@@ -33,11 +33,12 @@ public BeanNamesCompletionProcessor(SpringMetamodelIndex springIndex) {
3333
}
3434

3535
@Override
36-
public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node) {
36+
public List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node) {
3737
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
3838
return Arrays.stream(beans)
3939
.map(Bean::getName)
4040
.distinct()
41-
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
41+
.map(beanName -> new AnnotationAttributeProposal(beanName))
42+
.collect(Collectors.toList());
4243
}
4344
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanTypesCompletionProcessor.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

13+
import java.util.Arrays;
14+
import java.util.List;
15+
import java.util.stream.Collectors;
16+
1317
import org.eclipse.jdt.core.dom.ASTNode;
1418
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
1519
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
20+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeProposal;
1621
import org.springframework.ide.vscode.commons.java.IJavaProject;
1722
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
1823

19-
import java.util.Arrays;
20-
import java.util.LinkedHashMap;
21-
import java.util.Map;
22-
import java.util.stream.Collectors;
23-
2424
/**
2525
* @author Karthik Sankaranarayanan
2626
*/
@@ -33,11 +33,12 @@ public BeanTypesCompletionProcessor(SpringMetamodelIndex springIndex) {
3333
}
3434

3535
@Override
36-
public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node) {
36+
public List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node) {
3737
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
3838
return Arrays.stream(beans)
3939
.map(Bean::getType)
4040
.distinct()
41-
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
41+
.map(beanType -> new AnnotationAttributeProposal(beanType))
42+
.collect(Collectors.toList());
4243
}
4344
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/DependsOnCompletionProcessor.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.LinkedHashMap;
15-
import java.util.Map;
14+
import java.util.List;
1615
import java.util.stream.Collectors;
1716

1817
import org.eclipse.jdt.core.dom.ASTNode;
1918
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
2019
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
20+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeProposal;
2121
import org.springframework.ide.vscode.commons.java.IJavaProject;
2222

2323
/**
@@ -238,11 +238,12 @@ public DependsOnCompletionProcessor(SpringMetamodelIndex springIndex) {
238238
// }
239239

240240
@Override
241-
public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node) {
241+
public List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node) {
242242
return Arrays.stream(this.springIndex.getBeansOfProject(project.getElementName()))
243243
.map(bean -> bean.getName())
244244
.distinct()
245-
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
245+
.map(beanName -> new AnnotationAttributeProposal(beanName))
246+
.collect(Collectors.toList());
246247
}
247248

248249

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/NamedCompletionProvider.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.LinkedHashMap;
15-
import java.util.Map;
14+
import java.util.List;
1615
import java.util.stream.Collectors;
1716
import java.util.stream.Stream;
1817

1918
import org.eclipse.jdt.core.dom.ASTNode;
2019
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
2120
import org.springframework.ide.vscode.boot.java.Annotations;
2221
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
22+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeProposal;
2323
import org.springframework.ide.vscode.commons.java.IJavaProject;
2424
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
2525

@@ -35,15 +35,16 @@ public NamedCompletionProvider(SpringMetamodelIndex springIndex) {
3535
}
3636

3737
@Override
38-
public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node) {
38+
public List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node) {
3939

4040
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
4141

4242
return Stream.concat(
4343
findAllNamedValues(beans),
4444
Arrays.stream(beans).map(bean -> bean.getName()))
4545
.distinct()
46-
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
46+
.map(beanName -> new AnnotationAttributeProposal(beanName))
47+
.collect(Collectors.toList());
4748
}
4849

4950
private Stream<String> findAllNamedValues(Bean[] beans) {

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ProfileCompletionProvider.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.LinkedHashMap;
15-
import java.util.Map;
14+
import java.util.List;
1615
import java.util.stream.Collectors;
1716
import java.util.stream.Stream;
1817

1918
import org.eclipse.jdt.core.dom.ASTNode;
2019
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
2120
import org.springframework.ide.vscode.boot.java.Annotations;
2221
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
22+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeProposal;
2323
import org.springframework.ide.vscode.commons.java.IJavaProject;
2424
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
2525

@@ -35,13 +35,14 @@ public ProfileCompletionProvider(SpringMetamodelIndex springIndex) {
3535
}
3636

3737
@Override
38-
public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node) {
38+
public List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node) {
3939

4040
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
4141

4242
return findAllProfiles(beans)
4343
.distinct()
44-
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
44+
.map(profile -> new AnnotationAttributeProposal(profile))
45+
.collect(Collectors.toList());
4546
}
4647

4748
private Stream<String> findAllProfiles(Bean[] beans) {

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/QualifierCompletionProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.LinkedHashMap;
1514
import java.util.List;
16-
import java.util.Map;
1715
import java.util.stream.Collectors;
1816
import java.util.stream.Stream;
1917

@@ -25,6 +23,7 @@
2523
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
2624
import org.springframework.ide.vscode.boot.java.Annotations;
2725
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
26+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeProposal;
2827
import org.springframework.ide.vscode.commons.java.IJavaProject;
2928
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
3029

@@ -40,7 +39,7 @@ public QualifierCompletionProvider(SpringMetamodelIndex springIndex) {
4039
}
4140

4241
@Override
43-
public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode node) {
42+
public List<AnnotationAttributeProposal> getCompletionCandidates(IJavaProject project, ASTNode node) {
4443

4544
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
4645

@@ -54,7 +53,8 @@ public Map<String, String> getCompletionCandidates(IJavaProject project, ASTNode
5453

5554
return candidates
5655
.distinct()
57-
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
56+
.map(qualifier -> new AnnotationAttributeProposal(qualifier))
57+
.collect(Collectors.toList());
5858
}
5959

6060
private Stream<String> findAllQualifiers(Bean[] beans) {

0 commit comments

Comments
 (0)