Java: don't add static import for STR when optimizing imports (IDEA-321466)

GitOrigin-RevId: 58570ed1f0f0ad96432e3be035f1157c8f27e964
This commit is contained in:
Bas Leijdekkers
2023-08-01 11:58:02 +00:00
committed by intellij-monorepo-bot
parent cb3d988229
commit e0d16d42e6
4 changed files with 40 additions and 6 deletions
@@ -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<? extends Pair<String, Boolean>> names,
@NotNull final Set<String> packagesOrClassesToImportOnDemand,
@NotNull final Set<String> namesToUseSingle) {
@NotNull Set<String> packagesOrClassesToImportOnDemand,
@NotNull Set<String> namesToUseSingle,
boolean stringTemplates) {
final Set<Pair<String, Boolean>> importedPackagesOrClasses = new HashSet<>();
@NonNls final StringBuilder buffer = new StringBuilder();
for (Pair<String, Boolean> 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<String, Boolean> current = Pair.create(packageOrClassName, isStatic);
if (namesToUseSingle.remove(name)) {
@@ -0,0 +1,6 @@
class X {
void x() {
String s = STR."";
}
}
@@ -0,0 +1,6 @@
class X {
void x() {
String s = STR."";
}
}
@@ -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<String, RuntimeException> STR = null;
@PreviewFeature(feature=PreviewFeature.Feature.STRING_TEMPLATES)
@FunctionalInterface
public interface Processor<R, E extends Throwable> {
R process(StringTemplate stringTemplate) throws E;
}
}""");
doTest();
}
public void testNewImportListIsEmptyAndCommentPreserved() { doTest(); }
public void testNewImportListIsEmptyAndJavaDocWithInvalidCodePreserved() { doTest(); }