diff --git a/python/src/com/jetbrains/python/psi/PyBreakStatement.java b/python/src/com/jetbrains/python/psi/PyBreakStatement.java index fa1153a08c4b..bd00ea2c053a 100644 --- a/python/src/com/jetbrains/python/psi/PyBreakStatement.java +++ b/python/src/com/jetbrains/python/psi/PyBreakStatement.java @@ -16,6 +16,8 @@ package com.jetbrains.python.psi; +import org.jetbrains.annotations.Nullable; + /** * Created by IntelliJ IDEA. * User: yole @@ -24,4 +26,6 @@ package com.jetbrains.python.psi; * To change this template use File | Settings | File Templates. */ public interface PyBreakStatement extends PyStatement { + @Nullable + PyLoopStatement getLoopStatement(); } diff --git a/python/src/com/jetbrains/python/psi/PyContinueStatement.java b/python/src/com/jetbrains/python/psi/PyContinueStatement.java index 2dede0cedf35..4e3b8fc467d0 100644 --- a/python/src/com/jetbrains/python/psi/PyContinueStatement.java +++ b/python/src/com/jetbrains/python/psi/PyContinueStatement.java @@ -16,6 +16,8 @@ package com.jetbrains.python.psi; +import org.jetbrains.annotations.Nullable; + /** * Created by IntelliJ IDEA. * User: yole @@ -24,4 +26,6 @@ package com.jetbrains.python.psi; * To change this template use File | Settings | File Templates. */ public interface PyContinueStatement extends PyStatement { + @Nullable + PyLoopStatement getLoop(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyBreakStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyBreakStatementImpl.java index fa18f080fbdb..5ed6e5dcd7c8 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyBreakStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyBreakStatementImpl.java @@ -17,8 +17,11 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; +import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.psi.PyBreakStatement; import com.jetbrains.python.psi.PyElementVisitor; +import com.jetbrains.python.psi.PyLoopStatement; +import org.jetbrains.annotations.Nullable; /** * Created by IntelliJ IDEA. @@ -28,11 +31,17 @@ import com.jetbrains.python.psi.PyElementVisitor; * To change this template use File | Settings | File Templates. */ public class PyBreakStatementImpl extends PyElementImpl implements PyBreakStatement { - public PyBreakStatementImpl(ASTNode astNode) { - super(astNode); - } + public PyBreakStatementImpl(ASTNode astNode) { + super(astNode); + } - @Override protected void acceptPyVisitor(PyElementVisitor pyVisitor) { - pyVisitor.visitPyBreakStatement(this); - } + @Override + protected void acceptPyVisitor(PyElementVisitor pyVisitor) { + pyVisitor.visitPyBreakStatement(this); + } + + @Nullable + public PyLoopStatement getLoopStatement() { + return PsiTreeUtil.getParentOfType(this, PyLoopStatement.class); + } } diff --git a/python/src/com/jetbrains/python/psi/impl/PyContinueStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyContinueStatementImpl.java index ba4030db91b8..a0c48e478990 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyContinueStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyContinueStatementImpl.java @@ -17,8 +17,11 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; +import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.psi.PyContinueStatement; import com.jetbrains.python.psi.PyElementVisitor; +import com.jetbrains.python.psi.PyLoopStatement; +import org.jetbrains.annotations.Nullable; /** * Created by IntelliJ IDEA. @@ -35,4 +38,9 @@ public class PyContinueStatementImpl extends PyElementImpl implements PyContinue @Override protected void acceptPyVisitor(PyElementVisitor pyVisitor) { pyVisitor.visitPyContinueStatement(this); } + + @Nullable + public PyLoopStatement getLoop() { + return PsiTreeUtil.getParentOfType(this, PyLoopStatement.class); + } } diff --git a/python/testSrc/com/jetbrains/python/PyControlFlowBuilderTest.java b/python/testSrc/com/jetbrains/python/PyControlFlowBuilderTest.java index 7faafcd556a3..84538f27eff0 100644 --- a/python/testSrc/com/jetbrains/python/PyControlFlowBuilderTest.java +++ b/python/testSrc/com/jetbrains/python/PyControlFlowBuilderTest.java @@ -20,23 +20,34 @@ public class PyControlFlowBuilderTest extends LightMarkedTestCase { return PythonTestUtil.getTestDataPath() + "/psi/controlflow/"; } - - public void testFile() throws Exception { - check("file.py", "file.txt"); - } - - private void check(final String inputFile, final String outputFile) throws Exception { - configureByFile(inputFile); + private void doTest() throws Exception { + final String testName = getTestName(false).toLowerCase(); + configureByFile(testName + ".py"); final StringBuffer buffer = new StringBuffer(); - final ControlFlow flow = ((PyFile)myFile).getControlFlow(); + final ControlFlow flow = ((PyFile)myFile).getControlFlow(); final Instruction[] instructions = flow.getInstructions(); for (Instruction instruction : instructions) { buffer.append(instruction).append("\n"); } - final String fullPath = getTestDataPath() + outputFile; + final String fullPath = getTestDataPath() + testName + ".txt"; final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(fullPath.replace(File.separatorChar, '/')); final String fileText = StringUtil.convertLineSeparators(VfsUtil.loadText(vFile), "\n"); assertEquals(fileText.trim(), buffer.toString().trim()); } + + public void testFile() throws Exception { + doTest(); + } + + public void testIf() throws Exception { + doTest(); + } + public void testFor() throws Exception { + doTest(); + } + + public void testWhile() throws Exception { + doTest(); + } }