Move range utils into common compiler part
This commit is contained in:
committed by
teamcity
parent
100d7123c2
commit
4363667bc1
@@ -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
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -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(
|
||||
|
||||
+1
@@ -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,
|
||||
|
||||
+1
@@ -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<out CallableDescriptor>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -1,269 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 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
|
||||
|
||||
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
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.KtForExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
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)
|
||||
|
||||
fun isUnsignedRange(rangeType: KotlinType): Boolean =
|
||||
isClassTypeWithFqn(rangeType, UNSIGNED_RANGE_FQNS)
|
||||
|
||||
fun isPrimitiveProgression(rangeType: KotlinType) =
|
||||
isClassTypeWithFqn(rangeType, PRIMITIVE_PROGRESSION_FQNS)
|
||||
|
||||
fun isUnsignedProgression(rangeType: KotlinType) =
|
||||
isClassTypeWithFqn(rangeType, UNSIGNED_PROGRESSION_FQNS)
|
||||
|
||||
private val KotlinType.classFqnString: String?
|
||||
get() {
|
||||
val declarationDescriptor = constructor.declarationDescriptor as? ClassDescriptor ?: return null
|
||||
val fqn = DescriptorUtils.getFqName(declarationDescriptor)
|
||||
return if (fqn.isSafe) fqn.asString() else null
|
||||
}
|
||||
|
||||
private fun isClassTypeWithFqn(kotlinType: KotlinType, fqns: Set<String>): 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"
|
||||
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"
|
||||
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"
|
||||
private const val CLOSED_DOUBLE_RANGE_FQN = "kotlin.ranges.ClosedDoubleRange"
|
||||
private const val CLOSED_RANGE_FQN = "kotlin.ranges.ClosedRange"
|
||||
private const val CLOSED_FLOATING_POINT_RANGE_FQN = "kotlin.ranges.ClosedFloatingPointRange"
|
||||
private const val COMPARABLE_RANGE_FQN = "kotlin.ranges.ComparableRange"
|
||||
|
||||
internal const val UINT_RANGE_FQN = "kotlin.ranges.UIntRange"
|
||||
internal const val ULONG_RANGE_FQN = "kotlin.ranges.ULongRange"
|
||||
private val UNSIGNED_RANGE_FQNS = setOf(UINT_RANGE_FQN, ULONG_RANGE_FQN)
|
||||
|
||||
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? {
|
||||
val rangeClassDescriptor = rangeType.constructor.declarationDescriptor as? ClassDescriptor ?: return null
|
||||
val builtIns = rangeClassDescriptor.builtIns
|
||||
|
||||
return when (rangeClassDescriptor.fqNameSafe.asString()) {
|
||||
CHAR_RANGE_FQN, CHAR_PROGRESSION_FQN -> builtIns.charType
|
||||
INT_RANGE_FQN, INT_PROGRESSION_FQN -> builtIns.intType
|
||||
LONG_RANGE_FQN, LONG_PROGRESSION_FQN -> builtIns.longType
|
||||
|
||||
CLOSED_FLOAT_RANGE_FQN -> builtIns.floatType
|
||||
CLOSED_DOUBLE_RANGE_FQN -> builtIns.doubleType
|
||||
|
||||
CLOSED_RANGE_FQN -> rangeType.arguments.singleOrNull()?.type
|
||||
CLOSED_FLOATING_POINT_RANGE_FQN -> rangeType.arguments.singleOrNull()?.type
|
||||
COMPARABLE_RANGE_FQN -> rangeType.arguments.singleOrNull()?.type
|
||||
|
||||
UINT_RANGE_FQN, UINT_PROGRESSION_FQN ->
|
||||
rangeClassDescriptor.findTypeInModuleByTopLevelClassFqName(StandardNames.FqNames.uIntFqName)
|
||||
|
||||
ULONG_RANGE_FQN, ULONG_PROGRESSION_FQN ->
|
||||
rangeClassDescriptor.findTypeInModuleByTopLevelClassFqName(StandardNames.FqNames.uLongFqName)
|
||||
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
private fun DeclarationDescriptor.findTypeInModuleByTopLevelClassFqName(fqName: FqName) =
|
||||
module.findClassAcrossModuleDependencies(ClassId.topLevel(fqName))?.defaultType
|
||||
|
||||
fun BindingContext.getElementType(forExpression: KtForExpression): KotlinType {
|
||||
val loopRange = forExpression.loopRange!!
|
||||
val nextCall = get(BindingContext.LOOP_RANGE_NEXT_RESOLVED_CALL, loopRange)
|
||||
?: throw AssertionError("No next() function " + PsiDiagnosticUtils.atLocation(loopRange))
|
||||
return nextCall.resultingDescriptor.returnType!!
|
||||
}
|
||||
|
||||
fun isPrimitiveNumberRangeTo(rangeTo: CallableDescriptor) =
|
||||
"rangeTo" == rangeTo.name.asString() && isPrimitiveNumberClassDescriptor(rangeTo.containingDeclaration) ||
|
||||
isPrimitiveRangeToExtension(rangeTo)
|
||||
|
||||
fun isUnsignedIntegerRangeTo(rangeTo: CallableDescriptor) =
|
||||
"rangeTo" == rangeTo.name.asString() && isUnsignedIntegerClassDescriptor(rangeTo.containingDeclaration)
|
||||
|
||||
fun isUnsignedIntegerClassDescriptor(descriptor: DeclarationDescriptor?) =
|
||||
descriptor != null && UnsignedTypes.isUnsignedClass(descriptor)
|
||||
|
||||
private inline fun CallableDescriptor.isTopLevelExtensionOnType(
|
||||
name: String,
|
||||
packageFQN: String,
|
||||
receiverTypePredicate: (KotlinType) -> Boolean
|
||||
): Boolean {
|
||||
if (!this.isTopLevelInPackage(name, packageFQN)) return false
|
||||
val extensionReceiverType = original.extensionReceiverParameter?.type ?: return false
|
||||
return receiverTypePredicate(extensionReceiverType)
|
||||
}
|
||||
|
||||
private fun isPrimitiveRangeToExtension(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("rangeTo", "kotlin.ranges") {
|
||||
KotlinBuiltIns.isPrimitiveType(it)
|
||||
}
|
||||
|
||||
fun isPrimitiveNumberDownTo(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("downTo", "kotlin.ranges") {
|
||||
isPrimitiveNumberClassDescriptor(it.constructor.declarationDescriptor)
|
||||
}
|
||||
|
||||
fun isUnsignedIntegerDownTo(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("downTo", "kotlin.ranges") {
|
||||
isUnsignedIntegerClassDescriptor(it.constructor.declarationDescriptor)
|
||||
}
|
||||
|
||||
fun isPrimitiveNumberUntil(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("until", "kotlin.ranges") {
|
||||
isPrimitiveNumberClassDescriptor(it.constructor.declarationDescriptor)
|
||||
}
|
||||
|
||||
fun isUnsignedIntegerUntil(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("until", "kotlin.ranges") {
|
||||
isUnsignedIntegerClassDescriptor(it.constructor.declarationDescriptor)
|
||||
}
|
||||
|
||||
fun isArrayOrPrimitiveArrayIndices(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("indices", "kotlin.collections") {
|
||||
KotlinBuiltIns.isArray(it) || KotlinBuiltIns.isPrimitiveArray(it)
|
||||
}
|
||||
|
||||
fun isArrayOrPrimitiveArrayWithIndex(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("withIndex", "kotlin.collections") {
|
||||
KotlinBuiltIns.isArray(it) || KotlinBuiltIns.isPrimitiveArray(it)
|
||||
}
|
||||
|
||||
fun isCollectionIndices(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("indices", "kotlin.collections") {
|
||||
KotlinBuiltIns.isCollectionOrNullableCollection(it)
|
||||
}
|
||||
|
||||
fun isIterableWithIndex(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("withIndex", "kotlin.collections") {
|
||||
KotlinBuiltIns.isIterableOrNullableIterable(it)
|
||||
}
|
||||
|
||||
fun isSequenceWithIndex(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("withIndex", "kotlin.sequences") {
|
||||
val typeDescriptor = it.constructor.declarationDescriptor ?: return false
|
||||
typeDescriptor.isTopLevelInPackage("Sequence", "kotlin.sequences")
|
||||
}
|
||||
|
||||
fun isCharSequenceIndices(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("indices", "kotlin.text") {
|
||||
KotlinBuiltIns.isCharSequenceOrNullableCharSequence(it)
|
||||
}
|
||||
|
||||
fun isCharSequenceWithIndex(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("withIndex", "kotlin.text") {
|
||||
KotlinBuiltIns.isCharSequenceOrNullableCharSequence(it)
|
||||
}
|
||||
|
||||
fun isComparableRangeTo(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("rangeTo", "kotlin.ranges") {
|
||||
val extensionReceiverTypeDescriptor = it.constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false
|
||||
val upperBoundType = extensionReceiverTypeDescriptor.upperBounds.singleOrNull() ?: return false
|
||||
val upperBoundClassDescriptor = upperBoundType.constructor.declarationDescriptor as? ClassDescriptor ?: return false
|
||||
upperBoundClassDescriptor.isTopLevelInPackage("Comparable", "kotlin")
|
||||
}
|
||||
|
||||
fun isClosedRangeContains(descriptor: CallableDescriptor): Boolean {
|
||||
if (descriptor.name.asString() != "contains") return false
|
||||
val containingClassDescriptor = descriptor.containingDeclaration as? ClassDescriptor ?: return false
|
||||
if (!containingClassDescriptor.isTopLevelInPackage("ClosedRange", "kotlin.ranges")) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun isPrimitiveRangeContains(descriptor: CallableDescriptor): Boolean {
|
||||
if (descriptor.name.asString() != "contains") return false
|
||||
val dispatchReceiverType = descriptor.dispatchReceiverParameter?.type ?: return false
|
||||
if (!isPrimitiveRange(dispatchReceiverType)) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun isUnsignedIntegerRangeContains(descriptor: CallableDescriptor): Boolean {
|
||||
val dispatchReceiverType = descriptor.dispatchReceiverParameter?.type
|
||||
val extensionReceiverType = descriptor.extensionReceiverParameter?.type
|
||||
|
||||
when {
|
||||
dispatchReceiverType != null && extensionReceiverType == null -> {
|
||||
if (descriptor.name.asString() != "contains") return false
|
||||
return isUnsignedRange(dispatchReceiverType)
|
||||
}
|
||||
extensionReceiverType != null && dispatchReceiverType == null -> {
|
||||
if (!descriptor.isTopLevelInPackage("contains", "kotlin.ranges")) return false
|
||||
return isUnsignedRange(extensionReceiverType)
|
||||
}
|
||||
else ->
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
fun isPrimitiveNumberRangeExtensionContainsPrimitiveNumber(descriptor: CallableDescriptor): Boolean {
|
||||
if (!descriptor.isTopLevelInPackage("contains", "kotlin.ranges")) return false
|
||||
|
||||
val extensionReceiverType = descriptor.extensionReceiverParameter?.type ?: return false
|
||||
|
||||
val rangeElementType = getRangeOrProgressionElementType(extensionReceiverType) ?: return false
|
||||
if (!isPrimitiveNumberType(rangeElementType)) return false
|
||||
|
||||
val argumentType = descriptor.valueParameters.singleOrNull()?.type ?: return false
|
||||
if (!isPrimitiveNumberType(argumentType)) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun isPrimitiveProgressionReverse(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("reversed", "kotlin.ranges") {
|
||||
isPrimitiveProgression(it)
|
||||
}
|
||||
|
||||
private fun isPrimitiveNumberType(type: KotlinType) =
|
||||
KotlinBuiltIns.isByte(type) ||
|
||||
KotlinBuiltIns.isShort(type) ||
|
||||
KotlinBuiltIns.isInt(type) ||
|
||||
KotlinBuiltIns.isChar(type) ||
|
||||
KotlinBuiltIns.isLong(type) ||
|
||||
KotlinBuiltIns.isFloat(type) ||
|
||||
KotlinBuiltIns.isDouble(type)
|
||||
|
||||
fun isClosedFloatingPointRangeContains(descriptor: CallableDescriptor): Boolean {
|
||||
if (descriptor.name.asString() != "contains") return false
|
||||
val containingClassDescriptor = descriptor.containingDeclaration as? ClassDescriptor ?: return false
|
||||
if (!containingClassDescriptor.isTopLevelInPackage("ClosedFloatingPointRange", "kotlin.ranges")) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
fun isCharSequenceIterator(descriptor: CallableDescriptor) =
|
||||
descriptor.isTopLevelExtensionOnType("iterator", "kotlin.text") {
|
||||
it.constructor.declarationDescriptor?.isTopLevelInPackage("CharSequence", "kotlin")
|
||||
?: false
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user