PY-77891 "Unused import" inspection is inconsistent in nightly

The logic for disabling the unused warning on unresolved imports was dependent on the visit order. Moving sustracting unresolved imports to the end of computation fixes the problem.


(cherry picked from commit adeb85e59c17261a5bf9f64dfb4a7836a2403f43)

IJ-CR-153189

GitOrigin-RevId: fac4173a0fac5b29be9301f9d5f04fed08cceff1
This commit is contained in:
Andrey Vokin
2025-01-14 22:29:14 +01:00
committed by intellij-monorepo-bot
parent 42ba97ccd8
commit db6d06207c
3 changed files with 27 additions and 2 deletions

View File

@@ -67,6 +67,7 @@ public abstract class PyUnresolvedReferencesVisitor extends PyInspectionVisitor
private final Set<PyImportedNameDefiner> myAllImports = Collections.synchronizedSet(new HashSet<>());
private final Set<PyImportedNameDefiner> myImportsInsideGuard = Collections.synchronizedSet(new HashSet<>());
private final Set<PyImportedNameDefiner> myUsedImports = Collections.synchronizedSet(new HashSet<>());
private final Set<PyImportedNameDefiner> myUnresolvedImports = Collections.synchronizedSet(new HashSet<>());
private final ImmutableSet<String> myIgnoredIdentifiers;
private final PyInspection myInspection;
private volatile Boolean myIsEnabled = null;
@@ -226,8 +227,8 @@ public abstract class PyUnresolvedReferencesVisitor extends PyInspectionVisitor
registerUnresolvedReferenceProblem(node, reference, severity);
}
// don't highlight unresolved imports as unused
if (node.getParent() instanceof PyImportElement) {
myAllImports.remove(node.getParent());
if (node.getParent() instanceof PyImportElement importElement) {
myUnresolvedImports.add(importElement);
}
}
else if (reference instanceof PyImportReference &&
@@ -605,6 +606,7 @@ public abstract class PyUnresolvedReferencesVisitor extends PyInspectionVisitor
Set<PyImportedNameDefiner> unusedImports = new HashSet<>(getAllImports());
unusedImports.removeAll(getUsedImports());
unusedImports.removeAll(myUnresolvedImports);
// Remove those unsed, that are reported to be skipped by extension points
final Set<PyImportedNameDefiner> unusedImportToSkip = new HashSet<>();

View File

@@ -0,0 +1,4 @@
import <error descr="No module named 'unresolved1'">unresolved1</error>
import <error descr="No module named 'unresolved2'">unresolved2</error>
import <error descr="No module named 'unresolved3'">unresolved3</error>
<warning descr="Unused import statement 'import os'">import os</warning>

View File

@@ -37,6 +37,25 @@ public class PyUnusedImportTest extends PyTestCase {
doTest("test1.py");
}
public void testUnresolvedModule() {
doTest("test.py");
//myFixture.configureByText("test.py", """
// <warning descr="Unused import statement 'import unresolved1'">import <error descr="No module named 'unresolved1'">unresolved1</error></warning>
// <warning descr="Unused import statement 'import unresolved2'">import <error descr="No module named 'unresolved2'">unresolved2</error></warning>
// <warning descr="Unused import statement 'import unresolved3'">import <error descr="No module named 'unresolved3'">unresolved3</error></warning>
// """);
//myFixture.enableInspections(PyUnresolvedReferencesInspection.class);
//
//
//final ExpectedHighlightingData data = new ExpectedHighlightingData(myFixture.getEditor().getDocument(), true, true, false);
//data.init();
//
//myFixture.type("\n");
//myFixture.type("\b");
//
//((CodeInsightTestFixtureImpl)myFixture).collectAndCheckHighlighting(data);
}
//PY-20075
public void testMultipleSubmodules() {
doTest("test1.py");