Skip to content

Commit

Permalink
LSP: Code completion for record patterns added.
Browse files Browse the repository at this point in the history
  • Loading branch information
dbalek committed Jul 27, 2023
1 parent 8179b81 commit 6fcf593
Showing 1 changed file with 41 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.RecordComponentElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.element.VariableElement;
Expand Down Expand Up @@ -154,7 +155,7 @@ public void run(ResultIterator resultIterator) throws Exception {
return ret.get();
}

public static final Set<String> SUPPORTED_ELEMENT_KINDS = new HashSet<>(Arrays.asList("PACKAGE", "CLASS", "INTERFACE", "ENUM", "ANNOTATION_TYPE", "METHOD", "CONSTRUCTOR", "INSTANCE_INIT", "STATIC_INIT", "FIELD", "ENUM_CONSTANT", "TYPE_PARAMETER", "MODULE"));
public static final Set<String> SUPPORTED_ELEMENT_KINDS = new HashSet<>(Arrays.asList("PACKAGE", "CLASS", "INTERFACE", "ENUM", "ANNOTATION_TYPE", "RECORD", "METHOD", "CONSTRUCTOR", "INSTANCE_INIT", "STATIC_INIT", "FIELD", "ENUM_CONSTANT", "TYPE_PARAMETER", "MODULE"));

public static Supplier<String> getDocumentation(Document doc, int offset, ElementHandle handle) {
return () -> {
Expand Down Expand Up @@ -189,6 +190,8 @@ public static Completion.Kind elementKind2CompletionItemKind(ElementKind kind) {
return Completion.Kind.Enum;
case CLASS:
return Completion.Kind.Class;
case RECORD:
return Completion.Kind.Struct;
case ANNOTATION_TYPE:
return Completion.Kind.Interface;
case INTERFACE:
Expand Down Expand Up @@ -294,7 +297,8 @@ private static TextEdit modify2TextEdit(JavaSource js, Task<WorkingCopy> task) t
}

private static class ItemFactoryImpl implements JavaCompletionTask.TypeCastableItemFactory<Completion>,
JavaCompletionTask.LambdaItemFactory<Completion>, JavaCompletionTask.ModuleItemFactory<Completion> {
JavaCompletionTask.LambdaItemFactory<Completion>, JavaCompletionTask.ModuleItemFactory<Completion>,
JavaCompletionTask.RecordPatternItemFactory<Completion> {

private static final String EMPTY = "";
private static final String ERROR = "<error>";
Expand Down Expand Up @@ -931,6 +935,41 @@ public Completion createLambdaItem(CompilationInfo info, TypeElement elem, Decla
.build();
}


@Override
public Completion createRecordPatternItem(CompilationInfo info, TypeElement elem, DeclaredType type, int substitutionOffset, ReferencesCount referencesCount, boolean isDeprecated, boolean insideNew, boolean addTypeVars) {
String simpleName = elem.getSimpleName().toString();
Iterator<? extends RecordComponentElement> it = elem.getRecordComponents().iterator();
StringBuilder label = new StringBuilder(elem.getSimpleName());
StringBuilder insertText = new StringBuilder(elem.getSimpleName());
RecordComponentElement recordComponent;
int cnt = 1;
label.append("(");
insertText.append("(");
while (it.hasNext()) {
recordComponent = it.next();
CharSequence typeName = Utilities.getTypeName(info, recordComponent.getAccessor().getReturnType(), false);
label.append(typeName);
insertText.append("${").append(cnt++).append(":").append(typeName).append("}");
label.append(" ");
insertText.append(" ");
label.append(recordComponent.getSimpleName());
insertText.append("${").append(cnt++).append(":").append(recordComponent.getSimpleName()).append("}");
if (it.hasNext()) {
label.append(", ");
insertText.append(", ");
}
}
label.append(")");
insertText.append(")");
return CompletionCollector.newBuilder(label.toString())
.kind(Completion.Kind.Struct)
.insertText(insertText.toString())
.insertTextFormat(Completion.TextFormat.Snippet)
.sortText(String.format("%04d%s#", 650, simpleName))
.build();
}

private Completion createTypeItem(CompilationInfo info, String prefix, ElementHandle<TypeElement> handle, TypeElement elem, DeclaredType type, int substitutionOffset, ReferencesCount referencesCount, boolean isDeprecated, boolean insideNew, boolean addTypeVars, boolean addSimpleName, boolean smartType) {
int off = info.getSnapshot().getEmbeddedOffset(substitutionOffset);
String name = elem.getQualifiedName().toString();
Expand Down

0 comments on commit 6fcf593

Please sign in to comment.