From 4f9617171673ce1a4961d00b96f19f4bf1051f52 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 31 Aug 2023 00:36:58 +0200 Subject: [PATCH] K2: report IR_WITH_UNSTABLE_ABI_COMPILED_CLASS Also, remove setting the value of allowUnstableDependencies to true if K2 is used because we want K2 to report errors (as K1 does) on unstable-ABI dependencies. #KT-61598 Fixed --- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 7 +++++++ .../analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 5 +++++ .../analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 ++++++ .../cli/common/arguments/K2JVMCompilerArguments.kt | 2 +- .../common/fir/FirDiagnosticsCompilerResultsReporter.kt | 2 +- .../checkers/generator/diagnostics/FirDiagnosticsList.kt | 4 +++- .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 1 + .../analysis/diagnostics/FirNonSuppressibleErrorNames.kt | 1 + .../expression/FirIncompatibleClassExpressionChecker.kt | 4 ++++ .../fir/analysis/diagnostics/FirErrorsDefaultMessages.kt | 8 ++++++-- .../againstFirWithUnstableAbi/output.fir.txt | 9 ++++++++- .../againstUnstable/output.fir.txt | 9 ++++++++- 12 files changed, 51 insertions(+), 7 deletions(-) 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 1ace39d2cd0..58fac26718d 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 @@ -4938,6 +4938,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.IR_WITH_UNSTABLE_ABI_COMPILED_CLASS) { firDiagnostic -> + IrWithUnstableAbiCompiledClassImpl( + firDiagnostic.a, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirJvmErrors.OVERRIDE_CANNOT_BE_STATIC) { firDiagnostic -> OverrideCannotBeStaticImpl( 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 2ee9c52d6c2..0d11ac3d9ee 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 @@ -3438,6 +3438,11 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val presentableString: String } + interface IrWithUnstableAbiCompiledClass : KtFirDiagnostic { + override val diagnosticClass get() = IrWithUnstableAbiCompiledClass::class + val presentableString: String + } + interface OverrideCannotBeStatic : KtFirDiagnostic { override val diagnosticClass get() = OverrideCannotBeStatic::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 4a88d86a0e2..d02393c7048 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 @@ -4146,6 +4146,12 @@ internal class PreReleaseClassImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.PreReleaseClass +internal class IrWithUnstableAbiCompiledClassImpl( + override val presentableString: String, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.IrWithUnstableAbiCompiledClass + internal class OverrideCannotBeStaticImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 84c9d877a99..7520bace294 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -876,7 +876,7 @@ Also sets `-jvm-target` value equal to the selected JDK version""" result[JvmAnalysisFlags.sanitizeParentheses] = sanitizeParentheses result[JvmAnalysisFlags.suppressMissingBuiltinsError] = suppressMissingBuiltinsError result[JvmAnalysisFlags.enableJvmPreview] = enableJvmPreview - result[AnalysisFlags.allowUnstableDependencies] = allowUnstableDependencies || useK2 || languageVersion.usesK2 + result[AnalysisFlags.allowUnstableDependencies] = allowUnstableDependencies result[JvmAnalysisFlags.disableUltraLightClasses] = disableUltraLightClasses result[JvmAnalysisFlags.useIR] = !useOldBackend return result 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 abcafcab8f1..ee7d882c19d 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 @@ -29,7 +29,7 @@ object FirDiagnosticsCompilerResultsReporter { AnalyzerWithCompilerReport.reportSpecialErrors( diagnosticsCollector.diagnostics.any { it.factory == FirErrors.INCOMPATIBLE_CLASS }, diagnosticsCollector.diagnostics.any { it.factory == FirErrors.PRE_RELEASE_CLASS }, - hasUnstableClasses = false, // TODO (KT-61598): report IR_WITH_UNSTABLE_ABI_COMPILED_CLASS + diagnosticsCollector.diagnostics.any { it.factory == FirErrors.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 c9184cb95c2..7dc6fcd7663 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 @@ -1751,8 +1751,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val PRE_RELEASE_CLASS by error { parameter("presentableString") } + val IR_WITH_UNSTABLE_ABI_COMPILED_CLASS by error { + parameter("presentableString") + } } - } private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = { 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 572e1770e58..00f94e5a72e 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 @@ -867,6 +867,7 @@ object FirErrors { // Compatibility issues val INCOMPATIBLE_CLASS by error2>() val PRE_RELEASE_CLASS by error1() + val IR_WITH_UNSTABLE_ABI_COMPILED_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 61ca3051203..df7be91fa5f 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 @@ -569,6 +569,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES", "INCOMPATIBLE_CLASS", "PRE_RELEASE_CLASS", + "IR_WITH_UNSTABLE_ABI_COMPILED_CLASS", "OVERRIDE_CANNOT_BE_STATIC", "JVM_STATIC_NOT_IN_OBJECT_OR_CLASS_COMPANION", "JVM_STATIC_NOT_IN_OBJECT_OR_COMPANION", diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt index ac6441b7fdf..28e109f05f8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleClassExpressionChecker.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.toRegularClassSymbol +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerAbiStability import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource object FirIncompatibleClassExpressionChecker : FirQualifiedAccessExpressionChecker() { @@ -52,5 +53,8 @@ object FirIncompatibleClassExpressionChecker : FirQualifiedAccessExpressionCheck if (source.isPreReleaseInvisible) { reporter.reportOn(element.source, FirErrors.PRE_RELEASE_CLASS, source.presentableString, context) } + if (source.abiStability == DeserializedContainerAbiStability.UNSTABLE) { + reporter.reportOn(element.source, FirErrors.IR_WITH_UNSTABLE_ABI_COMPILED_CLASS, source.presentableString, context) + } } } 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 b6ae83c8065..8b202c59d1a 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 @@ -343,6 +343,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVALID_TYPE_OF_A import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVISIBLE_REFERENCE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INVISIBLE_SETTER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.IR_WITH_UNSTABLE_ABI_COMPILED_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.IS_ENUM_ENTRY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ITERATOR_AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ITERATOR_MISSING @@ -2546,7 +2547,10 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "{0} is compiled by a pre-release version of Kotlin and cannot be loaded by this version of the compiler", STRING ) + map.put( + IR_WITH_UNSTABLE_ABI_COMPILED_CLASS, + "{0} is compiled by an unstable version of the Kotlin compiler and cannot be loaded by this compiler.", + STRING + ) } } - - diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/againstFirWithUnstableAbi/output.fir.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/againstFirWithUnstableAbi/output.fir.txt index d86bac9de59..e716bd0bacb 100644 --- a/compiler/testData/compileKotlinAgainstCustomBinaries/againstFirWithUnstableAbi/output.fir.txt +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/againstFirWithUnstableAbi/output.fir.txt @@ -1 +1,8 @@ -OK +error: classes compiled by an unstable version of the Kotlin compiler were found in dependencies. Remove them from the classpath or use '-Xallow-unstable-dependencies' to suppress errors +compiler/testData/compileKotlinAgainstCustomBinaries/againstFirWithUnstableAbi/source.kt:4:5: error: class 'lib.AKt' is compiled by an unstable version of the Kotlin compiler and cannot be loaded by this compiler. + get { Box("OK").value } + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/againstFirWithUnstableAbi/source.kt:4:11: error: class 'lib.Box' is compiled by an unstable version of the Kotlin compiler and cannot be loaded by this compiler. + get { Box("OK").value } + ^ +COMPILATION_ERROR diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/againstUnstable/output.fir.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/againstUnstable/output.fir.txt index d86bac9de59..f7228ced1e0 100644 --- a/compiler/testData/compileKotlinAgainstCustomBinaries/againstUnstable/output.fir.txt +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/againstUnstable/output.fir.txt @@ -1 +1,8 @@ -OK +error: classes compiled by an unstable version of the Kotlin compiler were found in dependencies. Remove them from the classpath or use '-Xallow-unstable-dependencies' to suppress errors +compiler/testData/compileKotlinAgainstCustomBinaries/againstUnstable/source.kt:4:5: error: class 'lib.AKt' is compiled by an unstable version of the Kotlin compiler and cannot be loaded by this compiler. + get { Box("OK").value } + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/againstUnstable/source.kt:4:11: error: class 'lib.Box' is compiled by an unstable version of the Kotlin compiler and cannot be loaded by this compiler. + get { Box("OK").value } + ^ +COMPILATION_ERROR