[java-inspections] IDEA-340624 Optimize imports quick fixes do nothing

- use not-on-the-fly

GitOrigin-RevId: 31272bd0a4670ddd80aae4fdbe756010cf14ac47
This commit is contained in:
Mikhail Pyltsin
2025-01-14 13:39:22 +00:00
committed by intellij-monorepo-bot
parent a93a03b864
commit 839cb86f9d
7 changed files with 46 additions and 13 deletions
@@ -279,7 +279,7 @@ public abstract class QuickFixFactory {
public abstract @NotNull IntentionAction createCreateAnnotationMethodFromUsageFix(@NotNull PsiNameValuePair pair);
public abstract @NotNull IntentionAction createOptimizeImportsFix(boolean onTheFly, @NotNull PsiFile file);
public abstract @NotNull IntentionAction createOptimizeImportsFix(boolean fixOnTheFly, @NotNull PsiFile file);
public abstract @NotNull IntentionAction createSafeDeleteUnusedParameterInHierarchyFix(@NotNull PsiParameter parameter, boolean excludingHierarchy);
@@ -39,7 +39,7 @@ class UnusedImportsVisitor extends JavaElementVisitor {
private final @NotNull Project myProject;
private final PsiFile myFile;
private final @NotNull Document myDocument;
private IntentionAction myOptimizeImportsFix; // when not null, there are not-optimized imports in the file
private boolean requiresFix = false;
private int myCurrentEntryIndex = -1;
private boolean errorFound;
@@ -71,15 +71,17 @@ class UnusedImportsVisitor extends JavaElementVisitor {
FileStatusMap fileStatusMap = daemonCodeAnalyzer.getFileStatusMap();
fileStatusMap.setErrorFoundFlag(myProject, myDocument, true);
}
IntentionAction fix = myOptimizeImportsFix;
if (fix != null) {
IntentionAction fixNotOnFly = null;
if (requiresFix) {
IntentionAction fix = QuickFixFactory.getInstance().createOptimizeImportsFix(true, myFile);
OptimizeImportRestarter.getInstance(myProject).scheduleOnDaemonFinish(myFile, fix);
fixNotOnFly = QuickFixFactory.getInstance().createOptimizeImportsFix(false, myFile);
}
HighlightDisplayKey misSortedKey = HighlightDisplayKey.find(MissortedImportsInspection.SHORT_NAME);
if (misSortedKey != null && isToolEnabled(misSortedKey) && fix != null && importList != null) {
if (misSortedKey != null && isToolEnabled(misSortedKey) && fixNotOnFly != null && importList != null) {
holder.add(HighlightInfo.newHighlightInfo(JavaHighlightInfoTypes.MISSORTED_IMPORTS)
.range(importList)
.registerFix(fix, null, HighlightDisplayKey.getDisplayNameByKey(misSortedKey), null, misSortedKey)
.registerFix(fixNotOnFly, null, HighlightDisplayKey.getDisplayNameByKey(misSortedKey), null, misSortedKey)
.create());
}
}
@@ -134,9 +136,9 @@ class UnusedImportsVisitor extends JavaElementVisitor {
}
int entryIndex = JavaCodeStyleManager.getInstance(myProject).findEntryIndex(importStatement);
if (entryIndex < myCurrentEntryIndex && myOptimizeImportsFix == null) {
if (entryIndex < myCurrentEntryIndex && !requiresFix) {
// mis-sorted imports found
myOptimizeImportsFix = QuickFixFactory.getInstance().createOptimizeImportsFix(true, myFile);
requiresFix = true;
}
myCurrentEntryIndex = entryIndex;
}
@@ -196,8 +198,8 @@ class UnusedImportsVisitor extends JavaElementVisitor {
IntentionAction switchFix = QuickFixFactory.getInstance().createEnableOptimizeImportsOnTheFlyFix();
builder.registerFix(switchFix, null, HighlightDisplayKey.getDisplayNameByKey(unusedImportKey), null, unusedImportKey);
if (!predefinedImport && myOptimizeImportsFix == null) {
myOptimizeImportsFix = QuickFixFactory.getInstance().createOptimizeImportsFix(true, myFile);
if (!predefinedImport && !requiresFix) {
requiresFix = true;
}
addInfo(holder, builder);
}
@@ -52,7 +52,7 @@ public final class MissortedImportsInspection extends GlobalSimpleInspectionTool
int entryIndex = JavaCodeStyleManager.getInstance(javaFile.getProject()).findEntryIndex(importStatement);
if (entryIndex < currentEntryIndex) {
// mis-sorted import found
IntentionAction fix = QuickFixFactory.getInstance().createOptimizeImportsFix(true, javaFile);
IntentionAction fix = QuickFixFactory.getInstance().createOptimizeImportsFix(false, javaFile);
problemsHolder.registerProblem(importList, getDisplayNameText(), new IntentionWrapper(fix));
return;
}
@@ -591,11 +591,11 @@ public final class QuickFixFactoryImpl extends QuickFixFactory {
}
@Override
public @NotNull IntentionAction createOptimizeImportsFix(final boolean onTheFly, @NotNull PsiFile file) {
public @NotNull IntentionAction createOptimizeImportsFix(final boolean fixOnTheFly, @NotNull PsiFile file) {
ApplicationManager.getApplication().assertIsNonDispatchThread();
VirtualFile virtualFile = file.getVirtualFile();
boolean isInContent = virtualFile != null && (ModuleUtilCore.projectContainsFile(file.getProject(), virtualFile, false) || ScratchUtil.isScratch(virtualFile));
return new OptimizeImportsFix(onTheFly, isInContent, virtualFile == null ? ThreeState.UNSURE : SilentChangeVetoer.extensionsAllowToChangeFileSilently(file.getProject(), virtualFile));
return new OptimizeImportsFix(fixOnTheFly, isInContent, virtualFile == null ? ThreeState.UNSURE : SilentChangeVetoer.extensionsAllowToChangeFileSilently(file.getProject(), virtualFile));
}
private static final class OptimizeImportsFix implements IntentionAction {
@@ -0,0 +1,11 @@
import java.util.List;
import java.util.ArrayList;
<warning descr="Unused import statement">import java.util.Map;</warning>
<warning descr="Unused import statement">import java.util.Set;</warning>
class MissortedImports{
public static void main(String[] <warning descr="Parameter 'args' is never used">args</warning>) {
List<String> a = new ArrayList<>();
System.out.println(a);
}
}
@@ -0,0 +1,9 @@
<caret>import java.util.ArrayList;
import java.util.List;
class MissortedImports{
public static void main(String[] args) {
List<String> a = new ArrayList<>();
System.out.println(a);
}
}
@@ -5,9 +5,11 @@ import com.intellij.application.options.CodeStyle;
import com.intellij.application.options.codeStyle.excludedFiles.NamedScopeDescriptor;
import com.intellij.codeInsight.CodeInsightWorkspaceSettings;
import com.intellij.codeInsight.daemon.JavaErrorBundle;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.intention.QuickFixFactory;
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
import com.intellij.codeInspection.unusedImport.MissortedImportsInspection;
import com.intellij.codeInspection.unusedImport.UnusedImportInspection;
import com.intellij.formatting.MockCodeStyleSettingsModifier;
import com.intellij.ide.scratch.ScratchFileService;
@@ -443,6 +445,15 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase {
assertNotEmpty(myFixture.doHighlighting(HighlightSeverity.ERROR));
}
public void testOptimizeImportNotOnTheFly() {
myFixture.enableInspections(new MissortedImportsInspection(), new UnusedImportInspection());
myFixture.testHighlighting(getTestName(false) + ".java");
IntentionAction intention = myFixture.findSingleIntention(QuickFixBundle.message("optimize.imports.fix"));
assertNotNull(intention);
myFixture.launchAction(intention);
myFixture.checkResultByFile(getTestName(false) + "_after.java");
}
public void testRemovingAllUnusedImports() throws Exception {
myFixture.enableInspections(new UnusedImportInspection());
myFixture.configureByText("a.java", """