Skip to content

Commit

Permalink
Implement labelDetails for CompletionItem
Browse files Browse the repository at this point in the history
Signed-off-by: Jessica He <[email protected]>
  • Loading branch information
JessicaJHee committed Mar 24, 2023
1 parent 1181a0e commit 51a7022
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.eclipse.jdt.ls.core.internal.handlers.JsonRpcHelpers;
import org.eclipse.jface.text.IDocument;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionItemLabelDetails;

/**
* Provides string labels for completionProposals.
Expand Down Expand Up @@ -74,7 +75,7 @@ public CompletionProposalDescriptionProvider(CompletionContext context) {
* the proposal to create the description for
* @return the string of method signature suitable for display
*/
public StringBuilder createMethodProposalDescription(CompletionProposal proposal) {
public StringBuilder createMethodProposalDescription(CompletionProposal proposal, Boolean includeReturnType) {
int kind = proposal.getKind();
StringBuilder description = new StringBuilder();
switch (kind) {
Expand All @@ -92,16 +93,21 @@ public StringBuilder createMethodProposalDescription(CompletionProposal proposal
description.append(')');

// return type
if (!proposal.isConstructor()) {
// TODO remove SignatureUtil.fix83600 call when bugs are fixed
char[] returnType = createTypeDisplayName(SignatureUtil.getUpperBound(Signature.getReturnType(SignatureUtil.fix83600(proposal.getSignature()))));
description.append(RETURN_TYPE_SEPARATOR);
description.append(returnType);
if (!proposal.isConstructor() && includeReturnType) {
appendReturnType(description, proposal);
}
}
return description; // dummy
}

private StringBuilder appendReturnType(StringBuilder description, CompletionProposal proposal){
// TODO remove SignatureUtil.fix83600 call when bugs are fixed
char[] returnType = createTypeDisplayName(SignatureUtil.getUpperBound(Signature.getReturnType(SignatureUtil.fix83600(proposal.getSignature()))));
description.append(RETURN_TYPE_SEPARATOR);
description.append(returnType);
return description;
}

/**
* Creates and returns a parameter list of the given method or type proposal suitable for
* display. The list does not include parentheses. The lower bound of parameter types is
Expand Down Expand Up @@ -312,7 +318,7 @@ private final StringBuilder appendParameterSignature(StringBuilder buffer, char[
* @param item to update
*/
private void createMethodProposalLabel(CompletionProposal methodProposal, CompletionItem item) {
StringBuilder description = this.createMethodProposalDescription(methodProposal);
StringBuilder description = this.createMethodProposalDescription(methodProposal, false);
item.setLabel(description.toString());
item.setInsertText(String.valueOf(methodProposal.getName()));

Expand All @@ -338,7 +344,9 @@ private void createMethodProposalLabel(CompletionProposal methodProposal, Comple
detail.append('.');
}
detail.append(description);
item.setDetail(detail.toString());
StringBuilder returnType = new StringBuilder();
appendReturnType(returnType, methodProposal);
item.setLabelDetails(createLabelDetails(returnType.toString(), detail.toString()));

setSignature(item, String.valueOf(methodProposal.getSignature()));
setDeclarationSignature(item, String.valueOf(methodProposal.getDeclarationSignature()));
Expand Down Expand Up @@ -374,7 +382,9 @@ private void createJavadocMethodProposalLabel(CompletionProposal methodProposal,
// declaring type
String declaringType= extractDeclaringTypeFQN(methodProposal);
declaringType= Signature.getSimpleName(declaringType);
item.setDetail(declaringType);
StringBuilder returnType = new StringBuilder();
appendReturnType(returnType, methodProposal);
item.setLabelDetails(createLabelDetails(returnType.toString(), declaringType));
}

private void createOverrideMethodProposalLabel(CompletionProposal methodProposal, CompletionItem item) {
Expand All @@ -389,12 +399,6 @@ private void createOverrideMethodProposalLabel(CompletionProposal methodProposal
appendUnboundedParameterList(nameBuffer, methodProposal);
nameBuffer.append(')');

nameBuffer.append(RETURN_TYPE_SEPARATOR);

// return type
// TODO remove SignatureUtil.fix83600 call when bugs are fixed
char[] returnType= createTypeDisplayName(SignatureUtil.getUpperBound(Signature.getReturnType(SignatureUtil.fix83600(methodProposal.getSignature()))));
nameBuffer.append(returnType);
item.setLabel(nameBuffer.toString());
item.setFilterText(name);

Expand All @@ -403,7 +407,9 @@ private void createOverrideMethodProposalLabel(CompletionProposal methodProposal
String declaringType= extractDeclaringTypeFQN(methodProposal);
declaringType= Signature.getSimpleName(declaringType);
typeBuffer.append(String.format("Override method in '%s'", declaringType));
item.setDetail(typeBuffer.toString());
StringBuilder returnType = new StringBuilder();
appendReturnType(returnType, methodProposal);
item.setLabelDetails(createLabelDetails(returnType.toString(), typeBuffer.toString()));

setSignature(item, String.valueOf(methodProposal.getSignature()));
setDeclarationSignature(item, String.valueOf(methodProposal.getDeclarationSignature()));
Expand Down Expand Up @@ -471,16 +477,15 @@ void createTypeProposalLabel(char[] fullName, CompletionItem item) {
int qIndex= findSimpleNameStart(fullName);

String name = new String(fullName, qIndex, fullName.length - qIndex);
StringBuilder nameBuffer= new StringBuilder();
nameBuffer.append(name);
StringBuilder detailBuf= new StringBuilder();
if (qIndex > 0) {
nameBuffer.append(PACKAGE_NAME_SEPARATOR);
nameBuffer.append(new String(fullName,0,qIndex-1));
detailBuf.append(PACKAGE_NAME_SEPARATOR);
detailBuf.append(new String(fullName,0,qIndex-1));
}
item.setFilterText(name);
item.setInsertText(name);
item.setLabel(nameBuffer.toString());
item.setDetail(new String(fullName));
item.setLabel(name);
item.setLabelDetails(createLabelDetails(detailBuf.toString(), new String(fullName)));
}

private void createJavadocTypeProposalLabel(char[] fullName, CompletionItem item) {
Expand All @@ -497,7 +502,7 @@ private void createJavadocTypeProposalLabel(char[] fullName, CompletionItem item
item.setLabel(nameBuffer.toString());
item.setFilterText(name);
if (qIndex > 0) {
item.setDetail(new String(fullName, 0, qIndex - 1));
item.setLabelDetails(createLabelDetails(null, new String(fullName, 0, qIndex - 1)));
}
}

Expand Down Expand Up @@ -548,15 +553,16 @@ private void createLabelWithTypeAndDeclaration(CompletionProposal proposal, Comp

buf.append(name);
item.setInsertText(buf.toString());
item.setLabel(buf.toString());
StringBuilder detailBuf = new StringBuilder();
char[] typeName= Signature.getSignatureSimpleName(proposal.getSignature());
if (typeName.length > 0) {
buf.append(VAR_TYPE_SEPARATOR);
buf.append(typeName);
detailBuf.append(VAR_TYPE_SEPARATOR);
detailBuf.append(typeName);
}
item.setLabel(buf.toString());

char[] declaration= proposal.getDeclarationSignature();
StringBuilder detailBuf = new StringBuilder();
StringBuilder descriptionBuf = new StringBuilder();
if (declaration != null) {
setDeclarationSignature(item, String.valueOf(declaration));
declaration= Signature.getSignatureSimpleName(declaration);
Expand All @@ -565,28 +571,28 @@ private void createLabelWithTypeAndDeclaration(CompletionProposal proposal, Comp
String declaringType= extractDeclaringTypeFQN(proposal);
String qualifier= Signature.getQualifier(declaringType);
if (qualifier.length() > 0) {
detailBuf.append(qualifier);
detailBuf.append('.');
descriptionBuf.append(qualifier);
descriptionBuf.append('.');
}
}
detailBuf.append(declaration);
descriptionBuf.append(declaration);
}
}
if (detailBuf.length() > 0) {
detailBuf.append('.');
if (descriptionBuf.length() > 0) {
descriptionBuf.append('.');
}
detailBuf.append(buf);
item.setDetail(detailBuf.toString());
descriptionBuf.append(buf);
item.setLabelDetails(createLabelDetails(detailBuf.toString(), descriptionBuf.toString()));
setName(item,String.valueOf(name));
}

private void createPackageProposalLabel(CompletionProposal proposal, CompletionItem item) {
Assert.isTrue(proposal.getKind() == CompletionProposal.PACKAGE_REF || proposal.getKind() == CompletionProposal.MODULE_REF || proposal.getKind() == CompletionProposal.MODULE_DECLARATION);
item.setLabel(String.valueOf(proposal.getDeclarationSignature()));
StringBuilder detail = new StringBuilder();
detail.append(proposal.getKind() == CompletionProposal.PACKAGE_REF ? "(package) " : "(module) ");
detail.append(String.valueOf(proposal.getDeclarationSignature()));
item.setDetail(detail.toString());
StringBuilder description = new StringBuilder();
description.append(proposal.getKind() == CompletionProposal.PACKAGE_REF ? "(package) " : "(module) ");
description.append(String.valueOf(proposal.getDeclarationSignature()));
item.setLabelDetails(createLabelDetails(null, description.toString()));
}

StringBuilder createSimpleLabel(CompletionProposal proposal) {
Expand All @@ -605,14 +611,16 @@ private void createAnonymousTypeLabel(CompletionProposal proposal, CompletionIte
buf.append('(');
appendUnboundedParameterList(buf, proposal);
buf.append(')');
buf.append(" "); //$NON-NLS-1$
buf.append("Anonymous Inner Type"); //TODO: consider externalization

item.setLabel(buf.toString());

if (proposal.getRequiredProposals() != null) {
char[] signatureQualifier= Signature.getSignatureQualifier(declaringTypeSignature);
if (signatureQualifier.length > 0) {
item.setDetail(String.valueOf(signatureQualifier) + "." + name);
StringBuilder detail = new StringBuilder();
detail.append(" "); //$NON-NLS-1$
detail.append("Anonymous Inner Type"); //TODO: consider externalization
item.setLabelDetails(createLabelDetails(detail.toString(), String.valueOf(signatureQualifier) + "." + name));
}
}
setDeclarationSignature(item, String.valueOf(declaringTypeSignature));
Expand Down Expand Up @@ -740,4 +748,15 @@ private String getProposal(CompletionProposal proposal) {
}
return "unknown";
}

private CompletionItemLabelDetails createLabelDetails(String detail, String description){
CompletionItemLabelDetails itemLabelDetails = new CompletionItemLabelDetails();
if (detail != null){
itemLabelDetails.setDetail(detail);
}
if (description != null){
itemLabelDetails.setDescription(description);
}
return itemLabelDetails;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public void acceptContext(CompletionContext context) {

public SignatureInformation toSignatureInformation(CompletionProposal methodProposal) {
SignatureInformation $ = new SignatureInformation();
StringBuilder description = descriptionProvider.createMethodProposalDescription(methodProposal);
StringBuilder description = descriptionProvider.createMethodProposalDescription(methodProposal, true);
$.setLabel(description.toString());
if (isDescriptionEnabled) {
$.setDocumentation(this.computeJavaDoc(methodProposal));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
import org.eclipse.jface.text.templates.TemplateException;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionItemKind;
import org.eclipse.lsp4j.CompletionItemLabelDetails;
import org.eclipse.lsp4j.InsertTextFormat;

public class SnippetCompletionProposal extends CompletionProposal {
Expand Down Expand Up @@ -309,7 +310,9 @@ private static List<CompletionItem> getGenericSnippets(SnippetCompletionContext
item.setKind(CompletionItemKind.Snippet);
item.setInsertTextFormat(InsertTextFormat.Snippet);
item.setInsertText(SnippetUtils.templateToSnippet(template.getPattern()));
item.setDetail(template.getDescription());
CompletionItemLabelDetails itemLabelDetails = new CompletionItemLabelDetails();
itemLabelDetails.setDescription(template.getDescription());
item.setLabelDetails(itemLabelDetails);

Map<String, String> data = new HashMap<>(3);
data.put(CompletionResolveHandler.DATA_FIELD_URI, uri);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.eclipse.jdt.ls.core.internal.syntaxserver.ModelBasedCompletionEngine;
import org.eclipse.lsp4j.Command;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionItemOptions;
import org.eclipse.lsp4j.CompletionList;
import org.eclipse.lsp4j.CompletionOptions;
import org.eclipse.lsp4j.CompletionParams;
Expand All @@ -60,7 +61,16 @@

public class CompletionHandler{

public final static CompletionOptions DEFAULT_COMPLETION_OPTIONS = new CompletionOptions(Boolean.TRUE, Arrays.asList(".", "@", "#", "*", " "));
public final static CompletionOptions getDefaultCompletionOptions(PreferenceManager preferenceManager) {
CompletionOptions completionOptions = new CompletionOptions(Boolean.TRUE, Arrays.asList(".", "@", "#", "*", " "));
if (preferenceManager.getClientPreferences().isCompletionItemLabelDetailsSupport()) {
CompletionItemOptions completionItemOptions = new CompletionItemOptions();
completionItemOptions.setLabelDetailsSupport(Boolean.TRUE);
completionOptions.setCompletionItem(completionItemOptions);
}
return completionOptions;
}

private static final Set<String> UNSUPPORTED_RESOURCES = Sets.newHashSet("module-info.java", "package-info.java");

static final Comparator<CompletionItem> PROPOSAL_COMPARATOR = new Comparator<>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
import org.eclipse.jdt.ls.internal.gradle.checksums.WrapperValidator;
import org.eclipse.lsp4j.CodeActionOptions;
import org.eclipse.lsp4j.CodeLensOptions;
import org.eclipse.lsp4j.CompletionItemOptions;
import org.eclipse.lsp4j.CompletionOptions;
import org.eclipse.lsp4j.DocumentFilter;
import org.eclipse.lsp4j.DocumentOnTypeFormattingOptions;
import org.eclipse.lsp4j.ExecuteCommandOptions;
Expand Down Expand Up @@ -102,7 +104,7 @@ public InitHandler(ProjectsManager manager, PreferenceManager preferenceManager,
public void registerCapabilities(InitializeResult initializeResult) {
ServerCapabilities capabilities = new ServerCapabilities();
if (!preferenceManager.getClientPreferences().isCompletionDynamicRegistered()) {
capabilities.setCompletionProvider(CompletionHandler.DEFAULT_COMPLETION_OPTIONS);
capabilities.setCompletionProvider(CompletionHandler.getDefaultCompletionOptions(preferenceManager));
}
if (!preferenceManager.getClientPreferences().isFormattingDynamicRegistrationSupported()) {
capabilities.setDocumentFormattingProvider(Boolean.TRUE);
Expand Down Expand Up @@ -176,7 +178,7 @@ public void registerCapabilities(InitializeResult initializeResult) {
if (!preferenceManager.getClientPreferences().isInlayHintDynamicRegistered()) {
capabilities.setInlayHintProvider(Boolean.TRUE);
}

capabilities.setCallHierarchyProvider(Boolean.TRUE);
TextDocumentSyncOptions textDocumentSyncOptions = new TextDocumentSyncOptions();
textDocumentSyncOptions.setOpenClose(Boolean.TRUE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ private void registerCapabilities() {
*/
private void syncCapabilitiesToSettings() {
if (preferenceManager.getClientPreferences().isCompletionDynamicRegistered()) {
toggleCapability(preferenceManager.getPreferences().isCompletionEnabled(), Preferences.COMPLETION_ID, Preferences.COMPLETION, CompletionHandler.DEFAULT_COMPLETION_OPTIONS);
toggleCapability(preferenceManager.getPreferences().isCompletionEnabled(), Preferences.COMPLETION_ID, Preferences.COMPLETION, CompletionHandler.getDefaultCompletionOptions(preferenceManager));
}
if (preferenceManager.getClientPreferences().isFormattingDynamicRegistrationSupported()) {
toggleCapability(preferenceManager.getPreferences().isJavaFormatEnabled(), Preferences.FORMATTING_ID, Preferences.TEXT_DOCUMENT_FORMATTING, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,14 @@ public boolean isCompletionInsertReplaceSupport() {
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getInsertReplaceSupport().booleanValue();
}

public boolean isCompletionItemLabelDetailsSupport() {
return v3supported
&& capabilities.getTextDocument().getCompletion() != null
&& capabilities.getTextDocument().getCompletion().getCompletionItem() != null
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getLabelDetailsSupport() != null
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getLabelDetailsSupport().booleanValue();
}

public boolean isInlayHintRefreshSupported() {
return v3supported
&& capabilities.getWorkspace().getInlayHint() != null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.eclipse.jdt.ls.core.internal.handlers.SemanticTokensHandler;
import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager;
import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager;
import org.eclipse.lsp4j.CompletionItemOptions;
import org.eclipse.lsp4j.CompletionOptions;
import org.eclipse.lsp4j.DocumentFilter;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.SaveOptions;
Expand Down Expand Up @@ -73,7 +75,7 @@ public void registerCapabilities(InitializeResult initializeResult) {
capabilities.setHoverProvider(Boolean.TRUE);
}
if (!preferenceManager.getClientPreferences().isCompletionDynamicRegistered()) {
capabilities.setCompletionProvider(CompletionHandler.DEFAULT_COMPLETION_OPTIONS);
capabilities.setCompletionProvider(CompletionHandler.getDefaultCompletionOptions(preferenceManager));
}
if (!preferenceManager.getClientPreferences().isDocumentHighlightDynamicRegistered()) {
capabilities.setDocumentHighlightProvider(Boolean.TRUE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ public void initialized() {
new DocumentOnTypeFormattingOptions(";", Arrays.asList("\n", "}")));
}
if (preferenceManager.getClientPreferences().isCompletionDynamicRegistered()) {
registerCapability(Preferences.COMPLETION_ID, Preferences.COMPLETION, CompletionHandler.DEFAULT_COMPLETION_OPTIONS);
registerCapability(Preferences.COMPLETION_ID, Preferences.COMPLETION, CompletionHandler.getDefaultCompletionOptions(preferenceManager));
}

if (!preferenceManager.getClientPreferences().isClientDocumentSymbolProviderRegistered() && preferenceManager.getClientPreferences().isDocumentSymbolDynamicRegistered()) {
Expand Down

0 comments on commit 51a7022

Please sign in to comment.