[java-imports] IJ-CR-153077 IDEA-13817 Create "favorites" for static import and completion

- add intentions for calls

GitOrigin-RevId: 4f1156021408865461869794cd1f531480f1ca95
This commit is contained in:
Mikhail Pyltsin
2025-01-30 17:20:16 +00:00
committed by intellij-monorepo-bot
parent 0fd0502ebc
commit c16bd2b684
2 changed files with 87 additions and 12 deletions
@@ -2,20 +2,21 @@
package com.intellij.codeInsight.intention.impl;
import com.intellij.java.JavaBundle;
import com.intellij.lang.jvm.JvmModifier;
import com.intellij.modcommand.ActionContext;
import com.intellij.modcommand.ModCommand;
import com.intellij.modcommand.Presentation;
import com.intellij.modcommand.PsiBasedModCommandAction;
import com.intellij.psi.PsiImportStaticStatement;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedModCommandAction<PsiImportStaticStatement> {
public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedModCommandAction<PsiElement> {
private AddOnDemandStaticImportToAutoImportAction() {
super(PsiImportStaticStatement.class);
super(PsiElement.class);
}
@Override
@@ -24,14 +25,14 @@ public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedMod
}
@Override
protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiImportStaticStatement element) {
protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiElement element) {
String nameToImport = getNameToImport(element);
if (nameToImport == null) return null;
return Presentation.of(JavaBundle.message("intention.add.on.demand.static.import.to.auto.import.text", nameToImport));
}
@Override
protected @NotNull ModCommand perform(@NotNull ActionContext context, @NotNull PsiImportStaticStatement element) {
protected @NotNull ModCommand perform(@NotNull ActionContext context, @NotNull PsiElement element) {
String nameToImport = getNameToImport(element);
if (nameToImport == null) return ModCommand.nop();
return ModCommand.updateOptionList(context.file(), "JavaProjectCodeInsightSettings.includedAutoStaticNames",
@@ -39,11 +40,53 @@ public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedMod
}
@Nullable
private static String getNameToImport(@NotNull PsiImportStaticStatement element) {
if (!element.isOnDemand()) return null;
PsiJavaCodeReferenceElement importReference = element.getImportReference();
if (importReference == null) return null;
String name = importReference.getCanonicalText();
private static String getNameToImport(@NotNull PsiElement element) {
String name = null;
PsiImportStaticStatement statement = PsiTreeUtil.getParentOfType(element, PsiImportStaticStatement.class);
if (statement != null && statement.isOnDemand()) {
PsiJavaCodeReferenceElement importReference = statement.getImportReference();
if (importReference == null) return null;
name = importReference.getCanonicalText();
}
if (element.getParent() instanceof PsiReferenceExpression referenceExpression &&
referenceExpression.getParent() instanceof PsiMethodCallExpression methodCallExpression) {
PsiFile file = element.getContainingFile();
if (!(file instanceof PsiJavaFile javaFile)) return null;
PsiImportList importList = javaFile.getImportList();
if (importList == null) return null;
PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression();
if (!(methodExpression.resolve() instanceof PsiMethod method)) {
return null;
}
if (!method.hasModifier(JvmModifier.STATIC)) {
return null;
}
PsiExpression qualifier = methodExpression.getQualifierExpression();
if (qualifier == null) {
PsiClass containingClass = method.getContainingClass();
if (containingClass == null) return null;
String classQualifiedName = containingClass.getQualifiedName();
if (classQualifiedName == null) {
return null;
}
for (PsiImportStaticStatement staticStatement : importList.getImportStaticStatements()) {
PsiJavaCodeReferenceElement importReference = staticStatement.getImportReference();
if (importReference == null) continue;
if (staticStatement.isOnDemand() &&
classQualifiedName.equals(importReference.getQualifiedName())) {
name = classQualifiedName;
break;
}
if (!staticStatement.isOnDemand() &&
(classQualifiedName + "." + methodExpression.getReferenceName()).equals(importReference.getQualifiedName())) {
name = classQualifiedName;
break;
}
}
}
}
if (name == null) return null;
if (JavaCodeStyleManager.getInstance(element.getProject()).isStaticAutoImportClass(name)) return null;
return name;
}
@@ -18,9 +18,41 @@ public class AddOnDemandStaticImportToAutoImportActionTest extends LightJavaCode
}
public void testAddedDefault() {
doTest(() -> {
myFixture.configureByText("a.java", """
import static java.util.Objects.*<caret>;
""");
assertTrue(tryToAddToAutoImport("java.util.Objects"));
assertTrue(tableContains("java.util.Objects"));
});
}
public void testAddFromCallOnDemand() {
doTest(() -> {
myFixture.configureByText("a.java", """
import static java.util.Objects.*;
public class Favorite {
public static void a() {
require<caret>NonNull("a");
}
}
""");
assertTrue(tryToAddToAutoImport("java.util.Objects"));
assertTrue(tableContains("java.util.Objects"));
});
}
public void testAddFromCall() {
doTest(() -> {
myFixture.configureByText("a.java", """
import static java.util.Objects.requireNonNull;
public class Favorite {
public static void a() {
requireNon<caret>Null("a");
}
}
""");
assertTrue(tryToAddToAutoImport("java.util.Objects"));
assertTrue(tableContains("java.util.Objects"));
@@ -33,7 +65,7 @@ public class AddOnDemandStaticImportToAutoImportActionTest extends LightJavaCode
JavaProjectCodeInsightSettings codeInsightSettings = JavaProjectCodeInsightSettings.getSettings(getProject());
codeInsightSettings.includedAutoStaticNames = List.of("java.util.Objects");
myFixture.configureByText("a.java", """
import static java.util.Objects.*;
import static java.util.Objects.*<caret>;
""");
assertFalse(tryToAddToAutoImport("java.util.Objects"));
});