Extended loop data flow analysis was implemented. #KT-6283 Fixed. #KT-6284 Fixed.

A local descendant of JetTypeInfo added to save separately current data flow info and jump point data flow info together with jump opportunity.
Now data flow analysis know about loop bodies that must be executed at least once (do...while, while(true) until the first break/continue).
A set of tests for smart casts in and after loops.
Existing DoWhile and WhileTrue resolve tests corrected in accordance.
This commit is contained in:
Mikhail Glukhikh
2015-04-06 17:52:37 +03:00
parent bb808b5620
commit 8184bccda1
73 changed files with 850 additions and 24 deletions
@@ -11016,6 +11016,207 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
}
}
@TestMetadata("compiler/testData/diagnostics/tests/smartCasts/loops")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Loops extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInLoops() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/smartCasts/loops"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("doWhile.kt")
public void testDoWhile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhile.kt");
doTest(fileName);
}
@TestMetadata("doWhileBreak.kt")
public void testDoWhileBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileBreak.kt");
doTest(fileName);
}
@TestMetadata("doWhileContinue.kt")
public void testDoWhileContinue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileContinue.kt");
doTest(fileName);
}
@TestMetadata("doWhileEarlyBreak.kt")
public void testDoWhileEarlyBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileEarlyBreak.kt");
doTest(fileName);
}
@TestMetadata("doWhileEarlyContinue.kt")
public void testDoWhileEarlyContinue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileEarlyContinue.kt");
doTest(fileName);
}
@TestMetadata("doWhileInCondition.kt")
public void testDoWhileInCondition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileInCondition.kt");
doTest(fileName);
}
@TestMetadata("doWhileInConditionWithBreak.kt")
public void testDoWhileInConditionWithBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileInConditionWithBreak.kt");
doTest(fileName);
}
@TestMetadata("doWhileLiteral.kt")
public void testDoWhileLiteral() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileLiteral.kt");
doTest(fileName);
}
@TestMetadata("doWhileNotNullBreak.kt")
public void testDoWhileNotNullBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileNotNullBreak.kt");
doTest(fileName);
}
@TestMetadata("doWhileNull.kt")
public void testDoWhileNull() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileNull.kt");
doTest(fileName);
}
@TestMetadata("doWhileNullWithBreak.kt")
public void testDoWhileNullWithBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/doWhileNullWithBreak.kt");
doTest(fileName);
}
@TestMetadata("ifBlockInsideDoWhile.kt")
public void testIfBlockInsideDoWhile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/ifBlockInsideDoWhile.kt");
doTest(fileName);
}
@TestMetadata("ifElseBlockInsideDoWhile.kt")
public void testIfElseBlockInsideDoWhile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/ifElseBlockInsideDoWhile.kt");
doTest(fileName);
}
@TestMetadata("ifInsideDoWhile.kt")
public void testIfInsideDoWhile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/ifInsideDoWhile.kt");
doTest(fileName);
}
@TestMetadata("nestedDoWhile.kt")
public void testNestedDoWhile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedDoWhile.kt");
doTest(fileName);
}
@TestMetadata("nestedDoWhileWithLongContinue.kt")
public void testNestedDoWhileWithLongContinue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedDoWhileWithLongContinue.kt");
doTest(fileName);
}
@TestMetadata("nestedLoops.kt")
public void testNestedLoops() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedLoops.kt");
doTest(fileName);
}
@TestMetadata("nestedLoopsShort.kt")
public void testNestedLoopsShort() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedLoopsShort.kt");
doTest(fileName);
}
@TestMetadata("nestedLoopsWithBreak.kt")
public void testNestedLoopsWithBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedLoopsWithBreak.kt");
doTest(fileName);
}
@TestMetadata("nestedLoopsWithLongBreak.kt")
public void testNestedLoopsWithLongBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedLoopsWithLongBreak.kt");
doTest(fileName);
}
@TestMetadata("nestedLoopsWithLongContinue.kt")
public void testNestedLoopsWithLongContinue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/nestedLoopsWithLongContinue.kt");
doTest(fileName);
}
@TestMetadata("useInsideDoWhile.kt")
public void testUseInsideDoWhile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/useInsideDoWhile.kt");
doTest(fileName);
}
@TestMetadata("whileInCondition.kt")
public void testWhileInCondition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileInCondition.kt");
doTest(fileName);
}
@TestMetadata("whileInConditionWithBreak.kt")
public void testWhileInConditionWithBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileInConditionWithBreak.kt");
doTest(fileName);
}
@TestMetadata("whileNull.kt")
public void testWhileNull() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileNull.kt");
doTest(fileName);
}
@TestMetadata("whileNullWithBreak.kt")
public void testWhileNullWithBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileNullWithBreak.kt");
doTest(fileName);
}
@TestMetadata("whileSimple.kt")
public void testWhileSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileSimple.kt");
doTest(fileName);
}
@TestMetadata("whileTrivial.kt")
public void testWhileTrivial() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileTrivial.kt");
doTest(fileName);
}
@TestMetadata("whileTrue.kt")
public void testWhileTrue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileTrue.kt");
doTest(fileName);
}
@TestMetadata("whileTrueBreakReturn.kt")
public void testWhileTrueBreakReturn() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileTrueBreakReturn.kt");
doTest(fileName);
}
@TestMetadata("whileTrueEarlyBreak.kt")
public void testWhileTrueEarlyBreak() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileTrueEarlyBreak.kt");
doTest(fileName);
}
@TestMetadata("whileTrueReturn.kt")
public void testWhileTrueReturn() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/loops/whileTrueReturn.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/diagnostics/tests/smartCasts/safecalls")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)