From e0d16d42e6f8267b8d04ae0cc0bed44c5cd56f0d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 26 Jul 2023 14:53:54 +0200 Subject: [PATCH] Java: don't add static import for STR when optimizing imports (IDEA-321466) GitOrigin-RevId: 58570ed1f0f0ad96432e3be035f1157c8f27e964 --- .../impl/source/codeStyle/ImportHelper.java | 13 ++++++++---- .../psi/optimizeImports/StringTemplates.java | 6 ++++++ .../StringTemplates_after.java | 6 ++++++ .../java/psi/OptimizeImportsTest.java | 21 +++++++++++++++++-- 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/psi/optimizeImports/StringTemplates.java create mode 100644 java/java-tests/testData/psi/optimizeImports/StringTemplates_after.java diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java index 0eadd66ec09a..e27322349943 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java @@ -4,6 +4,7 @@ package com.intellij.psi.impl.source.codeStyle; import com.intellij.application.options.CodeStyle; import com.intellij.codeInsight.ImportFilter; import com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl; +import com.intellij.codeInsight.daemon.impl.analysis.HighlightingFeature; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.jsp.JspSpiUtil; import com.intellij.lang.ASTNode; @@ -57,6 +58,7 @@ public final class ImportHelper{ private final JavaCodeStyleSettings mySettings; @NonNls private static final String JAVA_LANG_PACKAGE = "java.lang"; + private static final String STRING_TEMPLATE_STR = "java.lang.StringTemplate.STR"; public ImportHelper(@NotNull JavaCodeStyleSettings settings) { mySettings = settings; @@ -125,7 +127,8 @@ public final class ImportHelper{ classesToUseSingle.addAll(toReimport); try { - StringBuilder text = buildImportListText(resultList, classesOrPackagesToImportOnDemand.keySet(), classesToUseSingle); + boolean stringTemplates = HighlightingFeature.STRING_TEMPLATES.isAvailable(file); + StringBuilder text = buildImportListText(resultList, classesOrPackagesToImportOnDemand.keySet(), classesToUseSingle, stringTemplates); for (PsiElement nonImport : nonImports) { text.append("\n").append(nonImport.getText()); } @@ -367,15 +370,17 @@ public final class ImportHelper{ @NotNull private static StringBuilder buildImportListText(@NotNull List> names, - @NotNull final Set packagesOrClassesToImportOnDemand, - @NotNull final Set namesToUseSingle) { + @NotNull Set packagesOrClassesToImportOnDemand, + @NotNull Set namesToUseSingle, + boolean stringTemplates) { final Set> importedPackagesOrClasses = new HashSet<>(); @NonNls final StringBuilder buffer = new StringBuilder(); for (Pair pair : names) { String name = pair.getFirst(); Boolean isStatic = pair.getSecond(); String packageOrClassName = getPackageOrClassName(name); - final boolean implicitlyImported = JAVA_LANG_PACKAGE.equals(packageOrClassName); + final boolean implicitlyImported = JAVA_LANG_PACKAGE.equals(packageOrClassName) || + stringTemplates && STRING_TEMPLATE_STR.equals(name); boolean useOnDemand = implicitlyImported || packagesOrClassesToImportOnDemand.contains(packageOrClassName); final Pair current = Pair.create(packageOrClassName, isStatic); if (namesToUseSingle.remove(name)) { diff --git a/java/java-tests/testData/psi/optimizeImports/StringTemplates.java b/java/java-tests/testData/psi/optimizeImports/StringTemplates.java new file mode 100644 index 000000000000..566cb867bc64 --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/StringTemplates.java @@ -0,0 +1,6 @@ +class X { + + void x() { + String s = STR.""; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/optimizeImports/StringTemplates_after.java b/java/java-tests/testData/psi/optimizeImports/StringTemplates_after.java new file mode 100644 index 000000000000..566cb867bc64 --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/StringTemplates_after.java @@ -0,0 +1,6 @@ +class X { + + void x() { + String s = STR.""; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java index d5454c3dc171..a9e9cd44172b 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java @@ -16,6 +16,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -23,6 +24,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.codeStyle.PackageEntry; import com.intellij.psi.codeStyle.PackageEntryTable; import com.intellij.psi.codeStyle.modifier.CodeStyleSettingsModifier; +import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.ServiceContainerUtil; import com.intellij.util.PathUtil; @@ -65,12 +67,27 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase { public void testIDEADEV10716() { doTest(); } public void testUnresolvedImports() { doTest(); } public void testUnresolvedImports2() { doTest(); } - public void testInterfaceMethodThroughInheritance() { + public void testInterfaceMethodThroughInheritance() { myFixture.addClass("package foo; public interface Foo {" + " static void foo() {}" + " interface Inner extends Foo {}" + "}"); - doTest(); + doTest(); + } + public void testStringTemplates() { + IdeaTestUtil.setModuleLanguageLevel(getModule(), LanguageLevel.JDK_21_PREVIEW); + myFixture.addClass(""" + package java.lang; + public interface StringTemplate { + Processor STR = null; + + @PreviewFeature(feature=PreviewFeature.Feature.STRING_TEMPLATES) + @FunctionalInterface + public interface Processor { + R process(StringTemplate stringTemplate) throws E; + } + }"""); + doTest(); } public void testNewImportListIsEmptyAndCommentPreserved() { doTest(); } public void testNewImportListIsEmptyAndJavaDocWithInvalidCodePreserved() { doTest(); }