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 081854fbd4e..f531868aa64 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 @@ -4837,6 +4837,21 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.INCOMPATIBLE_CLASS) { firDiagnostic -> + IncompatibleClassImpl( + firDiagnostic.a, + firDiagnostic.b, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.PRE_RELEASE_CLASS) { firDiagnostic -> + PreReleaseClassImpl( + firDiagnostic.a, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirJvmErrors.CONFLICTING_JVM_DECLARATIONS) { firDiagnostic -> ConflictingJvmDeclarationsImpl( firDiagnostic as KtPsiDiagnostic, @@ -5319,21 +5334,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirJvmErrors.INCOMPATIBLE_CLASS) { firDiagnostic -> - IncompatibleClassImpl( - firDiagnostic.a, - firDiagnostic.b, - firDiagnostic as KtPsiDiagnostic, - token, - ) - } - add(FirJvmErrors.PRE_RELEASE_CLASS) { firDiagnostic -> - PreReleaseClassImpl( - firDiagnostic.a, - firDiagnostic as KtPsiDiagnostic, - token, - ) - } add(FirJsErrors.IMPLEMENTING_FUNCTION_INTERFACE) { firDiagnostic -> ImplementingFunctionInterfaceImpl( 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 54e90a2eac1..3216a1c66ff 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 @@ -3373,6 +3373,17 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DeprecatedDeclarationOfEnumEntry::class } + interface IncompatibleClass : KtFirDiagnostic { + override val diagnosticClass get() = IncompatibleClass::class + val presentableString: String + val incompatibility: IncompatibleVersionErrorData<*> + } + + interface PreReleaseClass : KtFirDiagnostic { + override val diagnosticClass get() = PreReleaseClass::class + val presentableString: String + } + interface ConflictingJvmDeclarations : KtFirDiagnostic { override val diagnosticClass get() = ConflictingJvmDeclarations::class } @@ -3705,17 +3716,6 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NoReflectionInClassPath::class } - interface IncompatibleClass : KtFirDiagnostic { - override val diagnosticClass get() = IncompatibleClass::class - val presentableString: String - val incompatibility: IncompatibleVersionErrorData<*> - } - - interface PreReleaseClass : KtFirDiagnostic { - override val diagnosticClass get() = PreReleaseClass::class - val presentableString: String - } - interface ImplementingFunctionInterface : KtFirDiagnostic { override val diagnosticClass get() = ImplementingFunctionInterface::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 47c920e24b1..1e0682a515f 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 @@ -4070,6 +4070,19 @@ internal class DeprecatedDeclarationOfEnumEntryImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DeprecatedDeclarationOfEnumEntry +internal class IncompatibleClassImpl( + override val presentableString: String, + override val incompatibility: IncompatibleVersionErrorData<*>, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.IncompatibleClass + +internal class PreReleaseClassImpl( + override val presentableString: String, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.PreReleaseClass + internal class ConflictingJvmDeclarationsImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, @@ -4477,19 +4490,6 @@ internal class NoReflectionInClassPathImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.NoReflectionInClassPath -internal class IncompatibleClassImpl( - override val presentableString: String, - override val incompatibility: IncompatibleVersionErrorData<*>, - firDiagnostic: KtPsiDiagnostic, - token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.IncompatibleClass - -internal class PreReleaseClassImpl( - override val presentableString: String, - firDiagnostic: KtPsiDiagnostic, - token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.PreReleaseClass - internal class ImplementingFunctionInterfaceImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt index cf94fdda807..62fe8c3fadc 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/fir/FirDiagnosticsCompilerResultsReporter.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory -import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import java.io.Closeable import java.io.File import java.io.InputStreamReader @@ -27,8 +27,8 @@ object FirDiagnosticsCompilerResultsReporter { reportDiagnosticToMessageCollector(diagnostic, location, messageCollector, renderDiagnosticName) }.also { AnalyzerWithCompilerReport.reportSpecialErrors( - diagnosticsCollector.diagnostics.any { it.factory == FirJvmErrors.INCOMPATIBLE_CLASS }, - diagnosticsCollector.diagnostics.any { it.factory == FirJvmErrors.PRE_RELEASE_CLASS }, + diagnosticsCollector.diagnostics.any { it.factory == FirErrors.INCOMPATIBLE_CLASS }, + diagnosticsCollector.diagnostics.any { it.factory == FirErrors.PRE_RELEASE_CLASS }, hasUnstableClasses = false, // TODO (KT-61598): report FIR_COMPILED_CLASS and IR_WITH_UNSTABLE_ABI_COMPILED_CLASS hasFirUnstableClasses = false, // TODO (KT-61598): report FIR_COMPILED_CLASS and IR_WITH_UNSTABLE_ABI_COMPILED_CLASS messageCollector, 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 cbcdf043f5a..45a103696c5 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 @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualAnnotationsIncompatibilityType import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.Incompatible +import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.util.PrivateForInline import kotlin.properties.PropertyDelegateProvider @@ -1708,6 +1709,17 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning() } + + val COMPATIBILITY_ISSUES by object : DiagnosticGroup("Compatibility issues") { + val INCOMPATIBLE_CLASS by error { + parameter("presentableString") + parameter>("incompatibility") + } + val PRE_RELEASE_CLASS by error { + parameter("presentableString") + } + } + } private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index f83d19fb351..f899bf682ef 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData @Suppress("ClassName", "unused") @OptIn(PrivateForInline::class) @@ -177,12 +176,5 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { ) val JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE by error() val NO_REFLECTION_IN_CLASS_PATH by warning() - val INCOMPATIBLE_CLASS by error { - parameter("presentableString") - parameter>("incompatibility") - } - val PRE_RELEASE_CLASS by error { - parameter("presentableString") - } } } diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index c8a921e24cf..4654f69f900 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData /* * This file was generated automatically @@ -121,8 +120,6 @@ object FirJvmErrors { val SPREAD_ON_SIGNATURE_POLYMORPHIC_CALL by deprecationError0(ProhibitSpreadOnSignaturePolymorphicCall, SourceElementPositioningStrategies.SPREAD_OPERATOR) val JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE by error0() val NO_REFLECTION_IN_CLASS_PATH by warning0() - val INCOMPATIBLE_CLASS by error2>() - val PRE_RELEASE_CLASS by error1() init { RootDiagnosticRendererFactory.registerFactory(FirJvmErrorsDefaultMessages) diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt index 6d03d000e19..fd32b01049a 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt @@ -29,7 +29,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ILLEGAL_JV import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INAPPLICABLE_JVM_FIELD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INAPPLICABLE_JVM_FIELD_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INAPPLICABLE_JVM_NAME -import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INCOMPATIBLE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INNER_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INTERFACE_CANT_CALL_DEFAULT_METHOD_VIA_SUPER import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE @@ -64,7 +63,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.OVERLOADS_ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.OVERRIDE_CANNOT_BE_STATIC import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION -import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.PRE_RELEASE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REDUNDANT_REPEATABLE_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REPEATABLE_CONTAINER_HAS_NON_DEFAULT_PARAMETER @@ -83,7 +81,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_ON_SUSPEND import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.UPPER_BOUND_CANNOT_BE_ARRAY import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION -import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { @@ -268,22 +265,5 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "Call uses reflection API which is not found in compilation classpath. " + "Make sure you have kotlin-reflect.jar in the classpath." ) - map.put( - INCOMPATIBLE_CLASS, - "{0} was compiled with an incompatible version of Kotlin. {1}", - STRING, - Renderer { incompatibility: IncompatibleVersionErrorData<*> -> - "The actual metadata version is ${incompatibility.actualVersion}, " + - "but the compiler version ${incompatibility.compilerVersion}" + - (if (incompatibility.languageVersion == incompatibility.compilerVersion) "" else " [with language version " + incompatibility.languageVersion + "]") + - " can read versions up to ${incompatibility.expectedVersion}.\n" + - "The class is loaded from ${FileUtil.toSystemIndependentName(incompatibility.filePath)}" - } - ) - map.put( - PRE_RELEASE_CLASS, - "{0} is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler", - STRING - ) } } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt index 72ce2af3bf2..f527bd5156e 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt @@ -19,7 +19,6 @@ object JvmExpressionCheckers : ExpressionCheckers() { get() = setOf( FirInterfaceDefaultMethodCallChecker, FirJavaSamInterfaceConstructorReferenceChecker, - FirIncompatibleClassExpressionChecker, ) override val callableReferenceAccessCheckers: Set diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmTypeCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmTypeCheckers.kt index 7840003b72f..e24b5af3223 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmTypeCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmTypeCheckers.kt @@ -8,12 +8,11 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirDynamicUnsupportedChecker import org.jetbrains.kotlin.fir.analysis.checkers.type.* import org.jetbrains.kotlin.fir.analysis.jvm.checkers.type.FirFunctionalTypeParameterNameChecker -import org.jetbrains.kotlin.fir.analysis.jvm.checkers.type.FirJvmIncompatibleClassTypeChecker +import org.jetbrains.kotlin.fir.analysis.checkers.type.FirIncompatibleClassTypeChecker object JvmTypeCheckers : TypeCheckers() { override val typeRefCheckers: Set = setOf( FirDynamicUnsupportedChecker, FirFunctionalTypeParameterNameChecker, - FirJvmIncompatibleClassTypeChecker, ) } 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 282fbab3574..9f440120851 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 @@ -111,6 +111,7 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualAnnotationsIncompatibilityType import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.Incompatible +import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData import org.jetbrains.kotlin.types.Variance /* @@ -853,6 +854,10 @@ object FirErrors { val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning0() + // Compatibility issues + val INCOMPATIBLE_CLASS by error2>() + val PRE_RELEASE_CLASS by error1() + init { RootDiagnosticRendererFactory.registerFactory(FirErrorsDefaultMessages) } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index 1f75219f46b..3829e5cd635 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -563,6 +563,8 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "RETURN_FOR_BUILT_IN_SUSPEND", "MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES", "MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES", + "INCOMPATIBLE_CLASS", + "PRE_RELEASE_CLASS", "CONFLICTING_JVM_DECLARATIONS", "OVERRIDE_CANNOT_BE_STATIC", "JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION", @@ -613,8 +615,6 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "JVM_SYNTHETIC_ON_DELEGATE", "SUBCLASS_CANT_CALL_COMPANION_PROTECTED_NON_STATIC", "JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE", - "INCOMPATIBLE_CLASS", - "PRE_RELEASE_CLASS", "IMPLEMENTING_FUNCTION_INTERFACE", "OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS", "OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE", diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt index fee306102c4..4a4126b6112 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt @@ -53,6 +53,7 @@ object CommonExpressionCheckers : ExpressionCheckers() { FirLateinitIntrinsicApplicabilityChecker, FirAbstractClassInstantiationChecker, FirInlineBodyQualifiedAccessExpressionChecker, + FirIncompatibleClassExpressionChecker, ) override val callCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt index 0433132570d..d3460ba2409 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt @@ -18,6 +18,7 @@ object CommonTypeCheckers : TypeCheckers() { FirUnsupportedModifiersInFunctionTypeParameterChecker, FirStarProjectionModifierChecker, FirDuplicateParameterNameInFunctionTypeChecker, - FirOptionalExpectationTypeChecker + FirOptionalExpectationTypeChecker, + FirIncompatibleClassTypeChecker, ) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirIncompatibleClassExpressionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt similarity index 84% rename from compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirIncompatibleClassExpressionChecker.kt rename to compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt index a1237cb4900..ac6441b7fdf 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirIncompatibleClassExpressionChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt @@ -3,15 +3,14 @@ * 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.jvm.checkers.expression +package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker -import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.utils.sourceElement import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol @@ -48,10 +47,10 @@ object FirIncompatibleClassExpressionChecker : FirQualifiedAccessExpressionCheck val incompatibility = source.incompatibility if (incompatibility != null) { - reporter.reportOn(element.source, FirJvmErrors.INCOMPATIBLE_CLASS, source.presentableString, incompatibility, context) + reporter.reportOn(element.source, FirErrors.INCOMPATIBLE_CLASS, source.presentableString, incompatibility, context) } if (source.isPreReleaseInvisible) { - reporter.reportOn(element.source, FirJvmErrors.PRE_RELEASE_CLASS, source.presentableString, context) + reporter.reportOn(element.source, FirErrors.PRE_RELEASE_CLASS, source.presentableString, context) } } } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirJvmIncompatibleClassTypeChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirIncompatibleClassTypeChecker.kt similarity index 68% rename from compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirJvmIncompatibleClassTypeChecker.kt rename to compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirIncompatibleClassTypeChecker.kt index 556667636d0..c34da41010e 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/type/FirJvmIncompatibleClassTypeChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirIncompatibleClassTypeChecker.kt @@ -3,16 +3,15 @@ * 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.jvm.checkers.type +package org.jetbrains.kotlin.fir.analysis.checkers.type import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.type.FirTypeRefChecker -import org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression.FirIncompatibleClassExpressionChecker +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirIncompatibleClassExpressionChecker import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.coneTypeOrNull -object FirJvmIncompatibleClassTypeChecker : FirTypeRefChecker() { +object FirIncompatibleClassTypeChecker : FirTypeRefChecker() { override fun check(typeRef: FirTypeRef, context: CheckerContext, reporter: DiagnosticReporter) { FirIncompatibleClassExpressionChecker.checkType(typeRef.coneTypeOrNull, typeRef, context, reporter) } 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 60de1db0948..b58a8fd8de0 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics +import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.COLLECTION import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.EMPTY @@ -19,6 +20,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.RENDER_POSITIO import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.STRING import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.commaSeparated import org.jetbrains.kotlin.diagnostics.rendering.LanguageFeatureMessageRenderer +import org.jetbrains.kotlin.diagnostics.rendering.Renderer import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.AMBIGUOUS_CALLS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.CALLEE_NAME import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.DECLARATION_NAME @@ -299,6 +301,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARG import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_ENUM_COMPARISON import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_ENUM_COMPARISON_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_MODIFIERS @@ -482,6 +485,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_CANNOT_BE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PLATFORM_CLASS_MAPPED_TO_KOTLIN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PLUGIN_ANNOTATION_AMBIGUITY +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRE_RELEASE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE @@ -688,6 +692,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_MODIFIER_TA import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_SETTER_PARAMETER_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_SETTER_RETURN_TYPE +import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData /** * ## Guidelines for diagnostic messages @@ -2476,6 +2481,25 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(ASSIGNED_VALUE_IS_NEVER_READ, "Assigned value is never read.") map.put(VARIABLE_INITIALIZER_IS_REDUNDANT, "Initializer is redundant.") map.put(VARIABLE_NEVER_READ, "Variable is never read.") + + // Compatibility issues group + map.put( + INCOMPATIBLE_CLASS, + "{0} was compiled with an incompatible version of Kotlin. {1}", + STRING, + Renderer { incompatibility: IncompatibleVersionErrorData<*> -> + "The actual metadata version is ${incompatibility.actualVersion}, " + + "but the compiler version ${incompatibility.compilerVersion}" + + (if (incompatibility.languageVersion == incompatibility.compilerVersion) "" else " [with language version " + incompatibility.languageVersion + "]") + + " can read versions up to ${incompatibility.expectedVersion}.\n" + + "The class is loaded from ${FileUtil.toSystemIndependentName(incompatibility.filePath)}" + } + ) + map.put( + PRE_RELEASE_CLASS, + "{0} is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler", + STRING + ) } } diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/output.fir.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/output.fir.txt new file mode 100644 index 00000000000..729cf7fce57 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/output.fir.txt @@ -0,0 +1,32 @@ +error: pre-release classes were found in dependencies. Remove them from the classpath, recompile with a release compiler or use '-Xskip-prerelease-check' to suppress errors +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:5:16: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler +fun baz(param: A, nested: A.Nested) { + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:5:27: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler +fun baz(param: A, nested: A.Nested) { + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:6:23: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + val constructor = A() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:7:18: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + val nested = A.Nested() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:8:22: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + val methodCall = param.method() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:8:28: error: unresolved reference 'method'. + val methodCall = param.method() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:9:30: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + val supertype = object : A() {} + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:11:13: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + val x = foo() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:12:13: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + val y = bar + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/releaseCompilerAgainstPreReleaseLibraryJs/source.kt:13:5: error: package 'a' is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler + bar = 239 + ^ +COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt index 6c22ceecbb8..0106838db69 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt @@ -250,7 +250,7 @@ abstract class AbstractCompileKotlinAgainstCustomBinariesTest : AbstractKotlinCo doTestPreReleaseKotlinLibrary(K2JVMCompiler(), "library", tmpdir) } - // KT-61596 K2 JS: support reporting PRE_RELEASE_CLASS + // TODO: unmute this test after switching LanguageVersion.LATEST_STABLE to 2.0. fun testReleaseCompilerAgainstPreReleaseLibraryJs() = muteForK2 { doTestPreReleaseKotlinLibrary(K2JSCompiler(), "library", File(tmpdir, "usage.js")) }