Skip to content

Commit 00d423a

Browse files
committed
Setting to "elide prefix" for properties completions
1 parent f844544 commit 00d423a

File tree

11 files changed

+71
-13
lines changed

11 files changed

+71
-13
lines changed

eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/Constants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,6 @@ public class Constants {
4848

4949
public static final String PREF_JPQL = "boot-java.jpql";
5050

51+
public static final String PREF_PROPS_COMPLETIONS_ELIDE_PREFIX = "boot-java.properties.completions.elide-prefix";
52+
5153
}

eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ private void sendConfiguration() {
223223
"properties-metadata", preferenceStore.getString(Constants.PREF_COMMON_PROPS_METADATA)
224224
));
225225

226+
bootJavaObj.put("properties", Map.of(
227+
"completions", Map.of(
228+
"elide-prefix", preferenceStore.getBoolean(Constants.PREF_PROPS_COMPLETIONS_ELIDE_PREFIX)
229+
)
230+
));
231+
226232
settings.put("boot-java", bootJavaObj);
227233

228234
settings.put("http", createHttpProxySettings());

eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ protected void createFieldEditors() {
4545

4646
// JPQL Support switch
4747
addField(new BooleanFieldEditor(Constants.PREF_JPQL, "JPA Query language support", fieldEditorParent));
48+
49+
// Properties Completions - Elide common prefix
50+
addField(new BooleanFieldEditor(Constants.PREF_PROPS_COMPLETIONS_ELIDE_PREFIX, "Elide common prefix in property key auto completions", fieldEditorParent));
4851

4952
// Experimental Modulith support
5053
addField(new BooleanFieldEditor(Constants.PREF_MODULITH, "Spring Boot Modulith automatic project tracking and metadata update", fieldEditorParent));

eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/PrefsInitializer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public void initializeDefaultPreferences() {
6666

6767
preferenceStore.setDefault(Constants.PREF_JPQL, true);
6868

69+
preferenceStore.setDefault(Constants.PREF_PROPS_COMPLETIONS_ELIDE_PREFIX, false);
70+
6971
}
7072

7173
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.slf4j.LoggerFactory;
2323
import org.springframework.beans.factory.InitializingBean;
2424
import org.springframework.ide.vscode.boot.common.SpringProblemCategories;
25+
import org.springframework.ide.vscode.boot.properties.completions.PropertyCompletionSettings;
2526
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemCategory.Toggle;
2627
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
2728
import org.springframework.ide.vscode.commons.languageserver.util.ListenerList;
@@ -235,6 +236,13 @@ public Toggle.Option getProblemApplicability(ProblemType problem) {
235236
return Toggle.Option.AUTO;
236237
}
237238

239+
public PropertyCompletionSettings getPropertyCompletionSettings() {
240+
Boolean elidePrefix = settings.getBoolean("boot-java", "properties", "completions", "elide-prefix");
241+
return new PropertyCompletionSettings(
242+
elidePrefix != null && elidePrefix.booleanValue()
243+
);
244+
}
245+
238246
public JsonObject getJavaValidationSettingsJson() {
239247
JsonObject javaValidationsJson = new JsonObject();
240248
List<String> javaValidationTypes = List.of(

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,11 @@ SpringProcessConnectorRemote localAppsFromCommandsConnector(SimpleLanguageServer
286286
return new SpringXMLCompletionEngine(server, projectFinder, symbolIndex, config);
287287
}
288288

289-
@Bean SpringPropertiesCompletionEngine propertiesCompletionEngine(BootLanguageServerParams params, JavaProjectFinder projectFinder, SourceLinks sourceLinks) {
289+
@Bean SpringPropertiesCompletionEngine propertiesCompletionEngine(BootLanguageServerParams params, JavaProjectFinder projectFinder, SourceLinks sourceLinks, BootJavaConfig config) {
290290
return new SpringPropertiesCompletionEngine(
291291
params.indexProvider,
292292
params.typeUtilProvider,
293-
projectFinder, sourceLinks);
293+
projectFinder, sourceLinks, config);
294294
}
295295

296296
@Bean YamlCompletionEngine yamlCompletionEngine(YamlStructureProvider structureProvider, YamlAssistContextProvider contextProvider) {

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/PropertiesCompletionProposalsCalculator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,12 @@ protected boolean isPrefixChar(char c) {
116116
private int offset;
117117
private boolean preferLowerCaseEnums;
118118
private AntlrParser parser;
119+
private final PropertyCompletionSettings propertyCompletionSettings;
119120

120-
public PropertiesCompletionProposalsCalculator(FuzzyMap<PropertyInfo> index, TypeUtil typeUtil, PropertyCompletionFactory completionFactory, IDocument doc, int offset, boolean preferLowerCaseEnums) {
121+
public PropertiesCompletionProposalsCalculator(FuzzyMap<PropertyInfo> index, PropertyCompletionSettings propertyCompletionSettings,
122+
TypeUtil typeUtil, PropertyCompletionFactory completionFactory, IDocument doc, int offset, boolean preferLowerCaseEnums) {
121123
this.index = index;
124+
this.propertyCompletionSettings = propertyCompletionSettings;
122125
this.typeUtil = typeUtil;
123126
this.completionFactory = completionFactory;
124127
this.doc = doc;
@@ -365,7 +368,7 @@ protected Collection<ICompletionProposal> getFuzzyCompletions() {
365368
}
366369

367370
private Collection<ICompletionProposal> elideCommonPrefix(String basePrefix, ArrayList<ICompletionProposal> proposals) {
368-
if (false) { // TODO: check for preference setting
371+
if (propertyCompletionSettings.elidePrefix()) {
369372
String prefix = StringUtil.commonPrefix(Stream.concat(Stream.of(basePrefix), proposals.stream().map(ICompletionProposal::getLabel)));
370373
int lastDot = prefix.lastIndexOf('.');
371374
if (lastDot>=0) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Broadcom, Inc.
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, Inc. - initial API and implementation
10+
*******************************************************************************/
11+
package org.springframework.ide.vscode.boot.properties.completions;
12+
13+
public record PropertyCompletionSettings(boolean elidePrefix) {
14+
15+
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/SpringPropertiesCompletionEngine.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import java.util.Collection;
1515

16+
import org.springframework.ide.vscode.boot.app.BootJavaConfig;
1617
import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory;
1718
import org.springframework.ide.vscode.boot.java.links.SourceLinks;
1819
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider;
@@ -35,18 +36,21 @@ public class SpringPropertiesCompletionEngine implements ICompletionEngine, Lang
3536

3637
private boolean preferLowerCaseEnums = true; //might make sense to make this user configurable
3738

38-
private SpringPropertyIndexProvider indexProvider;
39-
private TypeUtilProvider typeUtilProvider;
40-
private PropertyCompletionFactory completionFactory = null;
41-
private SourceLinks sourceLinks;
39+
private final SpringPropertyIndexProvider indexProvider;
40+
private final TypeUtilProvider typeUtilProvider;
41+
private final PropertyCompletionFactory completionFactory;
42+
private final SourceLinks sourceLinks;
43+
private final BootJavaConfig config;
4244

4345
/**
4446
* Constructor used in 'production'. Wires up stuff properly for running inside a normal
4547
* Eclipse runtime.
4648
*/
47-
public SpringPropertiesCompletionEngine(SpringPropertyIndexProvider indexProvider, TypeUtilProvider typeUtilProvider, JavaProjectFinder projectFinder, SourceLinks sourceLinks) {
49+
public SpringPropertiesCompletionEngine(SpringPropertyIndexProvider indexProvider, TypeUtilProvider typeUtilProvider, JavaProjectFinder projectFinder,
50+
SourceLinks sourceLinks, BootJavaConfig config) {
4851
this.indexProvider = indexProvider;
4952
this.typeUtilProvider = typeUtilProvider;
53+
this.config = config;
5054
this.completionFactory = new PropertyCompletionFactory();
5155
this.sourceLinks = sourceLinks;
5256
}
@@ -56,7 +60,7 @@ public SpringPropertiesCompletionEngine(SpringPropertyIndexProvider indexProvide
5660
*/
5761
@Override
5862
public InternalCompletionList getCompletions(TextDocument doc, int offset) throws BadLocationException {
59-
Collection<ICompletionProposal> completionItems = new PropertiesCompletionProposalsCalculator(indexProvider.getIndex(doc).getProperties(),
63+
Collection<ICompletionProposal> completionItems = new PropertiesCompletionProposalsCalculator(indexProvider.getIndex(doc).getProperties(), config.getPropertyCompletionSettings(),
6064
typeUtilProvider.getTypeUtil(sourceLinks, doc), completionFactory, doc, offset, preferLowerCaseEnums).calculate();
6165

6266
return new InternalCompletionList(completionItems, true);

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.ide.vscode.boot.metadata.PropertiesLoader;
4343
import org.springframework.ide.vscode.commons.java.IJavaProject;
4444
import org.springframework.ide.vscode.commons.java.IType;
45+
import org.springframework.ide.vscode.commons.languageserver.util.Settings;
4546
import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject;
4647
import org.springframework.ide.vscode.commons.util.text.LanguageId;
4748
import org.springframework.ide.vscode.languageserver.testharness.CodeAction;
@@ -51,6 +52,8 @@
5152

5253
import com.google.common.collect.ImmutableList;
5354
import com.google.common.io.Files;
55+
import com.google.gson.Gson;
56+
import com.google.gson.JsonElement;
5457

5558
/**
5659
* Boot App Properties Editor tests
@@ -292,6 +295,13 @@ void inheritedPojoProperties() throws Exception {
292295

293296
@Test
294297
void abbreviateLongPrefixCompletions() throws Exception {
298+
299+
String changedSettings = "{\"boot-java\": {\"properties\": {\"completions\": {\"elide-prefix\": true}}}}";
300+
JsonElement settingsAsJson = new Gson().fromJson(changedSettings, JsonElement.class);
301+
Settings settings = new Settings(settingsAsJson);
302+
303+
harness.changeConfiguration(settings);
304+
295305
//See: https://github.com/spring-projects/sts4/issues/361
296306
Editor editor;
297307

@@ -815,9 +825,9 @@ void testRecordCompletions() throws Exception {
815825
assertCompletionsDisplayString(
816826
"application.temp.user.<*>"
817827
, // =>
818-
"name",
819-
"password",
820-
"roles"
828+
"application.temp.user.name",
829+
"application.temp.user.password",
830+
"application.temp.user.roles"
821831
);
822832

823833
assertCompletionsDisplayString(

0 commit comments

Comments
 (0)