diff --git a/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java b/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java index f03a0ffaa370..a75992c02dea 100644 --- a/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java +++ b/python/src/com/jetbrains/python/codeInsight/controlflow/PyControlFlowBuilder.java @@ -28,7 +28,6 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor { public static final TokenSet CALL_OR_REF_EXPR = TokenSet.create(PyElementTypes.CALL_EXPRESSION, PyElementTypes.REFERENCE_EXPRESSION); public static final String SELF_ASSERT_RAISES = "self.assertRaises"; private final ControlFlowBuilder myBuilder = new ControlFlowBuilder(); - private List> myPendindBackup = null; public ControlFlow buildControlFlow(@NotNull final ScopeOwner owner) { return myBuilder.build(this, owner); @@ -431,17 +430,20 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor { myBuilder.addPendingEdge(node, myBuilder.prevInstruction); // Process except parts - final ArrayList exceptInstructions = new ArrayList(); - resetPendingBackup(); + final List exceptInstructions = emptyMutableList(); + List> pendingBackup = emptyMutableList(); for (PyExceptPart exceptPart : node.getExceptParts()) { - backupAndClearPending(); + pendingBackup.addAll(myBuilder.pending); + myBuilder.pending = emptyMutableList(); myBuilder.flowAbrupted(); final Instruction exceptInstrcution = myBuilder.startNode(exceptPart); exceptPart.accept(this); myBuilder.addPendingEdge(node, myBuilder.prevInstruction); exceptInstructions.add(exceptInstrcution); } - restorePending(); + for (Pair pair : pendingBackup) { + myBuilder.addPendingEdge(pair.first, pair.second); + } final List normalExits = new ArrayList(); final PyFinallyPart finallyPart = node.getFinallyPart(); @@ -532,12 +534,15 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor { final Instruction finallyInstruction; if (!normalExits.isEmpty()) { // Finally-success part handling - resetPendingBackup(); - backupAndClearPending(); + pendingBackup = emptyMutableList(); + pendingBackup.addAll(myBuilder.pending); + myBuilder.pending = emptyMutableList(); myBuilder.flowAbrupted(); Instruction finallySuccessInstruction = myBuilder.startNode(finallyPart); finallyPart.accept(this); - restorePending(); + for (Pair pair : pendingBackup) { + myBuilder.addPendingEdge(pair.first, pair.second); + } finallyInstruction = finallySuccessInstruction; } else { @@ -551,19 +556,8 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor { } } - private void resetPendingBackup() { - myPendindBackup = new ArrayList>(); - } - - private void backupAndClearPending() { - myPendindBackup.addAll(myBuilder.pending); - myBuilder.pending = new ArrayList>(); - } - - private void restorePending() { - for (Pair pair : myPendindBackup) { - myBuilder.addPendingEdge(pair.first, pair.second); - } + private static List emptyMutableList() { + return new ArrayList(); } @Override diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 1c3c1c77e0e2..da780e35414d 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -41,6 +41,7 @@ import com.jetbrains.python.documentation.DocStringParameterReference; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.impl.PyImportReferenceImpl; +import com.jetbrains.python.psi.impl.PyImportStatementNavigator; import com.jetbrains.python.psi.impl.PyOperatorReferenceImpl; import com.jetbrains.python.psi.resolve.ImportedResolveResult; import com.jetbrains.python.psi.resolve.PyResolveContext; @@ -289,8 +290,12 @@ public class PyUnresolvedReferencesInspection extends PyInspection { myAllImports.remove(node.getParent()); } } - else if (reference instanceof PyImportReferenceImpl && target == reference.getElement().getContainingFile()) { - registerProblem(node, "Import resolves to its containing file"); + else if (reference instanceof PyImportReferenceImpl && + target == reference.getElement().getContainingFile()) { + final boolean insideFromImport = PsiTreeUtil.getParentOfType(node, PyFromImportStatement.class) != null; + if ((insideFromImport && PyImportStatementNavigator.getImportStatementByElement(node) != null) || !insideFromImport) { + registerProblem(node, "Import resolves to its containing file"); + } } }