[NI] CST: add preemptive recursion detection

For single super type constructor create star projection argument when types for that argument are equal to the original types.
Captured star projections are replaced with their corresponding supertypes during this check.
Skip check for `in` parameters, for which recursive cst calculation does not happen.
Adjust constant in fallback recursion condition.

^KT-38544 Fixed
This commit is contained in:
Pavel Kirpichenkov
2020-04-29 20:35:24 +03:00
parent 7cde9b4355
commit 003ba1c8f5
44 changed files with 1505 additions and 59 deletions
@@ -10226,11 +10226,6 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
runTest("compiler/testData/diagnostics/tests/inference/possibleCycleOnConstraints.kt");
}
@TestMetadata("recursiveTypes.kt")
public void testRecursiveTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes.kt");
}
@TestMetadata("reportAboutUnresolvedReferenceAsUnresolved.kt")
public void testReportAboutUnresolvedReferenceAsUnresolved() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/reportAboutUnresolvedReferenceAsUnresolved.kt");
@@ -11269,6 +11264,79 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
}
}
@TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class RecursiveTypes extends AbstractFirOldFrontendDiagnosticsTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInRecursiveTypes() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
}
@TestMetadata("multirecursion.kt")
public void testMultirecursion() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/multirecursion.kt");
}
@TestMetadata("recursiveInIn.kt")
public void testRecursiveInIn() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveInIn.kt");
}
@TestMetadata("recursiveInInv.kt")
public void testRecursiveInInv() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveInInv.kt");
}
@TestMetadata("recursiveInOut.kt")
public void testRecursiveInOut() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveInOut.kt");
}
@TestMetadata("recursiveInvIn.kt")
public void testRecursiveInvIn() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveInvIn.kt");
}
@TestMetadata("recursiveInvOut.kt")
public void testRecursiveInvOut() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveInvOut.kt");
}
@TestMetadata("recursiveOutIn.kt")
public void testRecursiveOutIn() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveOutIn.kt");
}
@TestMetadata("recursiveOutInv.kt")
public void testRecursiveOutInv() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveOutInv.kt");
}
@TestMetadata("recursiveOutOut.kt")
public void testRecursiveOutOut() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveOutOut.kt");
}
@TestMetadata("recursiveTypeWithNonStarResult.kt")
public void testRecursiveTypeWithNonStarResult() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveTypeWithNonStarResult.kt");
}
@TestMetadata("recursiveTypes.kt")
public void testRecursiveTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/recursiveTypes.kt");
}
@TestMetadata("twoTypeConstructors.kt")
public void testTwoTypeConstructors() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/twoTypeConstructors.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/inference/regressions")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -1931,6 +1931,11 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt4975.kt");
}
@TestMetadata("recursiveFlexibleAssertions.kt")
public void testRecursiveFlexibleAssertions() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/recursiveFlexibleAssertions.kt");
}
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)