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 aa5fedf8b..983a1bd2b 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 @@ -56,4 +56,6 @@ public class Constants { public static final String PREF_SYMBOLS_FROM_NEW_INDEX = "boot-java.java.symbols-from-new-index"; + public static final String PREF_CODELENS_QUERY_METHODS = "boot-java.java.codelens-over-query-methods"; + } 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 8358a8eff..aebbee967 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 @@ -203,6 +203,7 @@ public class DelegatingStreamConnectionProvider implements StreamConnectionProvi javaSettings.put("symbols-from-new-index", preferenceStore.getBoolean(Constants.PREF_SYMBOLS_FROM_NEW_INDEX)); javaSettings.put("completions", javaCompletionSettings); javaSettings.put("reconcilers", preferenceStore.getBoolean(Constants.PREF_JAVA_RECONCILE)); + javaSettings.put("codelens-over-query-methods", preferenceStore.getBoolean(Constants.PREF_CODELENS_QUERY_METHODS)); bootJavaObj.put("jpql", preferenceStore.getBoolean(Constants.PREF_JPQL)); bootJavaObj.put("live-information", liveInformation); 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 5d7ed55a1..a94cfc4e1 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 @@ -56,6 +56,9 @@ public class BootJavaPreferencesPage extends FieldEditorPreferencePage implement // Experimental Bean Injections completion in Java editor addField(new BooleanFieldEditor(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN, "Inject Bean completion proposals in Java editor", fieldEditorParent)); + // Show AOT generated query over Data Query methods + addField(new BooleanFieldEditor(Constants.PREF_CODELENS_QUERY_METHODS, "Show CodeLens with AOT generated query over Data Query methods", fieldEditorParent)); + // Experimental Beans tree addField(new BooleanFieldEditor(Constants.PREF_BEANS_STRUCTURE_TREE, "Beans structure tree in the outline view (experimental)", fieldEditorParent)); 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 7aa55ae6e..7192879f0 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 @@ -66,6 +66,7 @@ public class PrefsInitializer extends AbstractPreferenceInitializer { preferenceStore.setDefault(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN, true); preferenceStore.setDefault(Constants.PREF_BEANS_STRUCTURE_TREE, true); preferenceStore.setDefault(Constants.PREF_SYMBOLS_FROM_NEW_INDEX, true); + preferenceStore.setDefault(Constants.PREF_CODELENS_QUERY_METHODS, true); } } 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 8ae6df611..0064621c4 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 @@ -224,6 +224,11 @@ public class BootJavaConfig implements InitializingBean { return Boolean.TRUE.equals(b); } + public boolean isEnabledCodeLensOverDataQueryMethods() { + Boolean b = settings.getBoolean("boot-java", "java", "codelens-over-query-methods"); + 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/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index f8c78177d..03802ae51 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -182,7 +182,8 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent spelSemanticTokens = appContext.getBean(SpelSemanticTokens.class); dataRepositoryAotMetadataService = appContext.getBean(DataRepositoryAotMetadataService.class); - codeLensHandler = createCodeLensEngine(springIndex, projectFinder, server, spelSemanticTokens, dataRepositoryAotMetadataService, appContext.getBean(RewriteRefactorings.class)); + codeLensHandler = createCodeLensEngine(springIndex, projectFinder, server, spelSemanticTokens, dataRepositoryAotMetadataService, + appContext.getBean(RewriteRefactorings.class), config); highlightsEngine = createDocumentHighlightEngine(appContext); documents.onDocumentHighlight(highlightsEngine); @@ -317,12 +318,13 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent } protected BootJavaCodeLensEngine createCodeLensEngine(SpringMetamodelIndex springIndex, JavaProjectFinder projectFinder, SimpleLanguageServer server, - SpelSemanticTokens spelSemanticTokens, DataRepositoryAotMetadataService repositoryAotMetadataService, RewriteRefactorings refactorings) { + SpelSemanticTokens spelSemanticTokens, DataRepositoryAotMetadataService repositoryAotMetadataService, RewriteRefactorings refactorings, + BootJavaConfig config) { Collection codeLensProvider = new ArrayList<>(); codeLensProvider.add(new WebfluxHandlerCodeLensProvider(springIndex)); codeLensProvider.add(new CopilotCodeLensProvider(projectFinder, server, spelSemanticTokens)); - codeLensProvider.add(new DataRepositoryAotMetadataCodeLensProvider(projectFinder, repositoryAotMetadataService, refactorings)); + codeLensProvider.add(new DataRepositoryAotMetadataCodeLensProvider(projectFinder, repositoryAotMetadataService, refactorings, config)); return new BootJavaCodeLensEngine(this, codeLensProvider); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java index 7ac85a351..f99706b3a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java @@ -30,6 +30,7 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.ide.vscode.boot.app.BootJavaConfig; import org.springframework.ide.vscode.boot.java.Annotations; import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchies; import org.springframework.ide.vscode.boot.java.handlers.CodeLensProvider; @@ -54,15 +55,21 @@ public class DataRepositoryAotMetadataCodeLensProvider implements CodeLensProvid private final DataRepositoryAotMetadataService repositoryMetadataService; private final JavaProjectFinder projectFinder; private final RewriteRefactorings refactorings; + private final BootJavaConfig config; - public DataRepositoryAotMetadataCodeLensProvider(JavaProjectFinder projectFinder, DataRepositoryAotMetadataService repositoryMetadataService, RewriteRefactorings refactorings) { + public DataRepositoryAotMetadataCodeLensProvider(JavaProjectFinder projectFinder, DataRepositoryAotMetadataService repositoryMetadataService, + RewriteRefactorings refactorings, BootJavaConfig config) { this.projectFinder = projectFinder; this.repositoryMetadataService = repositoryMetadataService; this.refactorings = refactorings; + this.config = config; } @Override public void provideCodeLenses(CancelChecker cancelToken, TextDocument document, CompilationUnit cu, List resultAccumulator) { + if (!config.isEnabledCodeLensOverDataQueryMethods()) { + return; + } cu.accept(new ASTVisitor() { @Override public boolean visit(MethodDeclaration node) { @@ -158,9 +165,12 @@ public class DataRepositoryAotMetadataCodeLensProvider implements CodeLensProvid codeLenses.add(new CodeLens(range, impl, null)); if (!isQueryAnnotated) { - Command queryTitle = new Command(); - queryTitle.setTitle(methodMetadata.get().getQueryStatement(metadata)); - codeLenses.add(new CodeLens(range, queryTitle, null)); + String queryStatement = methodMetadata.get().getQueryStatement(metadata); + if (queryStatement != null) { + Command queryTitle = new Command(); + queryTitle.setTitle(queryStatement); + codeLenses.add(new CodeLens(range, queryTitle, null)); + } } } } catch (BadLocationException e) { diff --git a/vscode-extensions/vscode-spring-boot/package.json b/vscode-extensions/vscode-spring-boot/package.json index 577c8cf9f..5c21d2c25 100644 --- a/vscode-extensions/vscode-spring-boot/package.json +++ b/vscode-extensions/vscode-spring-boot/package.json @@ -383,6 +383,11 @@ "default": true, "description": "Generate workspace symbols from index (experimental)" }, + "boot-java.java.codelens-over-query-methods": { + "type": "boolean", + "default": true, + "description": "Show CodeLens with AOT generated query over Data Query methods" + }, "boot-java.remote-apps": { "type": "array", "items": {