mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[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:
committed by
intellij-monorepo-bot
parent
0fd0502ebc
commit
c16bd2b684
+54
-11
@@ -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;
|
||||
}
|
||||
|
||||
+33
-1
@@ -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"));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user