K1: Place integer cinterop conversions under a language feature

Note that it's quite hard to emit a particular diagnostic as
 type check happens later, after the conversion

 ^KT-56583
This commit is contained in:
Mikhail Zarechenskiy
2023-02-15 14:12:21 +01:00
committed by Space Team
parent 2cad26f4cc
commit 82524fde26
9 changed files with 15 additions and 10 deletions
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.name.FqName
@@ -12,13 +14,10 @@ object ImplicitIntegerCoercion {
val MODULE_CAPABILITY = ModuleCapability<Boolean>("ImplicitIntegerCoercion")
fun isEnabledForParameter(descriptor: ParameterDescriptor): Boolean = isEnabledFor(descriptor)
fun isEnabledForConstVal(descriptor: VariableDescriptor): Boolean = isEnabledFor(descriptor)
private fun isEnabledFor(descriptor: DeclarationDescriptor): Boolean =
fun isEnabledFor(descriptor: DeclarationDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean =
descriptor.hasImplicitIntegerCoercionAnnotation() ||
DescriptorUtils.getContainingModuleOrNull(descriptor)?.hasImplicitIntegerCoercionCapability() == true
(languageVersionSettings.supportsFeature(LanguageFeature.ImplicitSignedToUnsignedIntegerConversion) &&
DescriptorUtils.getContainingModuleOrNull(descriptor)?.hasImplicitIntegerCoercionCapability() == true)
private val IMPLICIT_INTEGER_COERCION_ANNOTATION_FQ_NAME = FqName("kotlin.internal.ImplicitIntegerCoercion")
@@ -369,7 +369,7 @@ class CallCompleter(
updatedType = argumentTypeResolver.updateResultArgumentTypeIfNotDenotable(context, expression) ?: updatedType
}
if (parameter != null && ImplicitIntegerCoercion.isEnabledForParameter(parameter)) {
if (parameter != null && ImplicitIntegerCoercion.isEnabledFor(parameter, context.languageVersionSettings)) {
val argumentCompileTimeValue = context.trace[BindingContext.COMPILE_TIME_VALUE, deparenthesized]
if (argumentCompileTimeValue != null && argumentCompileTimeValue.parameters.isConvertableConstVal) {
val generalNumberType = createTypeForConvertableConstant(argumentCompileTimeValue)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.ImplicitIntegerCoercion.isEnabledFor
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
import org.jetbrains.kotlin.resolve.calls.CallTransformer
import org.jetbrains.kotlin.resolve.calls.DiagnosticReporterByTrackingStrategy
@@ -370,7 +371,7 @@ class KotlinToResolvedCallTransformer(
var reportErrorDuringTypeCheck = reportErrorForTypeMismatch
if (parameter != null && ImplicitIntegerCoercion.isEnabledForParameter(parameter)) {
if (parameter != null && isEnabledFor(parameter, context.languageVersionSettings)) {
val argumentCompileTimeValue = context.trace[BindingContext.COMPILE_TIME_VALUE, deparenthesized]
if (argumentCompileTimeValue != null && argumentCompileTimeValue.parameters.isConvertableConstVal) {
val generalNumberType = createTypeForConvertableConstant(argumentCompileTimeValue)
@@ -823,7 +823,7 @@ private class ConstantExpressionEvaluatorVisitor(
val isConvertableConstVal =
callableDescriptor.isConst &&
ImplicitIntegerCoercion.isEnabledForConstVal(callableDescriptor) &&
ImplicitIntegerCoercion.isEnabledFor(callableDescriptor, languageVersionSettings) &&
callableDescriptor.compileTimeInitializer is IntValue
return callableDescriptor.compileTimeInitializer?.wrap(