[Klib] Run prerelease checker in all backends

The checker also checks the metadata version, which
would be handled separately. Now it would never
emmit this error for klib-based backends.

^KT-61773
^KT-61596
^KT-55809
This commit is contained in:
Pavel Kunyavskiy
2023-09-12 11:17:53 +02:00
committed by Space Team
parent 9f9287fb2e
commit 9a9598c16b
19 changed files with 129 additions and 89 deletions
@@ -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,
@@ -3373,6 +3373,17 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = DeprecatedDeclarationOfEnumEntry::class
}
interface IncompatibleClass : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = IncompatibleClass::class
val presentableString: String
val incompatibility: IncompatibleVersionErrorData<*>
}
interface PreReleaseClass : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = PreReleaseClass::class
val presentableString: String
}
interface ConflictingJvmDeclarations : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = ConflictingJvmDeclarations::class
}
@@ -3705,17 +3716,6 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = NoReflectionInClassPath::class
}
interface IncompatibleClass : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = IncompatibleClass::class
val presentableString: String
val incompatibility: IncompatibleVersionErrorData<*>
}
interface PreReleaseClass : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = PreReleaseClass::class
val presentableString: String
}
interface ImplementingFunctionInterface : KtFirDiagnostic<KtClassOrObject> {
override val diagnosticClass get() = ImplementingFunctionInterface::class
}
@@ -4070,6 +4070,19 @@ internal class DeprecatedDeclarationOfEnumEntryImpl(
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtEnumEntry>(firDiagnostic, token), KtFirDiagnostic.DeprecatedDeclarationOfEnumEntry
internal class IncompatibleClassImpl(
override val presentableString: String,
override val incompatibility: IncompatibleVersionErrorData<*>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.IncompatibleClass
internal class PreReleaseClassImpl(
override val presentableString: String,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.PreReleaseClass
internal class ConflictingJvmDeclarationsImpl(
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
@@ -4477,19 +4490,6 @@ internal class NoReflectionInClassPathImpl(
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.NoReflectionInClassPath
internal class IncompatibleClassImpl(
override val presentableString: String,
override val incompatibility: IncompatibleVersionErrorData<*>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.IncompatibleClass
internal class PreReleaseClassImpl(
override val presentableString: String,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.PreReleaseClass
internal class ImplementingFunctionInterfaceImpl(
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
@@ -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,
@@ -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<PsiElement>(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED)
val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning<KtEnumEntry>()
}
val COMPATIBILITY_ISSUES by object : DiagnosticGroup("Compatibility issues") {
val INCOMPATIBLE_CLASS by error<PsiElement> {
parameter<String>("presentableString")
parameter<IncompatibleVersionErrorData<*>>("incompatibility")
}
val PRE_RELEASE_CLASS by error<PsiElement> {
parameter<String>("presentableString")
}
}
}
private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = {
@@ -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<PsiElement>()
val NO_REFLECTION_IN_CLASS_PATH by warning<PsiElement>()
val INCOMPATIBLE_CLASS by error<PsiElement> {
parameter<String>("presentableString")
parameter<IncompatibleVersionErrorData<*>>("incompatibility")
}
val PRE_RELEASE_CLASS by error<PsiElement> {
parameter<String>("presentableString")
}
}
}
@@ -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<PsiElement>(ProhibitSpreadOnSignaturePolymorphicCall, SourceElementPositioningStrategies.SPREAD_OPERATOR)
val JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE by error0<PsiElement>()
val NO_REFLECTION_IN_CLASS_PATH by warning0<PsiElement>()
val INCOMPATIBLE_CLASS by error2<PsiElement, String, IncompatibleVersionErrorData<*>>()
val PRE_RELEASE_CLASS by error1<PsiElement, String>()
init {
RootDiagnosticRendererFactory.registerFactory(FirJvmErrorsDefaultMessages)
@@ -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
)
}
}
@@ -19,7 +19,6 @@ object JvmExpressionCheckers : ExpressionCheckers() {
get() = setOf(
FirInterfaceDefaultMethodCallChecker,
FirJavaSamInterfaceConstructorReferenceChecker,
FirIncompatibleClassExpressionChecker,
)
override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker>
@@ -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<FirTypeRefChecker> = setOf(
FirDynamicUnsupportedChecker,
FirFunctionalTypeParameterNameChecker,
FirJvmIncompatibleClassTypeChecker,
)
}
@@ -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<PsiElement>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning0<KtEnumEntry>()
// Compatibility issues
val INCOMPATIBLE_CLASS by error2<PsiElement, String, IncompatibleVersionErrorData<*>>()
val PRE_RELEASE_CLASS by error1<PsiElement, String>()
init {
RootDiagnosticRendererFactory.registerFactory(FirErrorsDefaultMessages)
}
@@ -563,6 +563,8 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set<String> = 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<String> = 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",
@@ -53,6 +53,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
FirLateinitIntrinsicApplicabilityChecker,
FirAbstractClassInstantiationChecker,
FirInlineBodyQualifiedAccessExpressionChecker,
FirIncompatibleClassExpressionChecker,
)
override val callCheckers: Set<FirCallChecker>
@@ -18,6 +18,7 @@ object CommonTypeCheckers : TypeCheckers() {
FirUnsupportedModifiersInFunctionTypeParameterChecker,
FirStarProjectionModifierChecker,
FirDuplicateParameterNameInFunctionTypeChecker,
FirOptionalExpectationTypeChecker
FirOptionalExpectationTypeChecker,
FirIncompatibleClassTypeChecker,
)
}
@@ -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)
}
}
}
@@ -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)
}
@@ -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
)
}
}
@@ -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
@@ -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"))
}