diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java index 3e53da7413a..372e6e070a3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java @@ -138,13 +138,6 @@ public class DescriptorAsmUtil { return boxedPrimitiveType != null ? boxedPrimitiveType : type; } - public static boolean isPrimitiveNumberClassDescriptor(DeclarationDescriptor descriptor) { - if (!(descriptor instanceof ClassDescriptor)) { - return false; - } - return isPrimitiveClass((ClassDescriptor) descriptor) && !isBoolean((ClassDescriptor) descriptor); - } - public static boolean isAbstractMethod(FunctionDescriptor functionDescriptor, OwnerKind kind, JvmDefaultMode jvmDefaultMode) { return (functionDescriptor.getModality() == Modality.ABSTRACT || (isJvmInterface(functionDescriptor.getContainingDeclaration()) && !JvmAnnotationUtilKt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index eef83e10101..4be79da8716 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -118,6 +118,7 @@ import static org.jetbrains.kotlin.resolve.BindingContextUtils.getDelegationCons import static org.jetbrains.kotlin.resolve.BindingContextUtils.isBoxedLocalCapturedInClosure; import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; +import static org.jetbrains.kotlin.types.RangeUtilKt.isPrimitiveNumberClassDescriptor; import static org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionExpression; import static org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionLiteral; import static org.jetbrains.org.objectweb.asm.Opcodes.*; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt index 053c4332168..4b0d555fc01 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods import org.jetbrains.kotlin.codegen.optimization.common.OptimizationBasicInterpreter import org.jetbrains.kotlin.codegen.optimization.common.StrictBasicValue -import org.jetbrains.kotlin.codegen.range.* import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.codegen.topLevelClassInternalName @@ -36,6 +35,7 @@ import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode import org.jetbrains.org.objectweb.asm.tree.InsnList import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue +import org.jetbrains.kotlin.types.* open class BoxingInterpreter( private val insnList: InsnList, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/ProgressionIteratorBasicValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/ProgressionIteratorBasicValue.kt index 52c1cc138a3..220ea422d77 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/ProgressionIteratorBasicValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/ProgressionIteratorBasicValue.kt @@ -18,9 +18,9 @@ package org.jetbrains.kotlin.codegen.optimization.boxing import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.optimization.common.StrictBasicValue -import org.jetbrains.kotlin.codegen.range.* import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode +import org.jetbrains.kotlin.types.* class ProgressionIteratorBasicValue private constructor( diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt index d403712dd11..f3db6deda5f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.types.isClosedRangeContains class ComparableRangeLiteralRangeValue( codegen: ExpressionCodegen, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt index a8c4406c164..c886d7b1c0e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.constants.* import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.org.objectweb.asm.Type +import org.jetbrains.kotlin.types.* abstract class PrimitiveNumberRangeIntrinsicRangeValue( rangeCall: ResolvedCall diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveRangeRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveRangeRangeValue.kt index 53bbfad3816..3f558622132 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveRangeRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveRangeRangeValue.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.getRangeOrProgressionElementType class PrimitiveRangeRangeValue(private val rangeExpression: KtExpression) : ReversableRangeValue { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeValues.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeValues.kt index 74cc86ce161..a1b5608c54e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeValues.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeValues.kt @@ -28,9 +28,9 @@ import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.org.objectweb.asm.Type +import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.checker.KotlinTypeChecker fun ExpressionCodegen.createRangeValueForExpression(rangeExpression: KtExpression): RangeValue { // NB when you implement a new intrinsic RangeValue, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/comparison/ComparisonGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/comparison/ComparisonGenerator.kt index a8a9d1dcf69..934ddf42460 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/comparison/ComparisonGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/comparison/ComparisonGenerator.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.codegen.range.comparison import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.ExpressionCodegen -import org.jetbrains.kotlin.codegen.range.getRangeOrProgressionElementType +import org.jetbrains.kotlin.types.getRangeOrProgressionElementType import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.types.KotlinType diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForInProgressionLoopGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForInProgressionLoopGenerator.kt index 86fdd69b1b7..a5b61444d0b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForInProgressionLoopGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForInProgressionLoopGenerator.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.range.comparison.SignedIntegerComparisonGenerator import org.jetbrains.kotlin.codegen.range.comparison.getComparisonGeneratorForKotlinType -import org.jetbrains.kotlin.codegen.range.getRangeOrProgressionElementType +import org.jetbrains.kotlin.types.getRangeOrProgressionElementType import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtForExpression diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt index 1dd487b0182..41105dda7cb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/forLoop/AbstractForLoopGenerator.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.codegen.range.forLoop import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.filterOutDescriptorsWithSpecialNames -import org.jetbrains.kotlin.codegen.range.getElementType +import org.jetbrains.kotlin.types.getElementType import org.jetbrains.kotlin.psi.KtDestructuringDeclaration import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.resolve.BindingContext diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/RangeUtil.kt similarity index 88% rename from compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt rename to compiler/frontend/src/org/jetbrains/kotlin/types/RangeUtil.kt index 774403c30e4..645ffecef52 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/RangeUtil.kt @@ -1,14 +1,13 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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.codegen.range +package org.jetbrains.kotlin.types import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.UnsignedTypes -import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.isPrimitiveNumberClassDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils import org.jetbrains.kotlin.name.ClassId @@ -19,7 +18,6 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.types.KotlinType fun isPrimitiveRange(rangeType: KotlinType) = isClassTypeWithFqn(rangeType, PRIMITIVE_RANGE_FQNS) @@ -43,14 +41,14 @@ private val KotlinType.classFqnString: String? private fun isClassTypeWithFqn(kotlinType: KotlinType, fqns: Set): Boolean = kotlinType.classFqnString in fqns -internal const val CHAR_RANGE_FQN = "kotlin.ranges.CharRange" -internal const val INT_RANGE_FQN = "kotlin.ranges.IntRange" -internal const val LONG_RANGE_FQN = "kotlin.ranges.LongRange" +const val CHAR_RANGE_FQN = "kotlin.ranges.CharRange" +const val INT_RANGE_FQN = "kotlin.ranges.IntRange" +const val LONG_RANGE_FQN = "kotlin.ranges.LongRange" private val PRIMITIVE_RANGE_FQNS = setOf(CHAR_RANGE_FQN, INT_RANGE_FQN, LONG_RANGE_FQN) -internal const val CHAR_PROGRESSION_FQN = "kotlin.ranges.CharProgression" -internal const val INT_PROGRESSION_FQN = "kotlin.ranges.IntProgression" -internal const val LONG_PROGRESSION_FQN = "kotlin.ranges.LongProgression" +const val CHAR_PROGRESSION_FQN = "kotlin.ranges.CharProgression" +const val INT_PROGRESSION_FQN = "kotlin.ranges.IntProgression" +const val LONG_PROGRESSION_FQN = "kotlin.ranges.LongProgression" private val PRIMITIVE_PROGRESSION_FQNS = setOf(CHAR_PROGRESSION_FQN, INT_PROGRESSION_FQN, LONG_PROGRESSION_FQN) private const val CLOSED_FLOAT_RANGE_FQN = "kotlin.ranges.ClosedFloatRange" @@ -67,11 +65,25 @@ internal const val UINT_PROGRESSION_FQN = "kotlin.ranges.UIntProgression" internal const val ULONG_PROGRESSION_FQN = "kotlin.ranges.ULongProgression" private val UNSIGNED_PROGRESSION_FQNS = setOf(UINT_PROGRESSION_FQN, ULONG_PROGRESSION_FQN) -fun getRangeOrProgressionElementType(rangeType: KotlinType): KotlinType? { +private val ALL_PROGRESSION_AND_RANGES = listOf( + CHAR_RANGE_FQN, CHAR_PROGRESSION_FQN, + INT_RANGE_FQN, INT_PROGRESSION_FQN, + LONG_RANGE_FQN, LONG_PROGRESSION_FQN, + CLOSED_FLOAT_RANGE_FQN, CLOSED_DOUBLE_RANGE_FQN, + CLOSED_RANGE_FQN, CLOSED_FLOATING_POINT_RANGE_FQN, + COMPARABLE_RANGE_FQN, + UINT_RANGE_FQN, UINT_PROGRESSION_FQN, + ULONG_RANGE_FQN, ULONG_PROGRESSION_FQN +) + +fun getRangeOrProgressionElementType(rangeType: KotlinType, progressionsAndRanges: List = ALL_PROGRESSION_AND_RANGES): KotlinType? { val rangeClassDescriptor = rangeType.constructor.declarationDescriptor as? ClassDescriptor ?: return null val builtIns = rangeClassDescriptor.builtIns + val fqName = rangeClassDescriptor.fqNameSafe.asString() - return when (rangeClassDescriptor.fqNameSafe.asString()) { + if (fqName !in progressionsAndRanges) return null + + return when (fqName) { CHAR_RANGE_FQN, CHAR_PROGRESSION_FQN -> builtIns.charType INT_RANGE_FQN, INT_PROGRESSION_FQN -> builtIns.intType LONG_RANGE_FQN, LONG_PROGRESSION_FQN -> builtIns.longType @@ -267,3 +279,12 @@ fun isCharSequenceIterator(descriptor: CallableDescriptor) = it.constructor.declarationDescriptor?.isTopLevelInPackage("CharSequence", "kotlin") ?: false } + + +fun isPrimitiveNumberClassDescriptor(descriptor: DeclarationDescriptor?): Boolean { + return if (descriptor !is ClassDescriptor) { + false + } else KotlinBuiltIns.isPrimitiveClass((descriptor as ClassDescriptor?)!!) && !KotlinBuiltIns.isBoolean( + (descriptor as ClassDescriptor?)!! + ) +}