From d4bbdf4f2f708f1bdf13d916e9c63730eba550aa Mon Sep 17 00:00:00 2001 From: aboyko Date: Fri, 28 Feb 2025 16:12:52 -0500 Subject: [PATCH] Settings for bean injection completion and bean structure --- .../tooling/boot/ls/Constants.java | 6 +++++- .../ls/DelegatingStreamConnectionProvider.java | 15 +++++++++------ .../boot/ls/prefs/BootJavaPreferencesPage.java | 8 +++++++- .../tooling/boot/ls/prefs/PrefsInitializer.java | 6 +++++- .../app/BootJavaCompletionEngineConfigurer.java | 7 ++++--- .../ide/vscode/boot/app/BootJavaConfig.java | 14 ++++++++++++-- .../ide/vscode/boot/app/SpringSymbolIndex.java | 3 ++- .../boot/java/beans/BeanCompletionProvider.java | 9 +++++++-- vscode-extensions/vscode-spring-boot/package.json | 12 +++++++++++- 9 files changed, 62 insertions(+), 18 deletions(-) diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/Constants.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/Constants.java index f15454f0b9..fa9e09aa08 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/Constants.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/Constants.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2024 Pivotal, Inc. + * Copyright (c) 2017, 2025 Pivotal, 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 @@ -52,4 +52,8 @@ public class Constants { public static final String PREF_CRON_INLAY_HINTS = "boot-java.cron.inlay-hints"; + public static final String PREF_COMPLETION_JAVA_INJECT_BEAN = "boot-java.java.completions.inject-bean"; + + public static final String PREF_BEANS_STRUCTURE_TREE = "boot-java.java.beans-structure-tree"; + } diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java index 831ae57860..2899c82eba 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2024 Pivotal, Inc. + * Copyright (c) 2017, 2025 Pivotal, 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 @@ -182,8 +182,8 @@ private void sendConfiguration() { Map supportXML = new HashMap<>(); Map bootChangeDetection = new HashMap<>(); Map scanTestJavaSources = new HashMap<>(); - Map validation = new HashMap<>(); - Map javaValidation = new HashMap<>(); + Map javaSettings = new HashMap<>(); + Map javaCompletionSettings = new HashMap<>(); IPreferenceStore preferenceStore = BootLanguageServerPlugin.getDefault().getPreferenceStore(); @@ -200,8 +200,11 @@ private void sendConfiguration() { bootChangeDetection.put("on", preferenceStore.getBoolean(Constants.PREF_CHANGE_DETECTION)); scanTestJavaSources.put("on", preferenceStore.getBoolean(Constants.PREF_SCAN_JAVA_TEST_SOURCES)); - javaValidation.put("reconcilers", preferenceStore.getBoolean(Constants.PREF_JAVA_RECONCILE)); - validation.put("java", javaValidation); + javaCompletionSettings.put("inject-bean", preferenceStore.getBoolean(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN)); + + javaSettings.put("beans-structure-tree", preferenceStore.getBoolean(Constants.PREF_BEANS_STRUCTURE_TREE)); + javaSettings.put("completions", javaCompletionSettings); + javaSettings.put("reconcilers", preferenceStore.getBoolean(Constants.PREF_JAVA_RECONCILE)); bootJavaObj.put("jpql", preferenceStore.getBoolean(Constants.PREF_JPQL)); bootJavaObj.put("live-information", liveInformation); @@ -209,7 +212,7 @@ private void sendConfiguration() { bootJavaObj.put("change-detection", bootChangeDetection); bootJavaObj.put("scan-java-test-sources", scanTestJavaSources); bootJavaObj.put("change-detection", bootChangeDetection); - bootJavaObj.put("validation", validation); + bootJavaObj.put("java", javaSettings); bootJavaObj.put("remote-apps", getAllRemoteApps()); bootJavaObj.put("modulith-project-tracking", preferenceStore.getBoolean(Constants.PREF_MODULITH)); diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java index 2e6a6e1c7b..f3a13db3a6 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/BootJavaPreferencesPage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2024 Pivotal, Inc. + * Copyright (c) 2017, 2025 Pivotal, 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 @@ -54,6 +54,12 @@ protected void createFieldEditors() { // Experimental Modulith support addField(new BooleanFieldEditor(Constants.PREF_MODULITH, "Spring Boot Modulith automatic project tracking and metadata update", fieldEditorParent)); + + // Experimental Bean Injections completion in Java editor + addField(new BooleanFieldEditor(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN, "Inject Bean completion proposals in Java editor", fieldEditorParent)); + + // Experimental Beans tree + addField(new BooleanFieldEditor(Constants.PREF_BEANS_STRUCTURE_TREE, "Beans structure tree in the outline view", fieldEditorParent)); Composite c = new Composite(fieldEditorParent, SWT.NONE); GridDataFactory.fillDefaults().grab(true, false).applyTo(c); diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/PrefsInitializer.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/PrefsInitializer.java index aef527befa..e5d00f8207 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/PrefsInitializer.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/prefs/PrefsInitializer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2024 Pivotal, Inc. + * Copyright (c) 2017, 2025 Pivotal, 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 @@ -69,6 +69,10 @@ public void initializeDefaultPreferences() { preferenceStore.setDefault(Constants.PREF_PROPS_COMPLETIONS_ELIDE_PREFIX, false); preferenceStore.setDefault(Constants.PREF_CRON_INLAY_HINTS, true); + + preferenceStore.setDefault(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN, true); + + preferenceStore.setDefault(Constants.PREF_BEANS_STRUCTURE_TREE, false); } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaCompletionEngineConfigurer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaCompletionEngineConfigurer.java index b0accc3939..c43f0e3cdd 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaCompletionEngineConfigurer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaCompletionEngineConfigurer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2020, 2024 Pivotal, Inc. + * Copyright (c) 2020, 2025 Pivotal, 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 @@ -116,7 +116,8 @@ BootJavaCompletionEngine javaCompletionEngine( JavaSnippetManager snippetManager, CompilationUnitCache cuCache, SpringMetamodelIndex springIndex, - RewriteRefactorings rewriteRefactorings ) { + RewriteRefactorings rewriteRefactorings, + BootJavaConfig config) { SpringPropertyIndexProvider indexProvider = params.indexProvider; JavaProjectFinder javaProjectFinder = params.projectFinder; @@ -171,7 +172,7 @@ BootJavaCompletionEngine javaCompletionEngine( providers.put(Annotations.SCHEDULED, new AnnotationAttributeCompletionProcessor(javaProjectFinder, Map.of( "cron", new CronExpressionCompletionProvider()))); - providers.put(Annotations.BEAN, new BeanCompletionProvider(javaProjectFinder, springIndex, rewriteRefactorings)); + providers.put(Annotations.BEAN, new BeanCompletionProvider(javaProjectFinder, springIndex, rewriteRefactorings, config)); return new BootJavaCompletionEngine(cuCache, providers, snippetManager); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java index 0c9b1be9f6..7c30345059 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootJavaConfig.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2024 Pivotal, Inc. + * Copyright (c) 2017, 2025 Pivotal, 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 @@ -168,7 +168,7 @@ public boolean areXmlHyperlinksEnabled() { } public boolean isJavaSourceReconcileEnabled() { - Boolean enabled = getRawSettings().getBoolean("boot-java", "validation", "java", "reconcilers"); + Boolean enabled = getRawSettings().getBoolean("boot-java", "java", "reconcilers"); return enabled == null ? true : enabled.booleanValue(); } @@ -214,6 +214,16 @@ public Path getCommonPropertiesFile() { return str == null || str.isBlank() ? null : Paths.get(str); } + public boolean isBeanInjectionCompletionEnabled() { + Boolean b = settings.getBoolean("boot-java", "java", "completions", "inject-bean"); + return Boolean.TRUE.equals(b); + } + + public boolean isBeanStructureTreeEnabled() { + Boolean b = settings.getBoolean("boot-java", "java", "beans-structure-tree"); + return Boolean.TRUE.equals(b); + } + public Settings getRawSettings() { return settings; } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java index 9afdd08584..f080b0385f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java @@ -708,7 +708,8 @@ public List getSymbols(String docURI) { } public List getDocumentSymbols(String docURI) { - if (System.getProperty(OUTLINE_SYMBOLS_FROM_INDEX_PROPERTY) != null) { + if (System.getProperty(OUTLINE_SYMBOLS_FROM_INDEX_PROPERTY) != null + || config.isBeanStructureTreeEnabled()) { return getDocumentSymbolsFromMetamodelIndex(docURI); } else { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java index 1f483bc997..11071ee59f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java @@ -29,6 +29,7 @@ import org.eclipse.jdt.core.dom.VariableDeclaration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.ide.vscode.boot.app.BootJavaConfig; import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex; import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchies; @@ -51,17 +52,21 @@ public class BeanCompletionProvider implements CompletionProvider { private final SpringMetamodelIndex springIndex; private final RewriteRefactorings rewriteRefactorings; + private final BootJavaConfig config; + public BeanCompletionProvider(JavaProjectFinder javaProjectFinder, SpringMetamodelIndex springIndex, - RewriteRefactorings rewriteRefactorings) { + RewriteRefactorings rewriteRefactorings, BootJavaConfig config) { this.javaProjectFinder = javaProjectFinder; this.springIndex = springIndex; this.rewriteRefactorings = rewriteRefactorings; + this.config = config; } @Override public void provideCompletions(ASTNode node, int offset, TextDocument doc, Collection completions) { - if (node instanceof SimpleName || node instanceof Block || node instanceof FieldAccess) { + if (config.isBeanInjectionCompletionEnabled() + && (node instanceof SimpleName || node instanceof Block || node instanceof FieldAccess)) { try { if (node instanceof SimpleName) { diff --git a/vscode-extensions/vscode-spring-boot/package.json b/vscode-extensions/vscode-spring-boot/package.json index 3d8101a702..13b18650d1 100644 --- a/vscode-extensions/vscode-spring-boot/package.json +++ b/vscode-extensions/vscode-spring-boot/package.json @@ -281,7 +281,7 @@ "default": true, "description": "Syntax Hyghlighting for Languages embedded into Java source code" }, - "boot-java.validation.java.reconcilers": { + "boot-java.java.reconcilers": { "type": "boolean", "default": true, "description": "Reconciling Java Sources" @@ -363,6 +363,16 @@ "default": false, "description": "Enable/Disable detecting changes of running Spring Boot applications" }, + "boot-java.java.completions.inject-bean": { + "type": "boolean", + "default": true, + "description": "Inject Bean completion proposals in Java editor" + }, + "boot-java.java.beans-structure-tree": { + "type": "boolean", + "default": false, + "description": "Beans structure tree in the outline view" + }, "boot-java.remote-apps": { "type": "array", "items": {