From 1d461684ae7fe9d050f03604aa264e795052c4e5 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 27 Oct 2023 10:04:57 +0200 Subject: [PATCH] LT: make where clause with errors parsing same as with PSI - do not fail on the missing terms - propagate invalid name to avoid reporting dangling constraints #KT-58455 fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../LightTreeRawFirDeclarationBuilder.kt | 31 ++++++++++++------- .../fir/lightTree/fir/TypeConstraint.kt | 2 +- .../tests/generics/whereClauseSyntax.fir.kt | 6 ++++ .../tests/generics/whereClauseSyntax.kt | 6 ++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 9 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/generics/whereClauseSyntax.fir.kt create mode 100644 compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 9e1948783b9..50b819469ef 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -13972,6 +13972,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/generics/unresolvedClassifierInWhere.kt"); } + @Test + @TestMetadata("whereClauseSyntax.kt") + public void testWhereClauseSyntax() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt"); + } + @Test @TestMetadata("wildcardInValueParameter.kt") public void testWildcardInValueParameter() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 98694408a5c..b2af780fdbb 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -13972,6 +13972,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/generics/unresolvedClassifierInWhere.kt"); } + @Test + @TestMetadata("whereClauseSyntax.kt") + public void testWhereClauseSyntax() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt"); + } + @Test @TestMetadata("wildcardInValueParameter.kt") public void testWildcardInValueParameter() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 06e799e5fdf..353d4f7bf07 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -13966,6 +13966,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/generics/unresolvedClassifierInWhere.kt"); } + @Test + @TestMetadata("whereClauseSyntax.kt") + public void testWhereClauseSyntax() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt"); + } + @Test @TestMetadata("wildcardInValueParameter.kt") public void testWildcardInValueParameter() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 4d32b41e2df..23c72b6be43 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -13972,6 +13972,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/generics/unresolvedClassifierInWhere.kt"); } + @Test + @TestMetadata("whereClauseSyntax.kt") + public void testWhereClauseSyntax() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt"); + } + @Test @TestMetadata("wildcardInValueParameter.kt") public void testWildcardInValueParameter() throws Exception { diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt index f5f917ac40b..23cb42580cc 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt @@ -1975,18 +1975,22 @@ class LightTreeRawFirDeclarationBuilder( * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeConstraint */ private fun convertTypeConstraint(typeConstraint: LighterASTNode): TypeConstraint { - lateinit var identifier: String - lateinit var firType: FirTypeRef - lateinit var referenceExpression: LighterASTNode - - val diagnostic = ConeSimpleDiagnostic( - "Type parameter annotations are not allowed inside where clauses", DiagnosticKind.AnnotationNotAllowed, - ) + var identifier: String? = null + var firType: FirTypeRef? = null + var referenceExpression: LighterASTNode? = null val annotations = mutableListOf() typeConstraint.forEachChildren { when (it.tokenType) { - ANNOTATION_ENTRY -> annotations += convertAnnotationEntry(it, diagnostic = diagnostic) + ANNOTATION_ENTRY -> { + annotations += + convertAnnotationEntry( + it, + diagnostic = ConeSimpleDiagnostic( + "Type parameter annotations are not allowed inside where clauses", DiagnosticKind.AnnotationNotAllowed, + ) + ) + } REFERENCE_EXPRESSION -> { identifier = it.asText referenceExpression = it @@ -1995,7 +1999,12 @@ class LightTreeRawFirDeclarationBuilder( } } - return TypeConstraint(annotations, identifier, firType, referenceExpression.toFirSourceElement()) + return TypeConstraint( + annotations, + identifier, + firType ?: buildErrorTypeRef { }, + (referenceExpression ?: typeConstraint).toFirSourceElement() + ) } /** @@ -2391,8 +2400,8 @@ class LightTreeRawFirDeclarationBuilder( ) where T : FirDeclaration, T : FirTypeParameterRefsOwner { val typeParamNames = typeParameters.map { it.name }.toSet() val result = typeConstraints.mapNotNull { constraint -> - val name = constraint.identifier.nameAsSafeName() - if (!typeParamNames.contains(name)) { + val name = constraint.identifier?.nameAsSafeName() + if (name != null && !typeParamNames.contains(name)) { DanglingTypeConstraint(name, constraint.source) } else { null diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/TypeConstraint.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/TypeConstraint.kt index f19ca677299..c5ff861a2f2 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/TypeConstraint.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/TypeConstraint.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef class TypeConstraint( val annotations: List, - val identifier: String, + val identifier: String?, val firTypeRef: FirTypeRef, val source: KtSourceElement ) diff --git a/compiler/testData/diagnostics/tests/generics/whereClauseSyntax.fir.kt b/compiler/testData/diagnostics/tests/generics/whereClauseSyntax.fir.kt new file mode 100644 index 00000000000..eee02bd01fb --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/whereClauseSyntax.fir.kt @@ -0,0 +1,6 @@ +// DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED +interface I +fun foo() where E: I {} +fun fooE1() where : I {} +fun fooE2() where E: {} +fun fooE3() where {} diff --git a/compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt b/compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt new file mode 100644 index 00000000000..f3389e6b534 --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt @@ -0,0 +1,6 @@ +// DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED +interface I +fun foo() where E: I {} +fun fooE1() where : I {} +fun fooE2() where E: {} +fun fooE3() where {} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index a0181f543f4..8d5c0486143 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -13972,6 +13972,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/generics/unresolvedClassifierInWhere.kt"); } + @Test + @TestMetadata("whereClauseSyntax.kt") + public void testWhereClauseSyntax() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/whereClauseSyntax.kt"); + } + @Test @TestMetadata("wildcardInValueParameter.kt") public void testWildcardInValueParameter() throws Exception {