From 9e1c6f2f6178533ed51f15f8994457506e7591f3 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 4 Jan 2023 15:11:26 +0200 Subject: [PATCH] [FIR JS] Support DYNAMIC_SUPERTYPE --- .../diagnostics/KtFirDataClassConverters.kt | 6 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 ++++ .../diagnostics/FirDiagnosticsList.kt | 2 ++ .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../checkers/CommonDeclarationCheckers.kt | 1 + .../declaration/FirDynamicSupertypeChecker.kt | 24 +++++++++++++++++++ .../diagnostics/FirErrorsDefaultMessages.kt | 3 +++ .../dynamicTypes/supertypesAndBounds.fir.kt | 2 +- 9 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDynamicSupertypeChecker.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index c674a65f095..b3b44d13479 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -2016,6 +2016,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.DYNAMIC_SUPERTYPE) { firDiagnostic -> + DynamicSupertypeImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.DYNAMIC_UPPER_BOUND) { firDiagnostic -> DynamicUpperBoundImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 1d4661da439..f90620ff495 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1431,6 +1431,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = MisplacedTypeParameterConstraints::class } + abstract class DynamicSupertype : KtFirDiagnostic() { + override val diagnosticClass get() = DynamicSupertype::class + } + abstract class DynamicUpperBound : KtFirDiagnostic() { override val diagnosticClass get() = DynamicUpperBound::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 8bcd2f7edbb..dbd594e1d45 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -1722,6 +1722,11 @@ internal class MisplacedTypeParameterConstraintsImpl( override val token: KtLifetimeToken, ) : KtFirDiagnostic.MisplacedTypeParameterConstraints(), KtAbstractFirDiagnostic +internal class DynamicSupertypeImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: KtLifetimeToken, +) : KtFirDiagnostic.DynamicSupertype(), KtAbstractFirDiagnostic + internal class DynamicUpperBoundImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 18de3caaed4..ed7bf932d23 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -672,6 +672,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val MISPLACED_TYPE_PARAMETER_CONSTRAINTS by warning() + val DYNAMIC_SUPERTYPE by error() + val DYNAMIC_UPPER_BOUND by error() val DYNAMIC_RECEIVER_NOT_ALLOWED by error() diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index a4a513f577e..675414d5648 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -416,6 +416,7 @@ object FirErrors { val CYCLIC_GENERIC_UPPER_BOUND by error0() val DEPRECATED_TYPE_PARAMETER_SYNTAX by error0(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val MISPLACED_TYPE_PARAMETER_CONSTRAINTS by warning0() + val DYNAMIC_SUPERTYPE by error0() val DYNAMIC_UPPER_BOUND by error0() val DYNAMIC_RECEIVER_NOT_ALLOWED by error0() val INCOMPATIBLE_TYPES by error2() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index 6bac144ab23..627f8acb56b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -94,6 +94,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirTypeParametersInObjectChecker, FirSupertypesChecker, FirPrimaryConstructorSuperTypeChecker, + FirDynamicSupertypeChecker, ) override val regularClassCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDynamicSupertypeChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDynamicSupertypeChecker.kt new file mode 100644 index 00000000000..ededed1273c --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDynamicSupertypeChecker.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.types.ConeDynamicType +import org.jetbrains.kotlin.fir.types.coneType + +object FirDynamicSupertypeChecker : FirClassChecker() { + override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { + for (superType in declaration.superTypeRefs) { + if (superType.coneType is ConeDynamicType) { + reporter.reportOn(superType.source, FirErrors.DYNAMIC_SUPERTYPE, context) + } + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 5ca9de4c48c..2a8476b4382 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -169,6 +169,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DIVISION_BY_ZERO import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DSL_SCOPE_VIOLATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DUPLICATE_LABEL_IN_WHEN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DYNAMIC_RECEIVER_NOT_ALLOWED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DYNAMIC_SUPERTYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DYNAMIC_UPPER_BOUND import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ELSE_MISPLACED_IN_WHEN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EMPTY_CHARACTER_LITERAL @@ -1250,6 +1251,8 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "If a type parameter has multiple constraints, they all need to be placed in the 'where' clause" ) + map.put(DYNAMIC_SUPERTYPE, "A supertype cannot be dynamic") + map.put(DYNAMIC_UPPER_BOUND, "Dynamic type can not be used as an upper bound") map.put(DYNAMIC_RECEIVER_NOT_ALLOWED, "Dynamic receiver is prohibited") diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/supertypesAndBounds.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/supertypesAndBounds.fir.kt index 3d1ae597aa4..51bb4c20d7b 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/supertypesAndBounds.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/supertypesAndBounds.fir.kt @@ -1,4 +1,4 @@ -interface Tr : dynamic +interface Tr : dynamic fun foo() {}