下面列出了怎么用org.eclipse.lsp4j.InsertTextFormat的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Attribute completion item.
*
* @param attrName attribute name
* @param canSupportSnippets true if snippets is supported to generate attribute
* value and false otherwise
* @param fullRange the range to edit.
* @param generateValue true if attribute value must be generated and false
* otherwise.
* @param defaultValue the default value of attribute.
* @param enumerationValues the enumeration values of attribute.
* @param sharedSettings the settings containing quote preferences
*/
public AttributeCompletionItem(String attrName, boolean canSupportSnippets, Range fullRange, boolean generateValue,
String defaultValue, Collection<String> enumerationValues, SharedSettings sharedSettings) {
super.setLabel(attrName);
super.setKind(CompletionItemKind.Unit);
super.setFilterText(attrName);
StringBuilder attributeContent = new StringBuilder(attrName);
if (generateValue) {
// Generate attribute value content
String attributeValue = XMLGenerator.generateAttributeValue(defaultValue, enumerationValues,
canSupportSnippets, 1, true, sharedSettings);
attributeContent.append(attributeValue);
}
super.setTextEdit(new TextEdit(fullRange, attributeContent.toString()));
super.setInsertTextFormat(canSupportSnippets ? InsertTextFormat.Snippet : InsertTextFormat.PlainText);
}
@Override
public void onXMLContent(ICompletionRequest request, ICompletionResponse response) throws Exception {
int offset = request.getOffset();
final DOMNode node = getNodeAt(request.getNode(), offset);
if (node != null) {
XMLReferencesManager.getInstance().collect(node, n -> {
DOMDocument doc = n.getOwnerDocument();
Range range = XMLPositionUtility.createRange(node.getStart(), node.getEnd(), doc);
String label = n.getNodeValue();
CompletionItem item = new CompletionItem();
item.setLabel(label);
String insertText = label;
item.setKind(CompletionItemKind.Property);
item.setDocumentation(Either.forLeft(label));
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(range, insertText));
item.setInsertTextFormat(InsertTextFormat.PlainText);
response.addCompletionItem(item);
});
}
}
private static void addCompletionItem(CMElementDeclaration elementDeclaration, DOMElement parentElement,
String defaultPrefix, boolean forceUseOfPrefix, ICompletionRequest request, ICompletionResponse response,
XMLGenerator generator, Set<String> tags) {
String prefix = forceUseOfPrefix ? defaultPrefix
: (parentElement != null ? parentElement.getPrefix(elementDeclaration.getNamespace()) : null);
String label = elementDeclaration.getName(prefix);
if (tags != null) {
if (tags.contains(label)) {
return;
} else {
tags.add(label);
}
}
CompletionItem item = new CompletionItem(label);
item.setFilterText(request.getFilterForStartTagName(label));
item.setKind(CompletionItemKind.Property);
MarkupContent documentation = XMLGenerator.createMarkupContent(elementDeclaration, request);
item.setDocumentation(documentation);
String xml = generator.generate(elementDeclaration, prefix,
isGenerateEndTag(request.getNode(), request.getOffset(), label));
item.setTextEdit(new TextEdit(request.getReplaceRange(), xml));
item.setInsertTextFormat(InsertTextFormat.Snippet);
response.addCompletionItem(item, true);
}
@Override
public void onTagOpen(ICompletionRequest completionRequest, ICompletionResponse completionResponse)
throws Exception {
Range range = completionRequest.getReplaceRange();
HTMLTag.HTML_TAGS.forEach(t -> {
String tag = t.getTag();
String label = t.getLabel();
CompletionItem item = new CompletionItem();
item.setLabel(tag);
item.setFilterText(completionRequest.getFilterForStartTagName(tag));
item.setKind(CompletionItemKind.Property);
item.setDocumentation(Either.forLeft(label));
item.setTextEdit(new TextEdit(range, "<" + tag + "/>"));
item.setInsertTextFormat(InsertTextFormat.PlainText);
completionResponse.addCompletionItem(item);
});
}
public CompletionItem createSnippetItem(String label, String detail, String documentation, String insertText) {
CompletionItem ci = new CompletionItem();
ci.setLabel(label);
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setInsertText(insertText);
if (documentation != null) {
ci.setDocumentation(documentation);
} else {
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
}
if (detail != null) {
ci.setDetail(detail);
}
return ci;
}
private void collectionRegionProposals(ICompletionRequest request, ICompletionResponse response) {
// Completion for #region
try {
int offset = request.getOffset();
TextDocument document = request.getXMLDocument().getTextDocument();
Position pos = document.positionAt(offset);
String lineText = document.lineText(pos.getLine());
String lineUntilPos = lineText.substring(0, pos.getCharacter());
Matcher match = regionCompletionRegExpr.matcher(lineUntilPos);
if (match.find()) {
InsertTextFormat insertFormat = request.getInsertTextFormat();
Range range = new Range(new Position(pos.getLine(), pos.getCharacter() + match.regionStart()), pos);
String text = request.isCompletionSnippetsSupported() ? "<!-- #region $1-->" : "<!-- #region -->";
CompletionItem beginProposal = new CompletionItem("#region");
beginProposal.setTextEdit(new TextEdit(range, text));
beginProposal.setDocumentation("Insert Folding Region Start");
beginProposal.setFilterText(match.group());
beginProposal.setSortText("za");
beginProposal.setKind(CompletionItemKind.Snippet);
beginProposal.setInsertTextFormat(insertFormat);
response.addCompletionAttribute(beginProposal);
CompletionItem endProposal = new CompletionItem("#endregion");
endProposal.setTextEdit(new TextEdit(range, "<!-- #endregion-->"));
endProposal.setDocumentation("Insert Folding Region End");
endProposal.setFilterText(match.group());
endProposal.setSortText("zb");
endProposal.setKind(CompletionItemKind.Snippet);
endProposal.setInsertTextFormat(InsertTextFormat.PlainText);
response.addCompletionAttribute(endProposal);
}
} catch (BadLocationException e) {
LOGGER.log(Level.SEVERE, "While performing collectRegionCompletion", e);
}
}
private static void fillCompletion(String name, MarkupContent documentation, Range entityRange,
ICompletionResponse response) {
String entityName = "&" + name + ";";
CompletionItem item = new CompletionItem();
item.setLabel(entityName);
item.setKind(CompletionItemKind.Keyword);
item.setInsertTextFormat(InsertTextFormat.PlainText);
String insertText = entityName;
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(entityRange, insertText));
item.setDocumentation(documentation);
response.addCompletionItem(item);
}
@Override
public void onAttributeName(boolean generateValue, ICompletionRequest completionRequest,
ICompletionResponse completionResponse) {
String tag = completionRequest.getCurrentTag();
HTMLTag htmlTag = HTMLTag.getHTMLTag(tag);
if (htmlTag != null) {
String[] attributes = htmlTag.getAttributes();
if (attributes != null) {
Range replaceRange = completionRequest.getReplaceRange();
for (String attribute : attributes) {
int index = attribute.indexOf(":");
if (index != -1) {
attribute = attribute.substring(0, index);
}
if (!completionResponse.hasAttribute(attribute)) {
CompletionItem item = new CompletionItem();
item.setLabel(attribute);
item.setKind(CompletionItemKind.Value);
String value = generateValue ? "=\"$1\"" : "";
item.setTextEdit(new TextEdit(replaceRange, attribute + value));
item.setInsertTextFormat(InsertTextFormat.Snippet);
completionResponse.addCompletionAttribute(item);
}
}
}
}
}
@Override
public void onAttributeValue(String valuePrefix,
ICompletionRequest completionRequest, ICompletionResponse completionResponse) {
String tag = completionRequest.getCurrentTag();
String attributeName = completionRequest.getCurrentAttributeName();
HTMLTag htmlTag = HTMLTag.getHTMLTag(tag);
if (htmlTag != null) {
String[] attributes = htmlTag.getAttributes();
if (attributes != null) {
for (String attribute : attributes) {
String attrName = attribute;
String attrType = null;
int index = attribute.indexOf(":");
if (index != -1) {
attrName = attribute.substring(0, index);
attrType = attribute.substring(index + 1, attribute.length());
}
if (attrType != null && attributeName.equals(attrName)) {
Range fullRange = completionRequest.getReplaceRange();
String[] values = HTMLTag.getAttributeValues(attrType);
for (String value : values) {
String insertText = completionRequest.getInsertAttrValue(value);
CompletionItem item = new CompletionItem();
item.setLabel(value);
item.setFilterText(insertText);
item.setKind(CompletionItemKind.Unit);
item.setTextEdit(new TextEdit(fullRange, insertText));
item.setInsertTextFormat(InsertTextFormat.PlainText);
completionResponse.addCompletionAttribute(item);
}
break;
}
}
}
}
}
/**
* Convert to a completion item.
*/
protected CompletionItem toCompletionItem(ContentAssistEntry entry, int caretOffset,
Position caretPosition, Document document) {
CompletionItem result = new CompletionItem();
String label = null;
if (entry.getLabel() != null) {
label = entry.getLabel();
} else {
label = entry.getProposal();
}
result.setLabel(label);
result.setDetail(entry.getDescription());
result.setDocumentation(entry.getDocumentation());
String prefix = null;
if (entry.getPrefix() != null) {
prefix = entry.getPrefix();
} else {
prefix = "";
}
Position prefixPosition = document.getPosition(caretOffset - prefix.length());
result.setTextEdit(new TextEdit(new Range(prefixPosition, caretPosition), entry.getProposal()));
if (!entry.getTextReplacements().isEmpty()) {
if (result.getAdditionalTextEdits() == null) {
result.setAdditionalTextEdits(new ArrayList<>(entry.getTextReplacements().size()));
}
entry.getTextReplacements().forEach(it -> {
result.getAdditionalTextEdits().add(toTextEdit(it, document));
});
}
if (entry.getKind().startsWith(ContentAssistEntry.KIND_SNIPPET + ":")) {
result.setInsertTextFormat(InsertTextFormat.Snippet);
entry.setKind(entry.getKind().substring(ContentAssistEntry.KIND_SNIPPET.length() + 1));
} else if (Objects.equal(entry.getKind(), ContentAssistEntry.KIND_SNIPPET)) {
result.setInsertTextFormat(InsertTextFormat.Snippet);
}
result.setKind(translateKind(entry));
return result;
}
@Override
protected CompletionItem toCompletionItem(ContentAssistEntry entry, int caretOffset, Position caretPosition,
Document document) {
CompletionItem result = super.toCompletionItem(entry, caretOffset, caretPosition, document);
if (entry.getKind().startsWith(ContentAssistEntry.KIND_SNIPPET + ":")) {
result.setInsertTextFormat(InsertTextFormat.Snippet);
entry.setKind(entry.getKind().substring(ContentAssistEntry.KIND_SNIPPET.length() + 1));
} else if (Objects.equal(entry.getKind(), ContentAssistEntry.KIND_SNIPPET)) {
result.setInsertTextFormat(InsertTextFormat.Snippet);
}
result.setKind(translateKind(entry));
return result;
}
public CompletionItem getColumnCompletionItem(int data) {
CompletionItem ci = new CompletionItem();
ci.setLabel("column definition");
ci.setInsertText("${1:column_name} ${2:datatype}");
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
ci.setSortText("1100");
return ci;
}
public CompletionItem getPrimaryKeyCompletionItem(int data) {
CompletionItem ci = new CompletionItem();
ci.setLabel("PRIMARY KEY (column, ...)");
ci.setInsertText("PRIMARY KEY (${1:column})");
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
ci.setSortText("1120");
return ci;
}
public CompletionItem getQueryExpressionSnippet(int data) {
CompletionItem ci = new CompletionItem();
ci.setLabel("AS SELECT * FROM ...");
ci.setInsertText(" AS SELECT * FROM ${4:table_name};");
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
return ci;
}
public CompletionItem getCreateViewCompletionItem(int data, String sortValue) {
CompletionItem ci = new CompletionItem();
ci.setLabel("CREATE VIEW...");
ci.setInsertText(QueryExpressionHelper.CREATE_VIEW_INSERT_TEXT);
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDetail("Simple CREATE VIEW statement");
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
ci.setSortText(sortValue);
return ci;
}
public CompletionItem getCreateViewInnerJoinCompletionItem(int data, String sortValue) {
CompletionItem ci = new CompletionItem();
ci.setLabel("CREATE VIEW with INNER JOIN");
ci.setInsertText(QueryExpressionHelper.CREATE_VIEW_INNER_JOIN_INSERT_TEXT);
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDetail(" CREATE VIEW with inner join");
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
ci.setSortText(sortValue);
return ci;
}
public CompletionItem getCreateViewJoinCompletionItem(int data, String sortValue) {
CompletionItem ci = new CompletionItem();
ci.setLabel("CREATE VIEW with JOIN");
ci.setInsertText(QueryExpressionHelper.CREATE_VIEW_LEFT_OUTER_JOIN_INSERT_TEXT);
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDetail(" CREATE VIEW with left join");
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
ci.setSortText(sortValue);
return ci;
}
public CompletionItem getCreateViewUnionCompletionItem(int data, String sortValue) {
CompletionItem ci = new CompletionItem();
ci.setLabel("CREATE VIEW with UNION");
ci.setInsertText(QueryExpressionHelper.CREATE_VIEW_UNION_INSERT_TEXT);
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDetail(" Union of two tables from single source");
ci.setDocumentation(CompletionItemBuilder.beautifyDocument(ci.getInsertText()));
ci.setData(data);
ci.setPreselect(true);
ci.setSortText(sortValue);
return ci;
}
public ICompletionProposal convertToCompletionProposal(int offset, LSPDocumentInfo info, String prefix,
String lineIndentation, Range textRange) {
CompletionItem item = new CompletionItem();
item.setLabel(display);
item.setKind(kind);
item.setInsertTextFormat(InsertTextFormat.Snippet);
IDocument document = info.getDocument();
// if there is a text selection, take it, since snippets with $TM_SELECTED_TEXT
// will want to wrap the selection.
item.setTextEdit(new TextEdit(textRange, createReplacement(lineIndentation)));
return new LSCompletionProposal(document, offset, item, getLanguageClient(info));
}
private static void setFields(CompletionItem ci, ICompilationUnit cu) {
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(InsertTextFormat.Snippet);
ci.setDocumentation(SnippetUtils.beautifyDocument(ci.getInsertText()));
Map<String, String> data = new HashMap<>(3);
data.put(CompletionResolveHandler.DATA_FIELD_URI, JDTUtils.toURI(cu));
data.put(CompletionResolveHandler.DATA_FIELD_REQUEST_ID, "0");
data.put(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID, "0");
ci.setData(data);
}
@Test
public void testCompletion_javadocComment() throws JavaModelException {
ICompilationUnit unit = getWorkingCopy(
//@formatter:off
"src/java/Foo.java",
"public class Foo {\n"+
" /** */ \n"+
" void foo(int i, String s) {\n"+
" }\n"+
"}\n");
//@formatter:on
int[] loc = findCompletionLocation(unit, "/**");
CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight();
assertNotNull(list);
assertEquals(1, list.getItems().size());
CompletionItem item = list.getItems().get(0);
assertNull(item.getInsertText());
assertEquals(JavadocCompletionProposal.JAVA_DOC_COMMENT, item.getLabel());
assertEquals(CompletionItemKind.Snippet, item.getKind());
assertEquals("999999999", item.getSortText());
assertEquals(item.getInsertTextFormat(), InsertTextFormat.Snippet);
assertNotNull(item.getTextEdit());
assertEquals("\n * ${0}\n * @param i\n * @param s\n", item.getTextEdit().getNewText());
Range range = item.getTextEdit().getRange();
assertEquals(1, range.getStart().getLine());
assertEquals(4, range.getStart().getCharacter());
assertEquals(1, range.getEnd().getLine());
assertEquals(" * @param i\n * @param s\n", item.getDocumentation().getLeft());
}
@Test
public void testCompletion_javadocCommentNoSnippet() throws JavaModelException {
ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class);
Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies);
Mockito.when(mockCapabilies.isCompletionSnippetsSupported()).thenReturn(false);
ICompilationUnit unit = getWorkingCopy(
//@formatter:off
"src/java/Foo.java",
"public class Foo {\n"+
" /** */ \n"+
" void foo(int i, String s) {\n"+
" }\n"+
"}\n");
//@formatter:on
int[] loc = findCompletionLocation(unit, "/**");
CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight();
assertNotNull(list);
assertEquals(1, list.getItems().size());
CompletionItem item = list.getItems().get(0);
assertNull(item.getInsertText());
assertEquals(JavadocCompletionProposal.JAVA_DOC_COMMENT, item.getLabel());
assertEquals(CompletionItemKind.Snippet, item.getKind());
assertEquals("999999999", item.getSortText());
assertEquals(item.getInsertTextFormat(), InsertTextFormat.PlainText);
assertNotNull(item.getTextEdit());
assertEquals("\n * @param i\n * @param s\n", item.getTextEdit().getNewText());
Range range = item.getTextEdit().getRange();
assertEquals(1, range.getStart().getLine());
assertEquals(4, range.getStart().getCharacter());
assertEquals(1, range.getEnd().getLine());
assertEquals(" * @param i\n * @param s\n", item.getDocumentation().getLeft());
}
public static CompletionItem createPackageBlockItem(String packageName, boolean asSnippet)
{
StringBuilder labelBuilder = new StringBuilder();
labelBuilder.append(IASKeywordConstants.PACKAGE);
if (packageName.length() > 0)
{
labelBuilder.append(" ");
labelBuilder.append(packageName);
}
labelBuilder.append(" {}");
StringBuilder insertTextBuilder = new StringBuilder();
insertTextBuilder.append(IASKeywordConstants.PACKAGE);
if (packageName.length() > 0)
{
insertTextBuilder.append(" ");
insertTextBuilder.append(packageName);
}
insertTextBuilder.append("\n");
insertTextBuilder.append("{");
insertTextBuilder.append("\n");
insertTextBuilder.append("\t");
if (asSnippet)
{
insertTextBuilder.append("$0");
}
insertTextBuilder.append("\n");
insertTextBuilder.append("}");
CompletionItem packageItem = new CompletionItem();
packageItem.setKind(CompletionItemKind.Module);
packageItem.setLabel(labelBuilder.toString());
packageItem.setInsertText(insertTextBuilder.toString());
if (asSnippet)
{
packageItem.setInsertTextFormat(InsertTextFormat.Snippet);
}
return packageItem;
}
private void addMXMLLanguageTagToAutoComplete(String tagName, String prefix, boolean includeOpenTagBracket, boolean includeOpenTagPrefix, CompletionList result)
{
List<CompletionItem> items = result.getItems();
CompletionItem item = new CompletionItem();
item.setKind(CompletionItemKind.Keyword);
item.setLabel("fx:" + tagName);
if (completionSupportsSnippets)
{
item.setInsertTextFormat(InsertTextFormat.Snippet);
}
item.setFilterText(tagName);
item.setSortText(tagName);
StringBuilder builder = new StringBuilder();
if (includeOpenTagBracket)
{
builder.append("<");
}
if (includeOpenTagPrefix)
{
builder.append(prefix);
builder.append(IMXMLCoreConstants.colon);
}
builder.append(tagName);
builder.append(">");
builder.append("\n");
builder.append("\t");
if (completionSupportsSnippets)
{
builder.append("$0");
}
builder.append("\n");
builder.append("<");
builder.append(IMXMLCoreConstants.slash);
builder.append(prefix);
builder.append(IMXMLCoreConstants.colon);
builder.append(tagName);
builder.append(">");
item.setInsertText(builder.toString());
items.add(item);
}
protected CompletionItem toCompletionItem(ContentAssistEntry entry, int caretOffset, Position caretPosition,
Document document) {
CompletionItem completionItem = new CompletionItem();
String label = entry.getLabel();
if (label == null) {
label = entry.getProposal();
}
completionItem.setLabel(label);
completionItem.setDetail(entry.getDescription());
completionItem.setDocumentation(entry.getDocumentation());
String prefix = entry.getPrefix();
if (prefix == null) {
prefix = "";
}
int prefixOffset = caretOffset - prefix.length();
Position prefixPosition = document.getPosition(prefixOffset);
completionItem.setTextEdit(new TextEdit(new Range(prefixPosition, caretPosition), entry.getProposal()));
completionItem.setKind(translateKind(entry));
if (!entry.getTextReplacements().isEmpty()) {
if (completionItem.getAdditionalTextEdits() == null) {
completionItem.setAdditionalTextEdits(new ArrayList<>(entry.getTextReplacements().size()));
}
entry.getTextReplacements().forEach(
(ReplaceRegion it) -> completionItem.getAdditionalTextEdits().add(toTextEdit(it, document)));
}
if (ContentAssistEntry.KIND_SNIPPET.equals(entry.getKind())) {
completionItem.setInsertTextFormat(InsertTextFormat.Snippet);
}
return completionItem;
}
/**
* Creates a LookupElement given a CompletionItem
*
* @param item The CompletionItem
* @return The corresponding LookupElement
*/
@SuppressWarnings("WeakerAccess")
public LookupElement createLookupItem(CompletionItem item) {
Command command = item.getCommand();
String detail = item.getDetail();
String insertText = item.getInsertText();
CompletionItemKind kind = item.getKind();
String label = item.getLabel();
TextEdit textEdit = item.getTextEdit();
List<TextEdit> addTextEdits = item.getAdditionalTextEdits();
String presentableText = StringUtils.isNotEmpty(label) ? label : (insertText != null) ? insertText : "";
String tailText = (detail != null) ? detail : "";
LSPIconProvider iconProvider = GUIUtils.getIconProviderFor(wrapper.getServerDefinition());
Icon icon = iconProvider.getCompletionIcon(kind);
LookupElementBuilder lookupElementBuilder;
String lookupString = null;
if (textEdit != null) {
lookupString = textEdit.getNewText();
} else if (StringUtils.isNotEmpty(insertText)) {
lookupString = insertText;
} else if (StringUtils.isNotEmpty(label)) {
lookupString = label;
}
if (StringUtils.isEmpty(lookupString)) {
return null;
}
// Fixes IDEA internal assertion failure in windows.
lookupString = lookupString.replace(DocumentUtils.WIN_SEPARATOR, DocumentUtils.LINUX_SEPARATOR);
if (item.getInsertTextFormat() == InsertTextFormat.Snippet) {
lookupElementBuilder = LookupElementBuilder.create(convertPlaceHolders(lookupString));
} else {
lookupElementBuilder = LookupElementBuilder.create(lookupString);
}
lookupElementBuilder = addCompletionInsertHandlers(item, lookupElementBuilder, lookupString);
if (kind == CompletionItemKind.Keyword) {
lookupElementBuilder = lookupElementBuilder.withBoldness(true);
}
return lookupElementBuilder.withPresentableText(presentableText).withTypeText(tailText, true).withIcon(icon)
.withAutoCompletionPolicy(AutoCompletionPolicy.SETTINGS_DEPENDENT);
}
@Override
public InsertTextFormat getInsertTextFormat() {
return isCompletionSnippetsSupported() ? InsertTextFormat.Snippet : InsertTextFormat.PlainText;
}
@SuppressWarnings("unchecked")
private List<CompletionItem> loadItemsFromFile(String fileName) {
List<CompletionItem> items = new ArrayList<CompletionItem>();
try (InputStream stream = this.getClass().getResourceAsStream(fileName)) {
JSONParser parser = new JSONParser(stream);
// A JSON object. Key value pairs are unordered. JSONObject supports
// java.util.Map interface.
LinkedHashMap<String, Object> jsonObject = parser.object();
// A JSON array. JSONObject supports java.util.List interface.
ArrayList<?> completionItemArray = (ArrayList<?>) jsonObject.get("items");
if (completionItemArray != null) {
for (Object item : completionItemArray) {
LinkedHashMap<String, Object> itemInfo = (LinkedHashMap<String, Object>) item;
CompletionItem newItem = new CompletionItem();
newItem.setLabel((String) itemInfo.get("label"));
newItem.setKind(STRING_TO_KIND_MAP.get(((String) itemInfo.get("kind")).toUpperCase(Locale.US)));
String detail = (String) itemInfo.get("detail");
if (detail != null) {
newItem.setDetail(detail);
}
String documentation = (String) itemInfo.get("documentation");
if (documentation != null) {
newItem.setDocumentation(documentation);
}
newItem.setDeprecated(Boolean.parseBoolean((String) itemInfo.get("deprecated")));
newItem.setPreselect(Boolean.parseBoolean((String) itemInfo.get("preselect")));
String sortText = (String) itemInfo.get("sortText");
if (sortText != null) {
newItem.setSortText(sortText);
}
String insertText = (String) itemInfo.get("insertText");
if (insertText != null) {
insertText = insertText.replaceAll("\\n", "\n");
insertText = insertText.replaceAll("\\t", "\t");
newItem.setInsertText(insertText);
}
String insertTextFormat = (String) itemInfo.get("insertTextFormat");
if (insertTextFormat != null) {
if (newItem.getKind().equals(CompletionItemKind.Snippet)) {
newItem.setInsertTextFormat(InsertTextFormat.Snippet);
} else {
newItem.setInsertTextFormat(InsertTextFormat.PlainText);
}
}
// TODO: Implement quick fixes
// newItem.setTextEdit((TextEdit)itemInfo.get("textEdit"));
// newItem.setAdditionalTextEdits((List<TextEdit>)itemInfo.get("additionalTextEdits"));
// newItem.setCommitCharacters((List<String>)itemInfo.get("commitCharacters"));
String category = (String) itemInfo.get("category");
if (category != null && !category.isEmpty()) {
addItemByCategory(category, newItem);
} else {
items.add(newItem);
}
}
}
} catch (IOException | ParseException e) {
throw new IllegalArgumentException("Unable to parse given file: " + fileName, e);
}
return items;
}
public List<CompletionItem> getProposals(ICompilationUnit cu, int offset, CompletionProposalRequestor collector, IProgressMonitor monitor) throws JavaModelException {
if (cu == null) {
throw new IllegalArgumentException("Compilation unit must not be null"); //$NON-NLS-1$
}
List<CompletionItem> result = new ArrayList<>();
IDocument d = JsonRpcHelpers.toDocument(cu.getBuffer());
if (offset < 0 || d.getLength() == 0) {
return result;
}
try {
int p = (offset == d.getLength() ? offset - 1 : offset);
IRegion line = d.getLineInformationOfOffset(p);
String lineStr = d.get(line.getOffset(), line.getLength()).trim();
if (!lineStr.startsWith("/**")) {
return result;
}
if (!hasEndJavadoc(d, offset)) {
return result;
}
String text = collector.getContext().getToken() == null ? "" : new String(collector.getContext().getToken());
StringBuilder buf = new StringBuilder(text);
IRegion prefix = findPrefixRange(d, line);
String indentation = d.get(prefix.getOffset(), prefix.getLength());
int lengthToAdd = Math.min(offset - prefix.getOffset(), prefix.getLength());
buf.append(indentation.substring(0, lengthToAdd));
String lineDelimiter = TextUtilities.getDefaultLineDelimiter(d);
ICompilationUnit unit = cu;
try {
unit.reconcile(ICompilationUnit.NO_AST, false, null, null);
String string = createJavaDocTags(d, offset, indentation, lineDelimiter, unit);
if (string != null && !string.trim().equals(ASTERISK)) {
buf.append(string);
} else {
return result;
}
int nextNonWS = findEndOfWhiteSpace(d, offset, d.getLength());
if (!Character.isWhitespace(d.getChar(nextNonWS))) {
buf.append(lineDelimiter);
}
} catch (CoreException e) {
// ignore
}
final CompletionItem ci = new CompletionItem();
Range range = JDTUtils.toRange(unit, offset, 0);
boolean isSnippetSupported = JavaLanguageServerPlugin.getPreferencesManager().getClientPreferences().isCompletionSnippetsSupported();
String replacement = prepareTemplate(buf.toString(), lineDelimiter, isSnippetSupported);
ci.setTextEdit(new TextEdit(range, replacement));
ci.setFilterText(JAVA_DOC_COMMENT);
ci.setLabel(JAVA_DOC_COMMENT);
ci.setSortText(SortTextHelper.convertRelevance(0));
ci.setKind(CompletionItemKind.Snippet);
ci.setInsertTextFormat(isSnippetSupported ? InsertTextFormat.Snippet : InsertTextFormat.PlainText);
String documentation = prepareTemplate(buf.toString(), lineDelimiter, false);
if (documentation.indexOf(lineDelimiter) == 0) {
documentation = documentation.replaceFirst(lineDelimiter, "");
}
ci.setDocumentation(documentation);
Map<String, String> data = new HashMap<>(3);
data.put(CompletionResolveHandler.DATA_FIELD_URI, JDTUtils.toURI(cu));
data.put(CompletionResolveHandler.DATA_FIELD_REQUEST_ID, "0");
data.put(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID, "0");
ci.setData(data);
result.add(ci);
} catch (BadLocationException excp) {
// stop work
}
return result;
}
private void updateReplacement(CompletionProposal proposal, CompletionItem item, char trigger, boolean isResolving) {
// reset importRewrite
this.importRewrite = TypeProposalUtils.createImportRewrite(compilationUnit);
List<org.eclipse.lsp4j.TextEdit> additionalTextEdits = new ArrayList<>();
StringBuilder completionBuffer = new StringBuilder();
Range range = null;
if (isSupportingRequiredProposals(proposal)) {
CompletionProposal[] requiredProposals = proposal.getRequiredProposals();
if (requiredProposals != null) {
for (CompletionProposal requiredProposal : requiredProposals) {
switch (requiredProposal.getKind()) {
case CompletionProposal.TYPE_IMPORT:
case CompletionProposal.METHOD_IMPORT:
case CompletionProposal.FIELD_IMPORT:
appendImportProposal(completionBuffer, requiredProposal, proposal.getKind());
break;
case CompletionProposal.TYPE_REF:
org.eclipse.lsp4j.TextEdit edit = toRequiredTypeEdit(requiredProposal, trigger, proposal.canUseDiamond(context));
if (proposal.getKind() == CompletionProposal.CONSTRUCTOR_INVOCATION
|| proposal.getKind() == CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION
|| proposal.getKind() == CompletionProposal.ANONYMOUS_CLASS_DECLARATION) {
completionBuffer.append(edit.getNewText());
range = edit.getRange();
} else {
additionalTextEdits.add(edit);
}
break;
default:
/*
* In 3.3 we only support the above required proposals, see
* CompletionProposal#getRequiredProposals()
*/
Assert.isTrue(false);
}
}
}
}
if (range == null) {
boolean completionOverwrite = preferences.isCompletionOverwrite();
if (!completionOverwrite && (proposal.getKind() == CompletionProposal.METHOD_REF || proposal.getKind() == CompletionProposal.LOCAL_VARIABLE_REF || proposal.getKind() == CompletionProposal.FIELD_REF)) {
// See https://github.com/redhat-developer/vscode-java/issues/462
int end = proposal.getReplaceEnd();
if (end > offset) {
proposal.setReplaceRange(proposal.getReplaceStart(), offset);
}
}
range = toReplacementRange(proposal);
}
if (proposal.getKind() == CompletionProposal.METHOD_DECLARATION) {
appendMethodOverrideReplacement(completionBuffer, proposal);
} else if (proposal.getKind() == CompletionProposal.POTENTIAL_METHOD_DECLARATION && proposal instanceof GetterSetterCompletionProposal) {
appendMethodPotentialReplacement(completionBuffer, (GetterSetterCompletionProposal) proposal);
} else if (proposal.getKind() == CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION || proposal.getKind() == CompletionProposal.ANONYMOUS_CLASS_DECLARATION) {
appendAnonymousClass(completionBuffer, proposal, range);
} else {
appendReplacementString(completionBuffer, proposal);
}
//select insertTextFormat.
if (client.isCompletionSnippetsSupported()) {
item.setInsertTextFormat(InsertTextFormat.Snippet);
} else {
item.setInsertTextFormat(InsertTextFormat.PlainText);
}
String text = completionBuffer.toString();
if (range != null) {
item.setTextEdit(new org.eclipse.lsp4j.TextEdit(range, text));
} else {
// fallback
item.setInsertText(text);
}
if (!client.isResolveAdditionalTextEditsSupport() || isResolving) {
addImports(additionalTextEdits);
if(!additionalTextEdits.isEmpty()){
item.setAdditionalTextEdits(additionalTextEdits);
}
}
}