added prefix handling to spring data content-assist in a rudimentary way

This commit is contained in:
Martin Lippert
2018-11-21 13:30:27 +01:00
parent af2f1c1c15
commit 80a95fbfec
2 changed files with 35 additions and 6 deletions

View File

@@ -17,12 +17,15 @@ import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Annotation;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.internal.core.util.ASTNodeFinder;
import org.eclipse.lsp4j.CompletionItemKind;
import org.springframework.ide.vscode.boot.java.handlers.CompletionProvider;
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.IRegion;
import org.springframework.util.StringUtils;
/**
@@ -42,15 +45,24 @@ public class DataRepositoryCompletionProcessor implements CompletionProvider {
if (repo != null) {
DomainType domainType = repo.getDomainType();
if (domainType != null) {
String prefix = "";
try {
IRegion line = doc.getLineInformationOfOffset(offset);
prefix = doc.get(line.getOffset(), offset - line.getOffset()).trim();
} catch (BadLocationException e) {
// ignore if there is a problem computing the prefix, continue without prefix
}
DomainProperty[] properties = domainType.getProperties();
for (DomainProperty property : properties) {
completions.add(generateCompletionProposal(offset, repo, property));
completions.add(generateCompletionProposal(offset, prefix, repo, property));
}
}
}
}
protected ICompletionProposal generateCompletionProposal(int offset, DataRepositoryDefinition repoDef, DomainProperty domainProperty) {
protected ICompletionProposal generateCompletionProposal(int offset, String prefix, DataRepositoryDefinition repoDef, DomainProperty domainProperty) {
StringBuilder label = new StringBuilder();
label.append("findBy");
label.append(StringUtils.capitalize(domainProperty.getName()));
@@ -72,11 +84,21 @@ public class DataRepositoryCompletionProcessor implements CompletionProvider {
completion.append(" ");
completion.append(StringUtils.uncapitalize(domainProperty.getName()));
completion.append(");");
edits.insert(offset, completion.toString());
String filter = label.toString();
if (prefix != null && label.toString().startsWith(prefix)) {
edits.replace(offset - prefix.length(), offset, completion.toString());
}
else if (prefix != null && completion.toString().startsWith(prefix)) {
edits.replace(offset - prefix.length(), offset, completion.toString());
filter = completion.toString();
}
else {
edits.insert(offset, completion.toString());
}
DocumentEdits additionalEdits = new DocumentEdits(null);
return new FindByCompletionProposal(label.toString(), CompletionItemKind.Method, edits, null, null, Optional.of(additionalEdits));
return new FindByCompletionProposal(label.toString(), CompletionItemKind.Method, edits, null, null, Optional.of(additionalEdits), filter);
}
private DataRepositoryDefinition getDataRepositoryDefinition(TypeDeclaration type) {

View File

@@ -27,9 +27,10 @@ public class FindByCompletionProposal implements ICompletionProposal {
private String details;
private Renderable doc;
private Optional<DocumentEdits> additionalEdits;
private String filter;
public FindByCompletionProposal(String label, CompletionItemKind kind, DocumentEdits edits, String details,
Renderable doc, Optional<DocumentEdits> additionalEdits) {
Renderable doc, Optional<DocumentEdits> additionalEdits, String filter) {
super();
this.label = label;
this.kind = kind;
@@ -37,6 +38,7 @@ public class FindByCompletionProposal implements ICompletionProposal {
this.details = details;
this.doc = doc;
this.additionalEdits = additionalEdits;
this.filter = filter;
}
@Override
@@ -74,4 +76,9 @@ public class FindByCompletionProposal implements ICompletionProposal {
return InsertTextFormat.Snippet;
}
@Override
public String getFilterText() {
return filter;
}
}