From 6fcf593595c865e1858afc0897a956ac14393c92 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Thu, 27 Jul 2023 12:38:31 +0200 Subject: [PATCH] LSP: Code completion for record patterns added. --- .../editor/java/JavaCompletionCollector.java | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java b/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java index 679a3b84b3af..e97d4a8a8c48 100644 --- a/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java +++ b/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java @@ -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; @@ -154,7 +155,7 @@ public void run(ResultIterator resultIterator) throws Exception { return ret.get(); } - public static final Set 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 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 getDocumentation(Document doc, int offset, ElementHandle handle) { return () -> { @@ -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: @@ -294,7 +297,8 @@ private static TextEdit modify2TextEdit(JavaSource js, Task task) t } private static class ItemFactoryImpl implements JavaCompletionTask.TypeCastableItemFactory, - JavaCompletionTask.LambdaItemFactory, JavaCompletionTask.ModuleItemFactory { + JavaCompletionTask.LambdaItemFactory, JavaCompletionTask.ModuleItemFactory, + JavaCompletionTask.RecordPatternItemFactory { private static final String EMPTY = ""; private static final String ERROR = ""; @@ -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 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 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();