[java-completion] IDEA-363369 Postfix completion for conversion

- fix highlighting
- simplification

GitOrigin-RevId: a6b33fdfc8af724993831fd750b548c061861ffe
This commit is contained in:
Mikhail Pyltsin
2024-11-26 13:42:51 +00:00
committed by intellij-monorepo-bot
parent d0c4ea7fca
commit a9d935a482
27 changed files with 110 additions and 278 deletions
@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.openapi.project.DumbAware;
import com.intellij.pom.java.LanguageLevel;
@@ -8,21 +9,19 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
public class AsListToListPostfixTemplate extends JavaEditableTaggedPostfixTemplate implements DumbAware {
public class AsListToListPostfixTemplate extends JavaEditablePostfixTemplate implements DumbAware {
public AsListToListPostfixTemplate(@NotNull JavaPostfixTemplateProvider provider) {
super("Arrays.asList(exp)",
"asList",
super("Arrays.asList",
"toList",
"java.util.Arrays.asList($EXPR$)$END$",
"Arrays.asList($EXPR$)",
"Arrays.asList(exp)",
Collections.singleton(
new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateArrayReferenceExpressionCondition()),
LanguageLevel.JDK_1_3, false, new String[]{".toList"}, provider);
LanguageLevel.JDK_1_3, false, provider);
}
@Override
@Override
public boolean isBuiltin() {
return true;
}
}
@@ -1,113 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.completion.JavaContributorCollectors;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.codeInsight.template.impl.TemplateImpl;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.java.JavaBundle;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.TextRange;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import static com.intellij.codeInsight.completion.JavaContributorCollectors.POSTFIX_TAG;
@SuppressWarnings("PostfixTemplateDescriptionNotFound")
public class JavaEditableTaggedPostfixTemplate extends JavaEditablePostfixTemplate implements CustomizableLookupElementTemplate {
@SuppressWarnings("RegExpUnexpectedAnchor") private static final String EXPR_$ = "$EXPR$";
@Nullable
private String myText;
@NotNull
private final String myExample;
public @NotNull String @NotNull [] getTags() {
return myTags;
}
private final @NotNull String @NotNull [] myTags;
public JavaEditableTaggedPostfixTemplate(@NotNull String templateId,
@NotNull String templateName,
@NotNull String templateText,
@NotNull String example,
@NotNull Set<? extends JavaPostfixTemplateExpressionCondition> expressionConditions,
@NotNull LanguageLevel minimumLanguageLevel,
boolean useTopmostExpression,
@NotNull String @NotNull [] tags,
@NotNull PostfixTemplateProvider provider) {
this(templateId, templateName, createTemplate(templateText), example, expressionConditions, minimumLanguageLevel, useTopmostExpression,
tags, provider);
}
public JavaEditableTaggedPostfixTemplate(@NotNull String templateId,
@NotNull String templateName,
@NotNull TemplateImpl liveTemplate,
@NotNull String example,
@NotNull Set<? extends JavaPostfixTemplateExpressionCondition> expressionConditions,
@NotNull LanguageLevel minimumLanguageLevel,
boolean useTopmostExpression,
@NotNull String @NotNull [] tags,
@NotNull PostfixTemplateProvider provider) {
super(templateId, templateName, liveTemplate, example.replace(EXPR_$, "expr"), expressionConditions, minimumLanguageLevel,
useTopmostExpression, provider);
myTags = tags;
myExample = example;
}
@Override
public boolean isApplicable(@NotNull PsiElement context, @NotNull Document copyDocument, int newOffset) {
List<PsiElement> expressions = getExpressions(context, copyDocument, newOffset);
if (expressions.size() != 1) return false;
PsiElement element = expressions.get(0);
myText = element.getText(); //not ideal, because the state is changed, but it needs for nice rendering
return true;
}
@Override
public void renderElement(@NotNull LookupElementPresentation presentation) {
String exp = myText;
String templateText = myExample;
if (exp == null || templateText.length() + exp.length() >= 100 || !templateText.contains(EXPR_$)) {
return;
}
String withExp = templateText.replace(EXPR_$, exp);
if (withExp.contains("$")) {
return;
}
ArrayList<String> allTags = new ArrayList<>(Arrays.asList(myTags));
allTags.add(getKey());
String message = JavaBundle.message("java.completion.tag", allTags.size());
String withTags = withExp + " " + message + String.join(", ", allTags);
presentation.setItemText(withTags);
int startOffset = templateText.indexOf(EXPR_$);
presentation.decorateItemTextRange(new TextRange(startOffset, startOffset + exp.length()),
LookupElementPresentation.LookupItemDecoration.GRAY);
startOffset = withExp.length();
presentation.decorateItemTextRange(new TextRange(startOffset, startOffset + 1 + message.length()),
LookupElementPresentation.LookupItemDecoration.GRAY);
presentation.setTypeText("");
}
@Override
public Collection<String> getAllLookupStrings() {
return Arrays.asList(myTags);
}
@Override
protected @NotNull TextRange getRangeToRemove(@NotNull PsiElement element) {
JavaContributorCollectors.logInsertHandle(element.getProject(), POSTFIX_TAG, CompletionType.BASIC);
return super.getRangeToRemove(element);
}
}
@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.openapi.project.DumbAware;
import com.intellij.pom.java.LanguageLevel;
@@ -8,15 +9,14 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
public class JavaUtilDateToLocalDatePostfixTemplate extends JavaEditableTaggedPostfixTemplate implements DumbAware {
public class JavaUtilDateToLocalDatePostfixTemplate extends JavaEditablePostfixTemplate implements DumbAware {
public JavaUtilDateToLocalDatePostfixTemplate(@NotNull JavaPostfixTemplateProvider provider) {
super("LocalDate.ofInstant(exp.toInstant(), zoneId) java.sql.Date.valueOf(exp)",
"toLocalDate",
super("toLocalDate",
"java.time.LocalDate.ofInstant($EXPR$.toInstant(), $END$)",
"LocalDate.ofInstant($EXPR$.toInstant(), zoneId)",
"LocalDate.ofInstant(exp.toInstant(), zoneId)",
Collections.singleton(
new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateExpressionFqnCondition("java.util.Date")),
LanguageLevel.JDK_1_8, false, new String[]{".asLocalDate"}, provider);
LanguageLevel.JDK_1_8, false, provider);
}
@Override
@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.openapi.project.DumbAware;
import com.intellij.pom.java.LanguageLevel;
@@ -8,17 +9,27 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
public class ListOfToListPostfixTemplate extends JavaEditableTaggedPostfixTemplate implements DumbAware {
public class ListOfToListPostfixTemplate extends JavaEditablePostfixTemplate implements DumbAware {
public ListOfToListPostfixTemplate(@NotNull JavaPostfixTemplateProvider provider) {
super("List.of(exp)",
"listOf",
super("List.of",
"toList",
"java.util.List.of($EXPR$)$END$",
"List.of($EXPR$)",
"List.of(exp)",
Collections.singleton(
new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateArrayReferenceExpressionCondition()),
LanguageLevel.JDK_1_9, false, new String[]{".asList", ".toList"}, provider);
LanguageLevel.JDK_1_9, false, provider);
}
//
// super("format",
// "String.format($EXPR$, $END$)",
// "String.format(expr)",
// Collections.singleton(
// new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateExpressionFqnCondition(CommonClassNames.JAVA_LANG_STRING)),
// LanguageLevel.JDK_1_3, false, provider);
//}
@Override
public boolean isBuiltin() {
return true;
@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.openapi.project.DumbAware;
import com.intellij.pom.java.LanguageLevel;
@@ -8,15 +9,14 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
public class LocalDateToJavaSqlDatePostfixTemplate extends JavaEditableTaggedPostfixTemplate implements DumbAware {
public class LocalDateToJavaSqlDatePostfixTemplate extends JavaEditablePostfixTemplate implements DumbAware {
public LocalDateToJavaSqlDatePostfixTemplate(@NotNull JavaPostfixTemplateProvider provider) {
super("java.sql.Date.valueOf(exp)",
"sqlValueOf",
super("toSqlDate",
"java.sql.Date.valueOf($EXPR$)$END$",
"java.sql.Date.valueOf($EXPR$)",
"java.sql.Date.valueOf(exp)",
Collections.singleton(
new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateExpressionFqnCondition("java.time.LocalDate")),
LanguageLevel.JDK_1_8, false, new String[]{".toSqlDate"}, provider);
LanguageLevel.JDK_1_8, false, provider);
}
@Override
@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.openapi.project.DumbAware;
import com.intellij.pom.java.LanguageLevel;
@@ -8,21 +9,19 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
public class NewArrayListToListPostfixTemplate extends JavaEditableTaggedPostfixTemplate implements DumbAware {
public class NewArrayListToListPostfixTemplate extends JavaEditablePostfixTemplate implements DumbAware {
public NewArrayListToListPostfixTemplate(@NotNull JavaPostfixTemplateProvider provider) {
super("new ArrayList<>(exp)",
super("new ArrayList",
"toList",
"new java.util.ArrayList<>($EXPR$)$END$",
"new ArrayList<>($EXPR$)",
"new ArrayList<>(exp)" ,
Collections.singleton(
new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateExpressionFqnCondition("java.util.Collection")),
LanguageLevel.JDK_1_7, false, new String[]{".asList"}, provider);
LanguageLevel.JDK_1_7, false, provider);
}
@Override
public boolean isBuiltin() {
return true;
}
}
@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaEditablePostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.editable.JavaPostfixTemplateExpressionCondition;
import com.intellij.openapi.project.DumbAware;
import com.intellij.pom.java.LanguageLevel;
@@ -8,21 +9,18 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
public class NewHashSetToSetPostfixTemplate extends JavaEditableTaggedPostfixTemplate implements DumbAware {
public class NewHashSetToSetPostfixTemplate extends JavaEditablePostfixTemplate implements DumbAware {
public NewHashSetToSetPostfixTemplate(@NotNull JavaPostfixTemplateProvider provider) {
super("new HashSet<>(exp)",
"toSet",
super("toSet",
"new java.util.HashSet<>($EXPR$)$END$",
"new HashSet<>($EXPR$)",
"new HashSet<>(exp)",
Collections.singleton(
new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateExpressionFqnCondition("java.util.Collection")),
LanguageLevel.JDK_1_7, false, new String[]{".asSet"}, provider);
LanguageLevel.JDK_1_7, false, provider);
}
@Override
public boolean isBuiltin() {
return true;
}
}
@@ -1,6 +1,8 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates.editable;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.completion.JavaContributorCollectors;
import com.intellij.codeInsight.template.impl.TemplateImpl;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplateProvider;
import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils;
@@ -20,6 +22,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.*;
import static com.intellij.codeInsight.completion.JavaContributorCollectors.POSTFIX_TAG;
@SuppressWarnings("PostfixTemplateDescriptionNotFound")
public class JavaEditablePostfixTemplate
extends EditablePostfixTemplateWithMultipleExpressions<JavaPostfixTemplateExpressionCondition> {
@@ -101,6 +105,7 @@ public class JavaEditablePostfixTemplate
@Override
protected @NotNull TextRange getRangeToRemove(@NotNull PsiElement element) {
JavaContributorCollectors.logInsertHandle(element.getProject(), POSTFIX_TAG, CompletionType.BASIC);
PsiElement toRemove = getElementToRemove(element);
if (toRemove instanceof PsiExpressionStatement) {
PsiElement lastChild = toRemove.getLastChild();
@@ -4,7 +4,6 @@ package com.intellij.codeInsight.template.postfix.templates.editable;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.postfix.settings.PostfixTemplateEditorBase;
import com.intellij.codeInsight.template.postfix.templates.JavaEditableTaggedPostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplateProvider;
import com.intellij.ide.util.TreeClassChooser;
@@ -20,7 +19,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.Strings;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.JavaCodeFragment;
import com.intellij.psi.JavaCodeFragmentFactory;
@@ -28,7 +26,6 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.ui.SimpleListCellRenderer;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBTextField;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.FormBuilder;
@@ -37,7 +34,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
@@ -46,19 +42,17 @@ public class JavaPostfixTemplateEditor extends PostfixTemplateEditorBase<JavaPos
private final @NotNull JPanel myPanel;
private final @NotNull ComboBox<LanguageLevel> myLanguageLevelCombo;
private final @NotNull JBCheckBox myStaticImportCheckBox;
private final @NotNull JBTextField myTagsField;
public JavaPostfixTemplateEditor(@NotNull PostfixTemplateProvider provider) {
super(provider, createEditor(), true);
myStaticImportCheckBox = new JBCheckBox(JavaBundle.message("dialog.edit.template.checkbox.use.static.import"));
myLanguageLevelCombo = new ComboBox<>(LanguageLevel.values());
myLanguageLevelCombo.setRenderer(SimpleListCellRenderer.create("", LanguageLevel::getPresentableText));
myTagsField = new JBTextField();
myPanel = FormBuilder.createFormBuilder()
.addLabeledComponent(JavaBundle.message("postfix.template.language.level.title"), myLanguageLevelCombo)
.addComponentFillVertically(myEditTemplateAndConditionsPanel, UIUtil.DEFAULT_VGAP)
.addComponent(myStaticImportCheckBox)
.addLabeledComponent("Tags: ", myTagsField)
.getPanel();
}
@@ -75,17 +69,9 @@ public class JavaPostfixTemplateEditor extends PostfixTemplateEditorBase<JavaPos
String templateText = myTemplateEditor.getDocument().getText();
boolean useTopmostExpression = myApplyToTheTopmostJBCheckBox.isSelected();
boolean useStaticImport = myStaticImportCheckBox.isSelected();
String tagText = myTagsField.getText();
JavaEditablePostfixTemplate template;
if (tagText != null && !tagText.isBlank()) {
String[] tags = tagText.split("[,;]");
template =
new JavaEditableTaggedPostfixTemplate(templateId, templateName, templateText, "", conditions, languageLevel, useTopmostExpression, tags, myProvider);
} else{
template =
new JavaEditablePostfixTemplate(templateId, templateName, templateText, "", conditions, languageLevel, useTopmostExpression,
myProvider);
}
JavaEditablePostfixTemplate template =
new JavaEditablePostfixTemplate(templateId, templateName, templateText, "", conditions, languageLevel, useTopmostExpression,
myProvider);
template.getLiveTemplate().setValue(Template.Property.USE_STATIC_IMPORT_IF_POSSIBLE, useStaticImport);
return template;
}
@@ -113,7 +99,6 @@ public class JavaPostfixTemplateEditor extends PostfixTemplateEditorBase<JavaPos
group.add(new AddConditionAction(new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateNumberExpressionCondition()));
group.add(new AddConditionAction(new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateNotPrimitiveTypeExpressionCondition()));
group.add(new AddConditionAction(new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateArrayExpressionCondition()));
group.add(new AddConditionAction(new JavaPostfixTemplateExpressionCondition.JavaPostfixTemplateArrayReferenceExpressionCondition()));
Project[] projects = ProjectManager.getInstance().getOpenProjects();
for (Project project : projects) {
group.add(new ChooseClassAction(project));
@@ -127,9 +112,6 @@ public class JavaPostfixTemplateEditor extends PostfixTemplateEditorBase<JavaPos
if (template instanceof JavaEditablePostfixTemplate javaTemplate) {
myLanguageLevelCombo.setSelectedItem(javaTemplate.getMinimumLanguageLevel());
myStaticImportCheckBox.setSelected(javaTemplate.getLiveTemplate().getValue(Template.Property.USE_STATIC_IMPORT_IF_POSSIBLE));
if(template instanceof JavaEditableTaggedPostfixTemplate javaTaggedTemplate) {
myTagsField.setText(Strings.join(Arrays.asList(javaTaggedTemplate.getTags()), ";"));
}
}
}
@@ -1,5 +0,0 @@
public class Foo {
void m(Integer[] o) {
o.asList<caret>
}
}
@@ -1,7 +0,0 @@
import java.util.Arrays;
public class Foo {
void m(Integer[] o) {
Arrays.asList(o)<caret>
}
}
@@ -1,5 +0,0 @@
public class Foo {
void m(Integer[] o) {
o.asList<caret>
}
}
@@ -1,7 +0,0 @@
import java.util.List;
public class Foo {
void m(Integer[] o) {
List.of(o)<caret>
}
}
@@ -1,7 +0,0 @@
import java.util.Set;
public class Foo {
void m(Set<String> o) {
o.asList<caret>
}
}
@@ -1,8 +0,0 @@
import java.util.ArrayList;
import java.util.Set;
public class Foo {
void m(Set<String> o) {
new ArrayList<>(o)<caret>
}
}
@@ -1,7 +0,0 @@
import java.util.Set;
public class Foo {
void m(Set<String> o) {
o.asSet<caret>
}
}
@@ -1,8 +0,0 @@
import java.util.HashSet;
import java.util.Set;
public class Foo {
void m(Set<String> o) {
new HashSet<>(o)<caret>
}
}
@@ -21,8 +21,5 @@ public class AsListToListPostfixTemplateTest extends PostfixTemplateTestCase {
doTestCompletion("asList");
}
public void testSimpleAsList() {
doTestCompletion("asList");
}
}
@@ -18,11 +18,7 @@ public class ListOfToListPostfixTemplateTest extends PostfixTemplateTestCase {
}
public void testSimple() {
doTestCompletion("listOf");
}
public void testSimpleAsList() {
doTestCompletion("listOf");
doTestCompletion("List.of");
}
}
@@ -20,9 +20,5 @@ public class NewArrayListToListPostfixTemplateTest extends PostfixTemplateTestCa
public void testSimple() {
doTestCompletion(null);
}
public void testSimpleAsList() {
doTestCompletion(null);
}
}
@@ -20,9 +20,5 @@ public class NewHashSetToSetPostfixTemplateTest extends PostfixTemplateTestCase
public void testSimple() {
doTestCompletion(null);
}
public void testSimpleAsSet() {
doTestCompletion(null);
}
}
@@ -3,6 +3,7 @@ package com.intellij.java.codeInsight.template.postfix.templates;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.openapi.application.impl.NonBlockingReadActionImpl;
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
@@ -34,7 +35,10 @@ abstract public class PostfixTemplateTestCase extends LightJavaCodeInsightFixtur
LookupElement[] elements = myFixture.completeBasic();
if (text != null) {
for (LookupElement element : elements) {
if(element.getLookupString().toLowerCase(Locale.ROOT).contains(text.toLowerCase(Locale.ROOT))) {
LookupElementPresentation presentation = new LookupElementPresentation();
element.renderElement(presentation);
if (presentation.getItemText().toLowerCase(Locale.ROOT).contains(text.toLowerCase(Locale.ROOT)) ||
presentation.getTypeText().toLowerCase(Locale.ROOT).contains(text.toLowerCase(Locale.ROOT))) {
myFixture.getLookup().setCurrentItem(element);
break;
}
@@ -0,0 +1,42 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.java.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.impl.LookupCellRenderer;
import com.intellij.codeInsight.lookup.impl.LookupImpl;
import com.intellij.openapi.application.ReadAction;
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase;
import javax.swing.*;
import java.awt.*;
import static com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor.setShowTemplatesInTests;
public class RenderHighlightingTest extends LightJavaCodeInsightFixtureTestCase {
public void testSimple() {
setShowTemplatesInTests(true, getTestRootDisposable());
myFixture.configureByText("a.java", """
import java.util.List;
class A {
void m(List<String> list) {
list.toS<caret>
}
}""");
LookupElement[] elements = myFixture.completeBasic();
ReadAction.run(() -> {
JList<LookupElement> list = getLookup().getList();
for (LookupElement item : getLookup().getItems()) {
if (!item.getLookupString().equals(".toSet")) continue;
if (list.getCellRenderer() instanceof LookupCellRenderer lookupCellRenderer) {
Component component = list.getCellRenderer().getListCellRendererComponent(list, item, 0, false, false);
System.out.println(component);
}
}
});
}
private LookupImpl getLookup() {
return (LookupImpl)myFixture.getLookup();
}
}
@@ -5624,7 +5624,6 @@ c:com.intellij.codeInsight.template.postfix.completion.PostfixTemplateLookupElem
- com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement
- <init>(com.intellij.codeInsight.template.postfix.templates.PostfixLiveTemplate,com.intellij.codeInsight.template.postfix.templates.PostfixTemplate,java.lang.String,com.intellij.codeInsight.template.postfix.templates.PostfixTemplateProvider,Z):V
- expandTemplate(com.intellij.openapi.editor.Editor,com.intellij.psi.PsiFile):V
- getAllLookupStrings():java.util.Set
- getPostfixTemplate():com.intellij.codeInsight.template.postfix.templates.PostfixTemplate
- getProvider():com.intellij.codeInsight.template.postfix.templates.PostfixTemplateProvider
- renderElement(com.intellij.codeInsight.lookup.LookupElementPresentation):V
@@ -425,8 +425,16 @@ class LookupCellRenderer(lookup: LookupImpl, editorComponent: JComponent) : List
val prefix = if (item is EmptyLookupItem) "" else lookup.itemPattern(item)
if (prefix.isNotEmpty()) {
val ranges = getMatchingFragments(prefix, name)
if (ranges != null) {
var ranges: List<TextRange>? = getMatchingFragments(prefix, name)
if (ranges == null) {
val startIndex = item.lookupString.indexOf(name)
if (startIndex != -1) {
ranges = getMatchingFragments(prefix, item.lookupString)
?.map { TextRange((it.startOffset - startIndex).coerceIn(0, name.length), (it.endOffset - startIndex).coerceIn(0, name.length)) }
?.filter { it.length != 0 }
}
}
if (ranges != null && ranges.isNotEmpty()) {
val highlighted = SimpleTextAttributes(style, MATCHED_FOREGROUND_COLOR)
SpeedSearchUtil.appendColoredFragments(nameComponent, name, ranges, base, highlighted)
renderItemNameDecoration(nameComponent, itemNameDecorations)
@@ -4,7 +4,6 @@ package com.intellij.codeInsight.template.postfix.completion;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.codeInsight.template.CustomTemplateCallback;
import com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement;
import com.intellij.codeInsight.template.postfix.templates.CustomizableLookupElementTemplate;
import com.intellij.codeInsight.template.postfix.templates.PostfixLiveTemplate;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplate;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplateProvider;
@@ -13,9 +12,6 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Set;
public class PostfixTemplateLookupElement extends CustomLiveTemplateLookupElement {
private final @NotNull PostfixTemplate myTemplate;
private final @NotNull String myTemplateKey;
@@ -41,24 +37,11 @@ public class PostfixTemplateLookupElement extends CustomLiveTemplateLookupElemen
return myProvider;
}
@Override
public Set<String> getAllLookupStrings() {
Set<String> allLookupStrings = super.getAllLookupStrings();
if (myTemplate instanceof CustomizableLookupElementTemplate customizableRenderPresentation) {
allLookupStrings = new HashSet<>(allLookupStrings);
allLookupStrings.addAll(customizableRenderPresentation.getAllLookupStrings());
}
return allLookupStrings;
}
@Override
public void renderElement(@NotNull LookupElementPresentation presentation) {
super.renderElement(presentation);
presentation.setTypeText(myTemplate.getExample());
presentation.setTypeGrayed(true);
if (myTemplate instanceof CustomizableLookupElementTemplate customizableRenderPresentation) {
customizableRenderPresentation.renderElement(presentation);
}
}
@Override
@@ -1,16 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.template.postfix.templates;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@ApiStatus.Internal
@ApiStatus.Experimental
public interface CustomizableLookupElementTemplate {
void renderElement(@NotNull LookupElementPresentation presentation);
Collection<String> getAllLookupStrings();
}