[FE] Drop ApproximateIntegerLiteralTypesInReceiverPosition language feature

This feature is not needed because it is unconditionally disabled for K1
  (because of not fully correct implementation) and unconditionally enabled
  in K2 (K2 does not support old behavior)

^KT-38895
This commit is contained in:
Dmitriy Novozhilov
2022-11-30 12:22:09 +02:00
committed by Space Team
parent 26ff806440
commit 3cffb33ab7
90 changed files with 90 additions and 494 deletions
@@ -131,7 +131,6 @@ class VariableTypeAndInitializerResolver(
NewSchemeOfIntegerOperatorResolutionChecker.checkArgument(
variableType,
initializer,
languageVersionSettings,
trace,
constantExpressionEvaluator.module
)
@@ -6,11 +6,8 @@
package org.jetbrains.kotlin.resolve.calls.checkers
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
@@ -33,7 +30,6 @@ import org.jetbrains.kotlin.types.typeUtil.*
object NewSchemeOfIntegerOperatorResolutionChecker : CallChecker {
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
if (context.languageVersionSettings.supportsFeature(LanguageFeature.ApproximateIntegerLiteralTypesInReceiverPosition)) return
for ((valueParameter, arguments) in resolvedCall.valueArguments) {
val expectedType = if (valueParameter.isVararg) {
valueParameter.varargElementType ?: continue
@@ -54,11 +50,9 @@ object NewSchemeOfIntegerOperatorResolutionChecker : CallChecker {
fun checkArgument(
expectedType: KotlinType,
argument: KtExpression,
languageVersionSettings: LanguageVersionSettings,
trace: BindingTrace,
moduleDescriptor: ModuleDescriptor
) {
if (languageVersionSettings.supportsFeature(LanguageFeature.ApproximateIntegerLiteralTypesInReceiverPosition)) return
val type = expectedType.lowerIfFlexible()
if (type.isPrimitiveNumberOrNullableType()) {
checkArgumentImpl(type, KtPsiUtil.deparenthesize(argument)!!, trace, moduleDescriptor)
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.builtins.UnsignedTypes
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageFeature.ApproximateIntegerLiteralTypesInReceiverPosition
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
@@ -286,10 +285,9 @@ class ConstantExpressionEvaluator(
fun evaluateExpression(
expression: KtExpression,
trace: BindingTrace,
expectedType: KotlinType? = TypeUtils.NO_EXPECTED_TYPE,
isIndependentContext: Boolean = false
expectedType: KotlinType? = TypeUtils.NO_EXPECTED_TYPE
): CompileTimeConstant<*>? {
val visitor = ConstantExpressionEvaluatorVisitor(this, trace, isIndependentContext)
val visitor = ConstantExpressionEvaluatorVisitor(this, trace)
val constant = visitor.evaluate(expression, expectedType) ?: return null
checkExperimentalityOfConstantLiteral(expression, constant, expectedType, trace)
@@ -389,13 +387,10 @@ private val DIVISION_OPERATION_NAMES =
private class ConstantExpressionEvaluatorVisitor(
private val constantExpressionEvaluator: ConstantExpressionEvaluator,
private val trace: BindingTrace,
private val isIndependentContext: Boolean
private val trace: BindingTrace
) : KtVisitor<CompileTimeConstant<*>?, KotlinType>() {
private val languageVersionSettings = constantExpressionEvaluator.languageVersionSettings
private val builtIns = constantExpressionEvaluator.module.builtIns
private val defaultValueForDontCreateIntegerLiteralType =
languageVersionSettings.supportsFeature(ApproximateIntegerLiteralTypesInReceiverPosition)
private val inlineConstTracker =
if (constantExpressionEvaluator.inlineConstTracker is InlineConstTracker.DoNothing)
null
@@ -530,8 +525,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLongNumberLiteral = isUnsignedLong,
usesVariableAsConstant = false,
usesNonConstValAsConstant = false,
isConvertableConstVal = false,
dontCreateILT = defaultValueForDontCreateIntegerLiteralType && isIndependentContext
isConvertableConstVal = false
)
)
}
@@ -581,8 +575,7 @@ private class ConstantExpressionEvaluatorVisitor(
canBeUsedInAnnotation = canBeUsedInAnnotation,
usesVariableAsConstant = usesVariableAsConstant,
usesNonConstValAsConstant = usesNonConstantVariableAsConstant,
isConvertableConstVal = false,
dontCreateILT = false
isConvertableConstVal = false
)
)
else null
@@ -646,8 +639,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLongNumberLiteral = false,
usesVariableAsConstant = leftConstant.usesVariableAsConstant || rightConstant.usesVariableAsConstant,
usesNonConstValAsConstant = leftConstant.usesNonConstValAsConstant || rightConstant.usesNonConstValAsConstant,
isConvertableConstVal = false,
dontCreateILT = false
isConvertableConstVal = false
)
)
} else {
@@ -666,8 +658,7 @@ private class ConstantExpressionEvaluatorVisitor(
private fun evaluateCall(
callExpression: KtExpression,
receiverExpression: KtExpression,
expectedType: KotlinType?,
isUnaryPlusMinus: Boolean = false
expectedType: KotlinType?
): CompileTimeConstant<*>? {
val resolvedCall = callExpression.getResolvedCall(trace.bindingContext) ?: return null
if (!KotlinBuiltIns.isUnderKotlinPackage(resolvedCall.resultingDescriptor)) return null
@@ -689,12 +680,9 @@ private class ConstantExpressionEvaluatorVisitor(
val usesNonConstValAsConstant = usesNonConstValAsConstant(argumentForReceiver.expression)
val isNumberConversionMethod = resultingDescriptorName in OperatorConventions.NUMBER_CONVERSIONS
val isCharCode = argumentForReceiver.ctcType == CHAR && resultingDescriptorName == StandardNames.CHAR_CODE
val dontCreateILT = defaultValueForDontCreateIntegerLiteralType &&
!isUnaryPlusMinus &&
!hasIntegerLiteralType(receiverExpression)
return createConstant(
result,
expectedType.takeUnless { dontCreateILT },
expectedType,
CompileTimeConstant.Parameters(
canBeUsedInAnnotation,
!isNumberConversionMethod && !isCharCode && isArgumentPure,
@@ -702,8 +690,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLongNumberLiteral = false,
usesVariableAsConstant,
usesNonConstValAsConstant,
isConvertableConstVal = false,
dontCreateILT = dontCreateILT
isConvertableConstVal = false
)
)
} else if (argumentsEntrySet.size == 1) {
@@ -738,7 +725,6 @@ private class ConstantExpressionEvaluatorVisitor(
usesVariableAsConstant(argumentForReceiver.expression) || usesVariableAsConstant(argumentForParameter.expression)
val usesNonConstValAsConstant =
usesNonConstValAsConstant(argumentForReceiver.expression) || usesNonConstValAsConstant(argumentForParameter.expression)
val dontCreateILT = defaultValueForDontCreateIntegerLiteralType && !hasIntegerLiteralType(receiverExpression)
val parameters = CompileTimeConstant.Parameters(
canBeUsedInAnnotation,
areArgumentsPure,
@@ -746,8 +732,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLongNumberLiteral = false,
usesVariableAsConstant,
usesNonConstValAsConstant,
isConvertableConstVal = false,
dontCreateILT = dontCreateILT
isConvertableConstVal = false
)
return when (resultingDescriptorName) {
OperatorNameConventions.COMPARE_TO -> createCompileTimeConstantForCompareTo(result, callExpression)?.wrap(parameters)
@@ -755,7 +740,7 @@ private class ConstantExpressionEvaluatorVisitor(
else -> {
createConstant(
result,
expectedType.takeUnless { dontCreateILT },
expectedType,
parameters
)
}
@@ -777,9 +762,6 @@ private class ConstantExpressionEvaluatorVisitor(
private fun isPureConstant(expression: KtExpression) =
ConstantExpressionEvaluator.getConstant(expression, trace.bindingContext)?.isPure ?: false
private fun hasIntegerLiteralType(expression: KtExpression): Boolean =
ConstantExpressionEvaluator.getConstant(expression, trace.bindingContext)?.hasIntegerLiteralType ?: false
private fun evaluateUnaryAndCheck(receiver: OperationArgument, name: String, callExpression: KtExpression): Any? {
return evaluateUnaryAndCheck(name, receiver.ctcType, receiver.value) {
trace.report(Errors.INTEGER_OVERFLOW.on(callExpression.getStrictParentOfType() ?: callExpression))
@@ -803,12 +785,10 @@ private class ConstantExpressionEvaluatorVisitor(
override fun visitUnaryExpression(expression: KtUnaryExpression, expectedType: KotlinType?): CompileTimeConstant<*>? {
val leftExpression = expression.baseExpression ?: return null
val tokenType = expression.operationToken
return evaluateCall(
expression.operationReference,
leftExpression,
expectedType,
isUnaryPlusMinus = tokenType == KtTokens.PLUS || tokenType == KtTokens.MINUS
expectedType
)
}
@@ -847,8 +827,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLongNumberLiteral = false,
usesVariableAsConstant = true,
usesNonConstValAsConstant = !callableDescriptor.isConst,
isConvertableConstVal = isConvertableConstVal,
dontCreateILT = true
isConvertableConstVal = isConvertableConstVal
)
)
}
@@ -1108,9 +1087,7 @@ private class ConstantExpressionEvaluatorVisitor(
}
if (TypeUtils.noExpectedType(expectedType) || expectedType.isError) {
return if (parameters.dontCreateILT) {
value.createSimpleIntCompileTimeConst(parameters)
} else createIntegerValueTypeConstant(
return createIntegerValueTypeConstant(
value,
constantExpressionEvaluator.module,
parameters,
@@ -1159,8 +1136,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLong: Boolean = false,
usesVariableAsConstant: Boolean = false,
usesNonConstValAsConstant: Boolean = false,
isConvertableConstVal: Boolean = false,
dontCreateILT: Boolean = false
isConvertableConstVal: Boolean = false
): TypedCompileTimeConstant<T> =
wrap(
CompileTimeConstant.Parameters(
@@ -1170,8 +1146,7 @@ private class ConstantExpressionEvaluatorVisitor(
isUnsignedLong,
usesVariableAsConstant,
usesNonConstValAsConstant,
isConvertableConstVal,
dontCreateILT
isConvertableConstVal
)
)
}
@@ -181,7 +181,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
checkNull(expression, context, typeInfo.getType());
components.constantExpressionEvaluator.evaluateExpression(
expression, context.trace, context.expectedType, evaluateIntegerConstantInIndependentMode(context)
expression, context.trace, context.expectedType
);
return components.dataFlowAnalyzer.checkType(typeInfo, expression, context); // TODO : Extensions to this
}
@@ -217,7 +217,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
}
CompileTimeConstant<?> compileTimeConstant = components.constantExpressionEvaluator.evaluateExpression(
expression, context.trace, context.expectedType, evaluateIntegerConstantInIndependentMode(context)
expression, context.trace, context.expectedType
);
if (compileTimeConstant instanceof UnsignedErrorValueTypeConstant) {
@@ -830,7 +830,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
}
CompileTimeConstant<?> value = components.constantExpressionEvaluator.evaluateExpression(
expression, contextWithExpectedType.trace, contextWithExpectedType.expectedType, evaluateIntegerConstantInIndependentMode(context)
expression, contextWithExpectedType.trace, contextWithExpectedType.expectedType
);
if (value != null) {
return components.dataFlowAnalyzer.createCompileTimeConstantTypeInfo(value, expression, contextWithExpectedType);
@@ -1126,7 +1126,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
result = TypeInfoFactoryKt.noTypeInfo(context);
}
CompileTimeConstant<?> value = components.constantExpressionEvaluator.evaluateExpression(
expression, contextWithExpectedType.trace, contextWithExpectedType.expectedType, evaluateIntegerConstantInIndependentMode(context)
expression, contextWithExpectedType.trace, contextWithExpectedType.expectedType
);
if (value != null) {
return components.dataFlowAnalyzer.createCompileTimeConstantTypeInfo(value, expression, contextWithExpectedType);
@@ -1602,7 +1602,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
for (KtStringTemplateEntry entry : expression.getEntries()) {
entry.accept(visitor);
}
components.constantExpressionEvaluator.evaluateExpression(expression, context.trace, contextWithExpectedType.expectedType, evaluateIntegerConstantInIndependentMode(context));
components.constantExpressionEvaluator.evaluateExpression(expression, context.trace, contextWithExpectedType.expectedType);
return components.dataFlowAnalyzer.checkType(visitor.typeInfo.replaceType(components.builtIns.getStringType()),
expression,
contextWithExpectedType);
@@ -1805,8 +1805,4 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
return BindingContextUtils.getRecordedTypeInfo(expression, context.trace.getBindingContext());
}
}
private boolean evaluateIntegerConstantInIndependentMode(ExpressionTypingContext context) {
return context.contextDependency == INDEPENDENT && context.languageVersionSettings.supportsFeature(LanguageFeature.ApproximateIntegerLiteralTypesInReceiverPosition);
}
}
@@ -474,7 +474,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
DataFlowValue rightValue = components.dataFlowValueFactory.createDataFlowValue(right, rightType, context);
// We cannot say here anything new about rightValue except it has the same value as leftValue
resultInfo = resultInfo.replaceDataFlowInfo(dataFlowInfo.assign(leftValue, rightValue, components.languageVersionSettings));
NewSchemeOfIntegerOperatorResolutionChecker.checkArgument(expectedType, right, context.languageVersionSettings, context.trace, components.moduleDescriptor);
NewSchemeOfIntegerOperatorResolutionChecker.checkArgument(expectedType, right, context.trace, components.moduleDescriptor);
}
}
else {
@@ -75,7 +75,6 @@ class ValueParameterResolver(
NewSchemeOfIntegerOperatorResolutionChecker.checkArgument(
type,
defaultValue,
context.languageVersionSettings,
context.trace,
constantExpressionEvaluator.module
)