Support const-bound counter loop generation for 'downTo'
This commit is contained in:
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.isSubclass
|
||||
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
|
||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getFirstArgumentExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
@@ -420,11 +421,11 @@ fun extractReificationArgument(type: KotlinType): Pair<TypeParameterDescriptor,
|
||||
fun unwrapInitialSignatureDescriptor(function: FunctionDescriptor): FunctionDescriptor =
|
||||
function.initialSignatureDescriptor ?: function
|
||||
|
||||
fun ExpressionCodegen.generateCallReceiver(rangeCall: ResolvedCall<out CallableDescriptor>): StackValue =
|
||||
generateReceiverValue(rangeCall.extensionReceiver ?: rangeCall.dispatchReceiver!!, false)
|
||||
fun ExpressionCodegen.generateCallReceiver(call: ResolvedCall<out CallableDescriptor>): StackValue =
|
||||
generateReceiverValue(call.extensionReceiver ?: call.dispatchReceiver!!, false)
|
||||
|
||||
fun ExpressionCodegen.generateCallSingleArgument(rangeCall: ResolvedCall<out CallableDescriptor>): StackValue =
|
||||
gen(ExpressionCodegen.getSingleArgumentExpression(rangeCall)!!)
|
||||
fun ExpressionCodegen.generateCallSingleArgument(call: ResolvedCall<out CallableDescriptor>): StackValue =
|
||||
gen(call.getFirstArgumentExpression()!!)
|
||||
|
||||
fun ClassDescriptor.isPossiblyUninitializedSingleton() =
|
||||
DescriptorUtils.isEnumEntry(this) ||
|
||||
|
||||
+31
@@ -20,8 +20,11 @@ import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
||||
import org.jetbrains.kotlin.codegen.generateCallReceiver
|
||||
import org.jetbrains.kotlin.codegen.generateCallSingleArgument
|
||||
import org.jetbrains.kotlin.codegen.range.forLoop.ForInSimpleProgressionLoopGenerator
|
||||
import org.jetbrains.kotlin.codegen.range.forLoop.ForLoopGenerator
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtForExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getFirstArgumentExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getReceiverExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
|
||||
class DownToProgressionRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>) :
|
||||
@@ -35,8 +38,36 @@ class DownToProgressionRangeValue(rangeCall: ResolvedCall<out CallableDescriptor
|
||||
)
|
||||
|
||||
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
||||
createConstBoundedForInDownToGenerator(codegen, forExpression) ?:
|
||||
ForInSimpleProgressionLoopGenerator.fromBoundedValueWithStepMinus1(codegen, forExpression, getBoundedValue(codegen))
|
||||
|
||||
override fun createForInReversedLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
||||
createConstBoundedForInReversedDownToGenerator(codegen, forExpression) ?:
|
||||
ForInSimpleProgressionLoopGenerator.fromBoundedValueWithStep1(codegen, forExpression, getBoundedValue(codegen))
|
||||
|
||||
private fun createConstBoundedForInDownToGenerator(
|
||||
codegen: ExpressionCodegen,
|
||||
forExpression: KtForExpression
|
||||
): ForLoopGenerator? {
|
||||
val endExpression = rangeCall.getFirstArgumentExpression() ?: return null
|
||||
return createConstBoundedForLoopGeneratorOrNull(
|
||||
codegen, forExpression,
|
||||
codegen.generateCallReceiver(rangeCall),
|
||||
endExpression,
|
||||
-1
|
||||
)
|
||||
}
|
||||
|
||||
private fun createConstBoundedForInReversedDownToGenerator(
|
||||
codegen: ExpressionCodegen,
|
||||
forExpression: KtForExpression
|
||||
): ForLoopGenerator? {
|
||||
val endExpression = rangeCall.getReceiverExpression() ?: return null
|
||||
return createConstBoundedForLoopGeneratorOrNull(
|
||||
codegen, forExpression,
|
||||
codegen.generateCallSingleArgument(rangeCall),
|
||||
endExpression,
|
||||
1
|
||||
)
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -23,9 +23,9 @@ import org.jetbrains.kotlin.codegen.range.forLoop.ForInSimpleProgressionLoopGene
|
||||
import org.jetbrains.kotlin.codegen.range.forLoop.ForLoopGenerator
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtForExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getReceiverExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getFirstArgumentExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
class PrimitiveNumberRangeLiteralRangeValue(
|
||||
rangeCall: ResolvedCall<out CallableDescriptor>
|
||||
@@ -47,7 +47,7 @@ class PrimitiveNumberRangeLiteralRangeValue(
|
||||
codegen: ExpressionCodegen,
|
||||
forExpression: KtForExpression
|
||||
): ForLoopGenerator? {
|
||||
val endExpression = rangeCall.valueArgumentsByIndex?.run { get(0).arguments[0].getArgumentExpression() } ?: return null
|
||||
val endExpression = rangeCall.getFirstArgumentExpression() ?: return null
|
||||
return createConstBoundedForLoopGeneratorOrNull(
|
||||
codegen, forExpression,
|
||||
codegen.generateCallReceiver(rangeCall),
|
||||
@@ -60,7 +60,7 @@ class PrimitiveNumberRangeLiteralRangeValue(
|
||||
codegen: ExpressionCodegen,
|
||||
forExpression: KtForExpression
|
||||
): ForLoopGenerator? {
|
||||
val endExpression = rangeCall.extensionReceiver.safeAs<ExpressionReceiver>()?.expression ?: return null
|
||||
val endExpression = rangeCall.getReceiverExpression() ?: return null
|
||||
return createConstBoundedForLoopGeneratorOrNull(
|
||||
codegen, forExpression,
|
||||
codegen.generateCallSingleArgument(rangeCall),
|
||||
|
||||
Reference in New Issue
Block a user