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 Apr 3, 2023
1 parent 5f67acf commit a2d9015
Show file tree
Hide file tree
Showing 8 changed files with 125 additions and 12 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 @@ -93,15 +94,20 @@ public StringBuilder createMethodProposalDescription(CompletionProposal proposal

// 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);
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(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 @@ -342,6 +348,15 @@ private void createMethodProposalLabel(CompletionProposal methodProposal, Comple

setSignature(item, String.valueOf(methodProposal.getSignature()));
setDeclarationSignature(item, String.valueOf(methodProposal.getDeclarationSignature()));
if (isCompletionItemLabelDetailsSupport()){
StringBuilder methodParams = new StringBuilder();
methodParams.append('(');
appendUnboundedParameterList(methodParams, methodProposal);
methodParams.append(')');
StringBuilder returnType = new StringBuilder();
appendReturnType(returnType, methodProposal);
setLabelDetails(item, String.valueOf(methodProposal.getName()), methodParams.toString(), returnType.toString());
}
setName(item, String.valueOf(methodProposal.getName()));
if (fUnit != null && methodProposal.isConstructor() && typeInfo.length() > 0 && item.getData() != null && methodProposal.getRequiredProposals() != null && methodProposal.getRequiredProposals().length > 0) {
CompletionProposal requiredProposal = methodProposal.getRequiredProposals()[0];
Expand Down Expand Up @@ -375,6 +390,11 @@ private void createJavadocMethodProposalLabel(CompletionProposal methodProposal,
String declaringType= extractDeclaringTypeFQN(methodProposal);
declaringType= Signature.getSimpleName(declaringType);
item.setDetail(declaringType);
if (isCompletionItemLabelDetailsSupport()){
StringBuilder returnType = new StringBuilder();
appendReturnType(returnType, methodProposal);
setLabelDetails(item, null, null, returnType.toString());
}
}

private void createOverrideMethodProposalLabel(CompletionProposal methodProposal, CompletionItem item) {
Expand All @@ -385,9 +405,11 @@ private void createOverrideMethodProposalLabel(CompletionProposal methodProposal
item.setInsertText(name);
nameBuffer.append(name);
// parameters
nameBuffer.append('(');
appendUnboundedParameterList(nameBuffer, methodProposal);
nameBuffer.append(')');
StringBuilder parameters = new StringBuilder();
parameters.append('(');
appendUnboundedParameterList(parameters, methodProposal);
parameters.append(')');
nameBuffer.append(parameters);

nameBuffer.append(RETURN_TYPE_SEPARATOR);

Expand All @@ -404,6 +426,9 @@ private void createOverrideMethodProposalLabel(CompletionProposal methodProposal
declaringType= Signature.getSimpleName(declaringType);
typeBuffer.append(String.format("Override method in '%s'", declaringType));
item.setDetail(typeBuffer.toString());
if (isCompletionItemLabelDetailsSupport()){
setLabelDetails(item, String.valueOf(methodProposal.getName()), parameters.toString(), String.valueOf(returnType));
}

setSignature(item, String.valueOf(methodProposal.getSignature()));
setDeclarationSignature(item, String.valueOf(methodProposal.getDeclarationSignature()));
Expand Down Expand Up @@ -481,6 +506,13 @@ void createTypeProposalLabel(char[] fullName, CompletionItem item) {
item.setInsertText(name);
item.setLabel(nameBuffer.toString());
item.setDetail(new String(fullName));
if (isCompletionItemLabelDetailsSupport()){
StringBuilder description= new StringBuilder();
if (qIndex > 0) {
description.append(new String(fullName,0,qIndex-1));
}
setLabelDetails(item, name, null, description.toString());
}
}

private void createJavadocTypeProposalLabel(char[] fullName, CompletionItem item) {
Expand All @@ -499,6 +531,9 @@ private void createJavadocTypeProposalLabel(char[] fullName, CompletionItem item
if (qIndex > 0) {
item.setDetail(new String(fullName, 0, qIndex - 1));
}
if (isCompletionItemLabelDetailsSupport()){
setLabelDetails(item, null, null, new String(fullName, 0, qIndex - 1));
}
}

private int findSimpleNameStart(char[] array) {
Expand All @@ -524,6 +559,9 @@ private void createSimpleLabelWithType(CompletionProposal proposal, CompletionIt
nameBuffer.append(typeName);
}
item.setLabel(nameBuffer.toString());
if (isCompletionItemLabelDetailsSupport()){
setLabelDetails(item, String.valueOf(proposal.getCompletion()), null, String.valueOf(typeName));
}
}

/**
Expand Down Expand Up @@ -577,6 +615,9 @@ private void createLabelWithTypeAndDeclaration(CompletionProposal proposal, Comp
}
detailBuf.append(buf);
item.setDetail(detailBuf.toString());
if (isCompletionItemLabelDetailsSupport()){
setLabelDetails(item, String.valueOf(name), null, String.valueOf(typeName));
}
setName(item,String.valueOf(name));
}

Expand All @@ -587,6 +628,9 @@ private void createPackageProposalLabel(CompletionProposal proposal, CompletionI
detail.append(proposal.getKind() == CompletionProposal.PACKAGE_REF ? "(package) " : "(module) ");
detail.append(String.valueOf(proposal.getDeclarationSignature()));
item.setDetail(detail.toString());
if (isCompletionItemLabelDetailsSupport()){
setLabelDetails(item, null, null, proposal.getKind() == CompletionProposal.PACKAGE_REF ? "(package)" : "(module)");
}
}

StringBuilder createSimpleLabel(CompletionProposal proposal) {
Expand Down Expand Up @@ -615,6 +659,15 @@ private void createAnonymousTypeLabel(CompletionProposal proposal, CompletionIte
item.setDetail(String.valueOf(signatureQualifier) + "." + name);
}
}
if (isCompletionItemLabelDetailsSupport()){
StringBuilder methodParams = new StringBuilder();
methodParams.append('(');
appendUnboundedParameterList(methodParams, proposal);
methodParams.append(')');
StringBuilder returnType = new StringBuilder();
appendReturnType(returnType, proposal);
setLabelDetails(item, name, methodParams.toString(), "Anonymous Inner Type");
}
setDeclarationSignature(item, String.valueOf(declaringTypeSignature));
}

Expand Down Expand Up @@ -740,4 +793,32 @@ private String getProposal(CompletionProposal proposal) {
}
return "unknown";
}

/**
*
* Sets the Completion Item Label Details
*
* @param item the completion item
* @param label the label of the completion item
* @param detail the detail of the completion item
* @param description the description of the completion item showing the return type
*
*/
private void setLabelDetails(CompletionItem item, String label, String detail, String description) {
CompletionItemLabelDetails itemLabelDetails = new CompletionItemLabelDetails();
if (label != null) {
item.setLabel(label);
}
if (detail != null) {
itemLabelDetails.setDetail(detail);
}
if (description != null) {
itemLabelDetails.setDescription(description);
}
item.setLabelDetails(itemLabelDetails);
}

private boolean isCompletionItemLabelDetailsSupport() {
return JavaLanguageServerPlugin.getPreferencesManager() != null && JavaLanguageServerPlugin.getPreferencesManager().getClientPreferences().isCompletionItemLabelDetailsSupport();
}
}
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 @@ -313,6 +314,11 @@ private static List<CompletionItem> getGenericSnippets(SnippetCompletionContext
item.setTextEditText(SnippetUtils.templateToSnippet(template.getPattern()));
}
item.setDetail(template.getDescription());
if (isCompletionItemLabelDetailsSupport()){
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 All @@ -330,6 +336,10 @@ private static List<CompletionItem> getGenericSnippets(SnippetCompletionContext
return res;
}

private static boolean isCompletionItemLabelDetailsSupport() {
return JavaLanguageServerPlugin.getPreferencesManager() != null && JavaLanguageServerPlugin.getPreferencesManager().getClientPreferences().isCompletionItemLabelDetailsSupport();
}

public static String evaluateGenericTemplate(ICompilationUnit cu, CompletionContext completionContext, Template template) {
JavaContextType contextType = (JavaContextType) JavaLanguageServerPlugin.getInstance().getTemplateContextRegistry().getContextType(JavaContextType.ID_STATEMENTS);
char[] completionToken = completionContext.getToken();
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 @@ -50,6 +50,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 @@ -111,7 +113,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 @@ -185,7 +187,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 @@ -369,7 +369,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 @@ -410,6 +410,14 @@ public boolean isCompletionListItemDefaultsSupport() {
return isCompletionListItemDefaultsEditRangeSupport() || isCompletionListItemDefaultsInsertTextFormatSupport();
}

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 a2d9015

Please sign in to comment.