From bacb2f0d153dc728b1e8823eaf370e3cc18c2054 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 5 Aug 2023 00:49:48 +0200 Subject: [PATCH] K1 JVM: simplify InlinePlatformCompatibilityChecker --- .../InlinePlatformCompatibilityChecker.kt | 91 ++++--------------- 1 file changed, 20 insertions(+), 71 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InlinePlatformCompatibilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InlinePlatformCompatibilityChecker.kt index 6f99ef8e748..ea6ca7ac562 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InlinePlatformCompatibilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InlinePlatformCompatibilityChecker.kt @@ -18,8 +18,6 @@ package org.jetbrains.kotlin.resolve.jvm.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.LanguageFeature -import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassOrPackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -35,85 +33,37 @@ import org.jetbrains.kotlin.resolve.inline.InlineUtil import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor -class InlinePlatformCompatibilityChecker(val jvmTarget: JvmTarget, languageVersionSettings: LanguageVersionSettings) : CallChecker { - - private val properError = languageVersionSettings.supportsFeature(LanguageFeature.ProperInlineFromHigherPlatformDiagnostic) - - private val doCheck = doCheck() - +class InlinePlatformCompatibilityChecker(val jvmTarget: JvmTarget) : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { - if (!doCheck) return - val resultingDescriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return - if (!InlineUtil.isInline(resultingDescriptor)) { - if (resultingDescriptor is PropertyDescriptor && InlineUtil.isInline(resultingDescriptor.getter)) { - //TODO: we should distinguish setter usage from getter one, now we could report wrong diagnostic on non-inline setter - //var prop: Int - // inline get - // set - // - // prop - resolved call with property descriptor and we should report error - // prop = 1 - resolved call with setter for whole expression and property descriptor for left part, - // so we couldn't distinguish is this expression for setter or for getter and will report wrong diagnostic - } else { - return - } + // TODO (KT-60971): distinguish the case when one property accessor is inline and the other isn't. + if (!InlineUtil.isInline(resultingDescriptor) && + (resultingDescriptor !is PropertyDescriptor || !InlineUtil.isInline(resultingDescriptor.getter)) + ) { + return } val propertyOrFun = DescriptorUtils.getDirectMember(resultingDescriptor) - val compilingBytecodeVersion = jvmTarget.majorVersion - if (!properError) { - val inliningBytecodeVersion = getBytecodeVersionIfDeserializedDescriptor(propertyOrFun, false) - if (inliningBytecodeVersion != null && compilingBytecodeVersion < inliningBytecodeVersion) { - context.trace.report( - ErrorsJvm.INLINE_FROM_HIGHER_PLATFORM.on( - reportOn, - JvmTarget.getDescription(inliningBytecodeVersion), - JvmTarget.getDescription(compilingBytecodeVersion) - ) + val inliningBytecodeVersion = getBytecodeVersionIfDeserializedDescriptor(propertyOrFun) ?: return + + if (jvmTarget.majorVersion < inliningBytecodeVersion) { + context.trace.report( + ErrorsJvm.INLINE_FROM_HIGHER_PLATFORM.on( + reportOn, + JvmTarget.getDescription(inliningBytecodeVersion), + JvmTarget.getDescription(jvmTarget.majorVersion) ) - return - } + ) } - - val inliningBytecodeVersionProper = getBytecodeVersionIfDeserializedDescriptor(propertyOrFun, true) ?: return - - if (compilingBytecodeVersion < inliningBytecodeVersionProper) { - if (properError) { - context.trace.report( - ErrorsJvm.INLINE_FROM_HIGHER_PLATFORM.on( - reportOn, - JvmTarget.getDescription(inliningBytecodeVersionProper), - JvmTarget.getDescription(compilingBytecodeVersion) - ) - ) - } else { - //INLINE_FROM_HIGHER_PLATFORM was checked in `if (!properError)` - context.trace.report( - ErrorsJvm.INLINE_FROM_HIGHER_PLATFORM_WARNING.on( - reportOn, - JvmTarget.getDescription(inliningBytecodeVersionProper), - JvmTarget.getDescription(compilingBytecodeVersion) - ) - ) - } - } - } companion object { - fun doCheck() = "true" != System.getProperty("kotlin.skip.bytecode.version.check") - - fun getBytecodeVersionIfDeserializedDescriptor( - funOrProperty: DeclarationDescriptor, - useConcreteSuperImplementation: Boolean - ): Int? { + private fun getBytecodeVersionIfDeserializedDescriptor(funOrProperty: DeclarationDescriptor): Int? { if (funOrProperty !is DeserializedCallableMemberDescriptor) return null - val realDeclarationIfFound = - if (useConcreteSuperImplementation) funOrProperty.getConcreteDeclarationForInline() else funOrProperty - val containingDeclaration = realDeclarationIfFound.containingDeclaration as ClassOrPackageFragmentDescriptor + val containingDeclaration = + funOrProperty.getConcreteDeclarationForInline().containingDeclaration as ClassOrPackageFragmentDescriptor val source = containingDeclaration.source val binaryClass = @@ -131,10 +81,9 @@ class InlinePlatformCompatibilityChecker(val jvmTarget: JvmTarget, languageVersi val superImplementation = overriddenDescriptors.firstOrNull { val containingDeclaration = it.containingDeclaration !DescriptorUtils.isInterface(containingDeclaration) && !DescriptorUtils.isAnnotationClass(containingDeclaration) - } - superImplementation?.let { - return it.getConcreteDeclarationForInline() + if (superImplementation != null) { + return superImplementation.getConcreteDeclarationForInline() } } return this