Skip to content

Commit ab2aad5

Browse files
committed
Merge branch 'main' of https://github.com/spring-projects/sts4 into main
2 parents 88d357f + 99d703a commit ab2aad5

File tree

22 files changed

+717
-83
lines changed

22 files changed

+717
-83
lines changed

headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
import org.eclipse.lsp4j.HoverParams;
8080
import org.eclipse.lsp4j.InitializeParams;
8181
import org.eclipse.lsp4j.InitializeResult;
82+
import org.eclipse.lsp4j.InlayHint;
83+
import org.eclipse.lsp4j.InlayHintParams;
8284
import org.eclipse.lsp4j.Location;
8385
import org.eclipse.lsp4j.LocationLink;
8486
import org.eclipse.lsp4j.MarkupContent;
@@ -681,6 +683,12 @@ public List<? extends CodeLens> getCodeLenses(TextDocumentInfo document) throws
681683
params.setTextDocument(document.getId());
682684
return getServer().getTextDocumentService().codeLens(params).get();
683685
}
686+
687+
public List<InlayHint> getInlayHints(TextDocumentInfo document) throws Exception {
688+
InlayHintParams params = new InlayHintParams();
689+
params.setTextDocument(document.getId());
690+
return getServer().getTextDocumentService().inlayHint(params).get();
691+
}
684692

685693
public List<? extends DocumentHighlight> getDocumentHighlights(TextDocumentIdentifier docId, Position cursor) throws InterruptedException, ExecutionException {
686694
return getServer().getTextDocumentService().documentHighlight(new DocumentHighlightParams(docId, cursor)).get();

headless-services/spring-boot-language-server/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,13 @@
194194
<artifactId>commons-util</artifactId>
195195
<version>1.58.0-SNAPSHOT</version>
196196
</dependency>
197+
198+
<!-- Cron expression descriptor library -->
199+
<dependency>
200+
<groupId>com.cronutils</groupId>
201+
<artifactId>cron-utils</artifactId>
202+
<version>9.2.0</version>
203+
</dependency>
197204
</dependencies>
198205

199206
<profiles>

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
import org.springframework.ide.vscode.boot.java.beans.ProfileCompletionProvider;
3131
import org.springframework.ide.vscode.boot.java.beans.QualifierCompletionProvider;
3232
import org.springframework.ide.vscode.boot.java.beans.ResourceCompletionProvider;
33+
import org.springframework.ide.vscode.boot.java.conditionalonresource.ConditionalOnResourceCompletionProcessor;
34+
import org.springframework.ide.vscode.boot.java.contextconfiguration.ContextConfigurationProcessor;
35+
import org.springframework.ide.vscode.boot.java.cron.CronExpressionCompletionProvider;
3336
import org.springframework.ide.vscode.boot.java.data.DataRepositoryCompletionProcessor;
3437
import org.springframework.ide.vscode.boot.java.handlers.BootJavaCompletionEngine;
3538
import org.springframework.ide.vscode.boot.java.handlers.CompletionProvider;
@@ -40,8 +43,6 @@
4043
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
4144
import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache;
4245
import org.springframework.ide.vscode.boot.java.value.ValueCompletionProcessor;
43-
import org.springframework.ide.vscode.boot.java.contextconfiguration.ContextConfigurationProcessor;
44-
import org.springframework.ide.vscode.boot.java.conditionalonresource.ConditionalOnResourceCompletionProcessor;
4546
import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexProvider;
4647
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider;
4748
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
@@ -132,6 +133,8 @@ BootJavaCompletionEngine javaCompletionEngine(
132133

133134
providers.put(Annotations.NAMED_JAKARTA, new AnnotationAttributeCompletionProcessor(javaProjectFinder, Map.of("value", new NamedCompletionProvider(springIndex))));
134135
providers.put(Annotations.NAMED_JAVAX, new AnnotationAttributeCompletionProcessor(javaProjectFinder, Map.of("value", new NamedCompletionProvider(springIndex))));
136+
137+
providers.put(Annotations.SCHEDULED, new AnnotationAttributeCompletionProcessor(javaProjectFinder, Map.of("cron", new CronExpressionCompletionProvider())));
135138

136139
return new BootJavaCompletionEngine(cuCache, providers, snippetManager);
137140
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.context.annotation.Bean;
1717
import org.springframework.context.annotation.Conditional;
1818
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.ide.vscode.boot.java.cron.CronExpressionsInlayHintsProvider;
1920
import org.springframework.ide.vscode.boot.java.cron.CronReconciler;
2021
import org.springframework.ide.vscode.boot.java.cron.CronSemanticTokens;
2122
import org.springframework.ide.vscode.boot.java.cron.JdtCronReconciler;
@@ -139,6 +140,10 @@ public class JdtConfig {
139140
return new JdtDataQueriesInlayHintsProvider(semanticTokensProvider);
140141
}
141142

143+
@Bean CronExpressionsInlayHintsProvider cronExpressionsInlayHintsProvider() {
144+
return new CronExpressionsInlayHintsProvider();
145+
}
146+
142147
@Bean JdtQueryDocHighlightsProvider jdtDocHighlightsProvider(JdtDataQuerySemanticTokensProvider semanticTokensProvider) {
143148
return new JdtQueryDocHighlightsProvider(semanticTokensProvider);
144149
}

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

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

1313
import java.util.Collection;
1414
import java.util.HashSet;
15+
import java.util.LinkedHashMap;
1516
import java.util.List;
1617
import java.util.Map;
1718
import java.util.Optional;
@@ -114,34 +115,34 @@ else if (node instanceof ArrayInitializer && node.getParent() instanceof Annotat
114115
/**
115116
* create the concrete completion proposal
116117
*/
117-
private void createCompletionProposals(IJavaProject project, TextDocument doc, ASTNode node, String attributeName, Collection<ICompletionProposal> completions, int startOffset, int endOffset,
118-
String filterPrefix, Function<String, String> createReplacementText) {
118+
private void createCompletionProposals(IJavaProject project, TextDocument doc, ASTNode node, String attributeName,
119+
Collection<ICompletionProposal> completions, int startOffset, int endOffset, String filterPrefix,
120+
Function<String, String> createReplacementText) {
119121

120122
Set<String> alreadyMentionedValues = alreadyMentionedValues(node);
121123

122124
AnnotationAttributeCompletionProvider completionProvider = this.completionProviders.get(attributeName);
123125
if (completionProvider != null) {
124-
List<String> candidates = completionProvider.getCompletionCandidates(project);
125126

126-
List<String> filteredCandidates = candidates.stream()
127-
// .filter(candidate -> candidate.toLowerCase().startsWith(filterPrefix.toLowerCase()))
128-
.filter(candidate -> candidate.toLowerCase().contains(filterPrefix.toLowerCase()))
129-
.filter(candidate -> !alreadyMentionedValues.contains(candidate))
130-
.collect(Collectors.toList());
131-
132-
double score = filteredCandidates.size();
133-
for (String candidate : filteredCandidates) {
134-
127+
Map<String, String> proposals = completionProvider.getCompletionCandidates(project);
128+
Map<String, String> filteredProposals = proposals.entrySet().stream()
129+
.filter(candidate -> candidate.getKey().toLowerCase().contains(filterPrefix.toLowerCase()))
130+
.filter(candidate -> !alreadyMentionedValues.contains(candidate.getKey()))
131+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (u, v) -> u, LinkedHashMap::new));
132+
double score = filteredProposals.size();
133+
for (Map.Entry<String, String> entry : filteredProposals.entrySet()) {
134+
String candidate = entry.getKey();
135135
DocumentEdits edits = new DocumentEdits(doc, false);
136136
edits.replace(startOffset, endOffset, createReplacementText.apply(candidate));
137-
138-
AnnotationAttributeCompletionProposal proposal = new AnnotationAttributeCompletionProposal(edits, candidate, candidate, null, score--);
137+
138+
AnnotationAttributeCompletionProposal proposal = new AnnotationAttributeCompletionProposal(edits,
139+
candidate, entry.getValue(), null, score--);
139140
completions.add(proposal);
141+
140142
}
141143
}
142144
}
143145

144-
145146
//
146147
// internal computation of the right positions, prefixes, etc.
147148
//

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,12 +10,12 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.annotations;
1212

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

1515
import org.springframework.ide.vscode.commons.java.IJavaProject;
1616

1717
public interface AnnotationAttributeCompletionProvider {
1818

19-
List<String> getCompletionCandidates(IJavaProject project);
19+
Map<String, String> getCompletionCandidates(IJavaProject project);
2020

2121
}

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

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

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

1618
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
1719
import org.springframework.ide.vscode.boot.java.annotations.AnnotationAttributeCompletionProvider;
@@ -235,11 +237,11 @@ public DependsOnCompletionProcessor(SpringMetamodelIndex springIndex) {
235237
// }
236238

237239
@Override
238-
public List<String> getCompletionCandidates(IJavaProject project) {
240+
public Map<String, String> getCompletionCandidates(IJavaProject project) {
239241
return Arrays.stream(this.springIndex.getBeansOfProject(project.getElementName()))
240242
.map(bean -> bean.getName())
241243
.distinct()
242-
.toList();
244+
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
243245
}
244246

245247

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

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

1313
import java.util.Arrays;
14-
import java.util.List;
14+
import java.util.LinkedHashMap;
15+
import java.util.Map;
16+
import java.util.stream.Collectors;
1517
import java.util.stream.Stream;
1618

1719
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
@@ -32,15 +34,15 @@ public NamedCompletionProvider(SpringMetamodelIndex springIndex) {
3234
}
3335

3436
@Override
35-
public List<String> getCompletionCandidates(IJavaProject project) {
37+
public Map<String, String> getCompletionCandidates(IJavaProject project) {
3638

3739
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
3840

3941
return Stream.concat(
4042
findAllNamedValues(beans),
4143
Arrays.stream(beans).map(bean -> bean.getName()))
4244
.distinct()
43-
.toList();
45+
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
4446
}
4547

4648
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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.List;
14+
import java.util.LinkedHashMap;
15+
import java.util.Map;
16+
import java.util.stream.Collectors;
1517
import java.util.stream.Stream;
1618

1719
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
@@ -32,13 +34,13 @@ public ProfileCompletionProvider(SpringMetamodelIndex springIndex) {
3234
}
3335

3436
@Override
35-
public List<String> getCompletionCandidates(IJavaProject project) {
37+
public Map<String, String> getCompletionCandidates(IJavaProject project) {
3638

3739
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
3840

3941
return findAllProfiles(beans)
4042
.distinct()
41-
.toList();
43+
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
4244
}
4345

4446
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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import java.util.Arrays;
14-
import java.util.List;
14+
import java.util.LinkedHashMap;
15+
import java.util.Map;
16+
import java.util.stream.Collectors;
1517
import java.util.stream.Stream;
1618

1719
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
@@ -32,15 +34,15 @@ public QualifierCompletionProvider(SpringMetamodelIndex springIndex) {
3234
}
3335

3436
@Override
35-
public List<String> getCompletionCandidates(IJavaProject project) {
37+
public Map<String, String> getCompletionCandidates(IJavaProject project) {
3638

3739
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
3840

3941
return Stream.concat(
4042
findAllQualifiers(beans),
4143
Arrays.stream(beans).map(bean -> bean.getName()))
4244
.distinct()
43-
.toList();
45+
.collect(Collectors.toMap(key -> key, value -> value, (u, v) -> u, LinkedHashMap::new));
4446
}
4547

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

0 commit comments

Comments
 (0)