From 01caab7cacbd476ae88a4ab277c73a42911128dc Mon Sep 17 00:00:00 2001 From: aboyko Date: Mon, 27 Mar 2023 11:27:39 -0400 Subject: [PATCH] [spring-data] Completion label includes signature. Limit method proposal --- ...aRepositoryStandardCompletionProvider.java | 11 ++++++++--- ...toryPrefixSensitiveCompletionProvider.java | 19 +++++++++++++++++-- ...DataRepositoryCompletionProcessorTest.java | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/DataRepositoryStandardCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/DataRepositoryStandardCompletionProvider.java index 26321cc8d..3a21245b2 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/DataRepositoryStandardCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/DataRepositoryStandardCompletionProvider.java @@ -17,6 +17,7 @@ import org.springframework.ide.vscode.boot.java.data.DataRepositoryDefinition; import org.springframework.ide.vscode.boot.java.data.DomainProperty; import org.springframework.ide.vscode.boot.java.data.DomainType; import org.springframework.ide.vscode.boot.java.data.FindByCompletionProposal; +import org.springframework.ide.vscode.boot.java.data.providers.prefixsensitive.DataRepositoryPrefixSensitiveCompletionProvider; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.util.StringUtils; @@ -26,11 +27,15 @@ import org.springframework.util.StringUtils; * @author Martin Lippert */ public class DataRepositoryStandardCompletionProvider implements DataRepositoryCompletionProvider { + + private static final String FIND_BY = "findBy"; public void addProposals(Collection completions, IDocument doc, int offset, String prefix, DataRepositoryDefinition repo) { - DomainType domainType = repo.getDomainType(); - for (DomainProperty property : domainType.getPropertiesByName().values()) { - completions.add(generateCompletionProposal(offset, prefix, repo, property)); + if (FIND_BY.startsWith(DataRepositoryPrefixSensitiveCompletionProvider.findLastJavaIdentifierPart(prefix))) { + DomainType domainType = repo.getDomainType(); + for (DomainProperty property : domainType.getPropertiesByName().values()) { + completions.add(generateCompletionProposal(offset, prefix, repo, property)); + } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/prefixsensitive/DataRepositoryPrefixSensitiveCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/prefixsensitive/DataRepositoryPrefixSensitiveCompletionProvider.java index 7ea0fdec2..8ecb84f8a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/prefixsensitive/DataRepositoryPrefixSensitiveCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/prefixsensitive/DataRepositoryPrefixSensitiveCompletionProvider.java @@ -41,7 +41,7 @@ public class DataRepositoryPrefixSensitiveCompletionProvider implements DataRepo DataRepositoryMethodNameParseResult parseResult = new DataRepositoryMethodParser(localPrefix, repoDef).parseLocalPrefixForCompletion(); if(parseResult != null && parseResult.performFullCompletion()){ Map propertiesByName = repoDef.getDomainType().getPropertiesByName(); - if (parseResult.lastWord() != null || !localPrefix.endsWith("By")) { + if (isEndingWithProperty(parseResult, propertiesByName) || isEndingWithPredicateKeyWord(localPrefix, propertiesByName)) { addMethodCompletionProposal(completions, offset, repoDef, localPrefix, prefix, parseResult, propertiesByName); } @@ -51,6 +51,21 @@ public class DataRepositoryPrefixSensitiveCompletionProvider implements DataRepo addPredicateKeywordProposals(completions, offset, prefix, parseResult, propertiesByName); } } + + private boolean isEndingWithPredicateKeyWord(String localPrefix, Map propertiesByName) { + for (QueryPredicateKeywordInfo predicate : QueryPredicateKeywordInfo.PREDICATE_KEYWORDS) { + if (predicate.type() == DataRepositoryMethodKeywordType.TERMINATE_EXPRESSION + && localPrefix.endsWith(predicate.keyword())) { + return true; + } + } + return false; + } + + private boolean isEndingWithProperty(DataRepositoryMethodNameParseResult parseResult, Map propertiesByName) { + return parseResult.lastWord() != null + && (propertiesByName.containsKey(parseResult.lastWord()) || findExpressionType(propertiesByName, parseResult.lastWord()) != null); + } private void addPredicateKeywordProposals(Collection completions, int offset, String prefix, DataRepositoryMethodNameParseResult parseResult, Map propertiesByName) { String lastWord = findLastWordWithoutPrefixingProperty(parseResult, propertiesByName); @@ -118,7 +133,7 @@ public class DataRepositoryPrefixSensitiveCompletionProvider implements DataRepo int replaceStart = calculateReplaceOffset(offset, localPrefix, fullPrefix, returnType); edits.replace(replaceStart, offset, newText.toString()); DocumentEdits additionalEdits = new DocumentEdits(null, false); - ICompletionProposal proposal = new FindByCompletionProposal(methodName, CompletionItemKind.Method, edits, null, null, Optional.of(additionalEdits), signature, false); + ICompletionProposal proposal = new FindByCompletionProposal(signature, CompletionItemKind.Method, edits, null, null, Optional.of(additionalEdits), signature, false); completions.add(proposal); } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/test/DataRepositoryCompletionProcessorTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/test/DataRepositoryCompletionProcessorTest.java index 3f807429a..dc4fab12d 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/test/DataRepositoryCompletionProcessorTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/test/DataRepositoryCompletionProcessorTest.java @@ -120,7 +120,7 @@ public class DataRepositoryCompletionProcessorTest { @Test void testUnknownAttribute() throws Exception { - checkCompletions("findByUnknownObject", "List findByUnknownObject(Object unknownObject);"); + checkCompletions("findByUnknownObject"); } @Test