diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticConstantFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticConstantFix.java index 407cb8ad7ae5..ea0361fca416 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticConstantFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticConstantFix.java @@ -2,6 +2,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.hint.QuestionAction; import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo; import com.intellij.java.JavaBundle; import com.intellij.openapi.command.WriteCommandAction; @@ -37,10 +38,10 @@ public class QualifyStaticConstantFix extends StaticImportConstantFix { @NotNull @Override - protected StaticImportMethodQuestionAction createQuestionAction(@NotNull List fieldsToImport, - @NotNull Project project, - Editor editor) { - return new StaticImportMethodQuestionAction<>(project, editor, fieldsToImport, myRef) { + protected QuestionAction createQuestionAction(@NotNull List fieldsToImport, + @NotNull Project project, + Editor editor) { + return new StaticImportMemberQuestionAction(project, editor, fieldsToImport, myRef) { @NotNull @Override protected String getPopupTitle() { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticMethodCallFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticMethodCallFix.java index bc387586e07f..3dcefed90017 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticMethodCallFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyStaticMethodCallFix.java @@ -1,6 +1,7 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInsight.daemon.impl.quickfix; +import com.intellij.codeInsight.hint.QuestionAction; import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo; import com.intellij.java.JavaBundle; import com.intellij.openapi.command.WriteCommandAction; @@ -25,10 +26,10 @@ public class QualifyStaticMethodCallFix extends StaticImportMethodFix { @NotNull @Override - protected StaticImportMethodQuestionAction createQuestionAction(@NotNull List methodsToImport, - @NotNull Project project, - Editor editor) { - return new StaticImportMethodQuestionAction<>(project, editor, methodsToImport, myRef) { + protected QuestionAction createQuestionAction(@NotNull List methodsToImport, + @NotNull Project project, + Editor editor) { + return new StaticImportMemberQuestionAction(project, editor, methodsToImport, myRef) { @Override protected void doImport(@NotNull PsiMethod toImport) { PsiMethodCallExpression element = myRef.getElement(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportConstantFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportConstantFix.java index 3aeafb6e30a7..3d7dc1742284 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportConstantFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportConstantFix.java @@ -2,6 +2,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.hint.QuestionAction; import com.intellij.codeInsight.intention.HighPriorityAction; import com.intellij.codeInsight.intention.impl.AddSingleMemberStaticImportAction; import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo; @@ -70,8 +71,8 @@ public class StaticImportConstantFix extends StaticImportMemberFix createQuestionAction(@NotNull List methodsToImport, @NotNull Project project, Editor editor) { - return new StaticImportMethodQuestionAction<>(project, editor, methodsToImport, myRef) { + protected QuestionAction createQuestionAction(@NotNull List methodsToImport, @NotNull Project project, Editor editor) { + return new StaticImportMemberQuestionAction(project, editor, methodsToImport, myRef) { @NotNull @Override protected String getPopupTitle() { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberFix.java index c6c109918371..c7dce7f4ce19 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberFix.java @@ -17,6 +17,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NlsSafe; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; +import com.intellij.psi.util.PsiModificationTracker; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; @@ -31,8 +32,8 @@ abstract class StaticImportMemberFix private final List> myApplicableCandidates; private final List candidates; protected final SmartPsiElementPointer myRef; + private final long myPsiModificationCount; - @SuppressWarnings("AbstractMethodCallInConstructor") StaticImportMemberFix(@NotNull PsiFile file, @NotNull R reference) { Project project = file.getProject(); myRef = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(reference); @@ -41,6 +42,7 @@ abstract class StaticImportMemberFix candidates = applicableCandidates.isEmpty() ? getMembersToImport(false, 2) : applicableCandidates; myApplicableCandidates = ContainerUtil.map(applicableCandidates, SmartPointerManager::createPointer); + myPsiModificationCount = PsiModificationTracker.getInstance(project).getModificationCount(); } @NotNull @@ -87,6 +89,11 @@ abstract class StaticImportMemberFix ; } + private boolean isPsiModificationStampChanged(@NotNull Project project) { + long currentPsiModificationCount = PsiModificationTracker.getInstance(project).getModificationCount(); + return currentPsiModificationCount != myPsiModificationCount; + } + @NotNull abstract List getMembersToImport(boolean applicableOnly, int maxResults); @@ -117,40 +124,6 @@ abstract class StaticImportMemberFix }); } - @NotNull - private ImportClassFixBase.Result doFix(@NotNull Editor editor) { - if (!CodeInsightSettings.getInstance().ADD_MEMBER_IMPORTS_ON_THE_FLY) { - return ImportClassFixBase.Result.POPUP_NOT_SHOWN; - } - List candidates = ContainerUtil.mapNotNull(myApplicableCandidates, SmartPsiElementPointer::getElement); - if (candidates.isEmpty()) { - return ImportClassFixBase.Result.POPUP_NOT_SHOWN; - } - - PsiElement element = getElement(); - if (element == null) { - return ImportClassFixBase.Result.POPUP_NOT_SHOWN; - } - - if (toAddStaticImports() && - candidates.size() == 1 && - PsiTreeUtil.isAncestor(element.getContainingFile(), candidates.get(0), true)) { - return ImportClassFixBase.Result.POPUP_NOT_SHOWN; - } - - QuestionAction action = createQuestionAction(candidates, element.getProject(), editor); - String hintText = ShowAutoImportPass.getMessage(candidates.size() > 1, getMemberPresentableText(candidates.get(0))); - if (!ApplicationManager.getApplication().isHeadlessEnvironment() - && !HintManager.getInstance().hasShownHintsThatWillHideByOtherHint(true)) { - TextRange textRange = element.getTextRange(); - HintManager.getInstance().showQuestionHint(editor, hintText, - textRange.getStartOffset(), - textRange.getEndOffset(), action); - } - return ImportClassFixBase.Result.POPUP_SHOWN; - } - - @Override public boolean startInWriteAction() { @@ -160,11 +133,34 @@ abstract class StaticImportMemberFix @Override public boolean showHint(@NotNull Editor editor) { PsiElement callExpression = getElement(); - if (callExpression == null || - getQualifierExpression() != null) { + if (callExpression == null || getQualifierExpression() != null) { return false; } - ImportClassFixBase.Result result = doFix(editor); - return result == ImportClassFixBase.Result.POPUP_SHOWN || result == ImportClassFixBase.Result.CLASS_AUTO_IMPORTED; + if (!CodeInsightSettings.getInstance().ADD_MEMBER_IMPORTS_ON_THE_FLY) { + return false; + } + List candidates = ContainerUtil.mapNotNull(myApplicableCandidates, SmartPsiElementPointer::getElement); + if (candidates.isEmpty()) { + return false; + } + + T firstCandidate = candidates.get(0); + PsiFile containingFile = callExpression.getContainingFile(); + if (!toAddStaticImports() || + candidates.size() != 1 || + !PsiTreeUtil.isAncestor(containingFile, firstCandidate, true)) { + if (!ApplicationManager.getApplication().isHeadlessEnvironment() + && !HintManager.getInstance().hasShownHintsThatWillHideByOtherHint(true)) { + TextRange textRange = callExpression.getTextRange(); + QuestionAction action = createQuestionAction(candidates, containingFile.getProject(), editor); + String hintText = ShowAutoImportPass.getMessage(candidates.size() > 1, getMemberPresentableText(firstCandidate)); + HintManager.getInstance().showQuestionHint(editor, hintText, + textRange.getStartOffset(), + textRange.getEndOffset(), action); + } + return true; + } + + return false; } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberQuestionAction.java similarity index 97% rename from java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java rename to java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberQuestionAction.java index 7baa131c4f2f..d010503b136d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMemberQuestionAction.java @@ -31,14 +31,14 @@ import javax.swing.*; import java.awt.*; import java.util.List; -public class StaticImportMethodQuestionAction implements QuestionAction { - private static final Logger LOG = Logger.getInstance(StaticImportMethodQuestionAction.class); +class StaticImportMemberQuestionAction implements QuestionAction { + private static final Logger LOG = Logger.getInstance(StaticImportMemberQuestionAction.class); private final Project myProject; private final Editor myEditor; private final List myCandidates; private final SmartPsiElementPointer myRef; - StaticImportMethodQuestionAction(@NotNull Project project, + StaticImportMemberQuestionAction(@NotNull Project project, Editor editor, @NotNull List candidates, @NotNull SmartPsiElementPointer ref) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java index a09dca0c1dba..91bcdd19170b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodFix.java @@ -2,6 +2,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.hint.QuestionAction; import com.intellij.codeInsight.intention.impl.AddSingleMemberStaticImportAction; import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo; import com.intellij.openapi.editor.Editor; @@ -64,8 +65,8 @@ public class StaticImportMethodFix extends StaticImportMemberFix createQuestionAction(@NotNull List methodsToImport, @NotNull Project project, Editor editor) { - return new StaticImportMethodQuestionAction<>(project, editor, methodsToImport, myRef); + protected QuestionAction createQuestionAction(@NotNull List methodsToImport, @NotNull Project project, Editor editor) { + return new StaticImportMemberQuestionAction<>(project, editor, methodsToImport, myRef); } @Nullable