[spring-data] Completion label includes signature. Limit method proposal

This commit is contained in:
aboyko
2023-03-27 11:27:39 -04:00
parent f7093e3793
commit 01caab7cac
3 changed files with 26 additions and 6 deletions

View File

@@ -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<ICompletionProposal> 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));
}
}
}

View File

@@ -41,7 +41,7 @@ public class DataRepositoryPrefixSensitiveCompletionProvider implements DataRepo
DataRepositoryMethodNameParseResult parseResult = new DataRepositoryMethodParser(localPrefix, repoDef).parseLocalPrefixForCompletion();
if(parseResult != null && parseResult.performFullCompletion()){
Map<String, DomainProperty> 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<String, DomainProperty> 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<String, DomainProperty> propertiesByName) {
return parseResult.lastWord() != null
&& (propertiesByName.containsKey(parseResult.lastWord()) || findExpressionType(propertiesByName, parseResult.lastWord()) != null);
}
private void addPredicateKeywordProposals(Collection<ICompletionProposal> completions, int offset, String prefix, DataRepositoryMethodNameParseResult parseResult, Map<String, DomainProperty> 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);
}

View File

@@ -120,7 +120,7 @@ public class DataRepositoryCompletionProcessorTest {
@Test
void testUnknownAttribute() throws Exception {
checkCompletions("findByUnknownObject", "List<Customer> findByUnknownObject(Object unknownObject);");
checkCompletions("findByUnknownObject");
}
@Test