[FIR] Fix IAE in TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM

IllegalArgumentException: class
org.jetbrains.kotlin.psi.KtLambdaArgument is not a subtype of class
org.jetbrains.kotlin.psi.KtExpression for factory
TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM
was reported when TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM was
reported on a FirLambdaArgumentExpression, report it on its
`expression` instead.

#KT-60380 Fixed
This commit is contained in:
Kirill Rakhman
2023-08-29 14:33:22 +02:00
committed by Space Team
parent f7352585f4
commit 393a5d6c14
7 changed files with 40 additions and 1 deletions
@@ -1925,6 +1925,12 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/qualifiedSupertypeExtendedByOtherSupertype.kt");
}
@Test
@TestMetadata("recursiveProblemWithSyntaxError.kt")
public void testRecursiveProblemWithSyntaxError() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.kt");
}
@Test
@TestMetadata("redundantModifier.kt")
public void testRedundantModifier() throws Exception {
@@ -1925,6 +1925,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/qualifiedSupertypeExtendedByOtherSupertype.kt");
}
@Test
@TestMetadata("recursiveProblemWithSyntaxError.kt")
public void testRecursiveProblemWithSyntaxError() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.kt");
}
@Test
@TestMetadata("redundantModifier.kt")
public void testRedundantModifier() throws Exception {
@@ -0,0 +1,9 @@
FILE: recursiveProblemWithSyntaxError.kt
public final val foo: <ERROR TYPE REF: Unresolved name: bar> = bar@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: bar> <inline=Unknown> {
^ <Unresolved name: bar>#
}
.R|SubstitutionOverride<kotlin/Function0.invoke: <ERROR TYPE REF: Unresolved name: bar>><Inapplicable(INAPPLICABLE_ARGUMENTS_MAPPING_ERROR): kotlin/Function0.invoke>#|(ERROR_EXPR(Argument is absent)).<Unresolved name: bar>#(<Call has no callee>#(<L> = <Call has no callee>@fun <anonymous>(): <ERROR TYPE REF: cycle> <inline=Unknown> {
^ R|/foo|
}
))
public get(): <ERROR TYPE REF: Unresolved name: bar>
@@ -0,0 +1,3 @@
val foo = { <!UNRESOLVED_REFERENCE!>bar<!> }(
<!SYNTAX!><!SYNTAX!><!>val<!> bar <!SYNTAX!><!SYNTAX!>=<!> <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>{ <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>foo<!> }<!><!>
@@ -1925,6 +1925,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/qualifiedSupertypeExtendedByOtherSupertype.kt");
}
@Test
@TestMetadata("recursiveProblemWithSyntaxError.kt")
public void testRecursiveProblemWithSyntaxError() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.kt");
}
@Test
@TestMetadata("redundantModifier.kt")
public void testRedundantModifier() throws Exception {
@@ -1925,6 +1925,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/qualifiedSupertypeExtendedByOtherSupertype.kt");
}
@Test
@TestMetadata("recursiveProblemWithSyntaxError.kt")
public void testRecursiveProblemWithSyntaxError() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.kt");
}
@Test
@TestMetadata("redundantModifier.kt")
public void testRedundantModifier() throws Exception {
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.psi.KtLambdaArgument
object FirRecursiveProblemChecker : FirBasicExpressionChecker() {
override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -29,7 +31,8 @@ object FirRecursiveProblemChecker : FirBasicExpressionChecker() {
fun checkConeType(coneType: ConeKotlinType?) {
if (coneType is ConeErrorType && (coneType.diagnostic as? ConeSimpleDiagnostic)?.kind == DiagnosticKind.RecursionInImplicitTypes) {
reporter.reportOn(expression.source, FirErrors.TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, context)
val source = ((expression as? FirLambdaArgumentExpression)?.expression ?: expression).source
reporter.reportOn(source, FirErrors.TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, context)
} else if (coneType is ConeClassLikeType) {
for (typeArgument in coneType.typeArguments) {
checkConeType(typeArgument.type)