diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 4899a2cf2ed4..eca77ef60be0 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -23,6 +23,7 @@ import com.jetbrains.python.psi.patterns.Matcher; import com.jetbrains.python.psi.patterns.ParentMatcher; import com.jetbrains.python.psi.patterns.SyntaxMatchers; import com.jetbrains.python.psi.resolve.ImportedResolveResult; +import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.types.*; import com.jetbrains.python.validation.PythonReferenceImporter; import org.jetbrains.annotations.Nls; @@ -349,6 +350,17 @@ public class PyUnresolvedReferencesInspection extends PyInspection { if (PsiTreeUtil.getParentOfType(importStatement, PyTryExceptStatement.class) != null) { continue; } + if (unusedImport instanceof PyImportElement) { + if (ResolveImportUtil.resolveImportElement((PyImportElement)unusedImport) == null) { + continue; + } + } + else { + assert importStatement instanceof PyFromImportStatement; + if (ResolveImportUtil.resolveFromImportStatementSource((PyFromImportStatement)importStatement) == null) { + continue; + } + } if (unusedImport instanceof PyStarImportElement || areAllImportsUnused(importStatement, unusedImports)) { unusedStatements.add(importStatement); result.add(importStatement); diff --git a/python/testData/optimizeImports/oneOfMultiple.py b/python/testData/optimizeImports/oneOfMultiple.py index c54e9fd4ed16..0bd810843447 100644 --- a/python/testData/optimizeImports/oneOfMultiple.py +++ b/python/testData/optimizeImports/oneOfMultiple.py @@ -1,2 +1,2 @@ -import sys, os +import sys, re print sys.argv diff --git a/python/testData/optimizeImports/unresolved.after.py b/python/testData/optimizeImports/unresolved.after.py new file mode 100644 index 000000000000..b014e1fe1183 --- /dev/null +++ b/python/testData/optimizeImports/unresolved.after.py @@ -0,0 +1 @@ +import xyzzy_shazam diff --git a/python/testData/optimizeImports/unresolved.py b/python/testData/optimizeImports/unresolved.py new file mode 100644 index 000000000000..b014e1fe1183 --- /dev/null +++ b/python/testData/optimizeImports/unresolved.py @@ -0,0 +1 @@ +import xyzzy_shazam diff --git a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java index 8b2806c68abd..6344af447554 100644 --- a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java +++ b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java @@ -8,31 +8,35 @@ import com.jetbrains.python.fixtures.PyLightFixtureTestCase; * @author yole */ public class PyOptimizeImportsTest extends PyLightFixtureTestCase { - public void testSimple() throws Exception { + public void testSimple() { doTest(); } - public void testOneOfMultiple() throws Exception { + public void testOneOfMultiple() { doTest(); } - public void testImportStar() throws Exception { + public void testImportStar() { doTest(); } - public void testImportStarOneOfMultiple() throws Exception { + public void testImportStarOneOfMultiple() { doTest(); } - public void testTryExcept() throws Exception { + public void testTryExcept() { doTest(); } - public void testFromFuture() throws Exception { + public void testFromFuture() { doTest(); } - private void doTest() throws Exception { + public void testUnresolved() { // PY-2201 + doTest(); + } + + private void doTest() { myFixture.configureByFile("optimizeImports/" + getTestName(true) + ".py"); OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent())); myFixture.checkResultByFile("optimizeImports/" + getTestName(true) + ".after.py");