Minor: extract optimized loop codegen creation logic for optimized 'for' cases.
There will be some more of those, and they all require some ad hock processing.
This commit is contained in:
@@ -600,17 +600,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
private void generateFor(@NotNull KtForExpression forExpression) {
|
||||
ResolvedCall<? extends CallableDescriptor> loopRangeCall = RangeCodegenUtil.getLoopRangeResolvedCall(forExpression, bindingContext);
|
||||
if (loopRangeCall != null) {
|
||||
CallableDescriptor loopRangeCallee = loopRangeCall.getResultingDescriptor();
|
||||
if (RangeCodegenUtil.isOptimizableRangeTo(loopRangeCallee)) {
|
||||
generateForLoop(createForInRangeLiteralLoopGenerator(forExpression, loopRangeCall));
|
||||
return;
|
||||
}
|
||||
else if (RangeCodegenUtil.isArrayOrPrimitiveArrayIndices(loopRangeCallee)) {
|
||||
generateForLoop(createForInArrayIndicesRangeLoopGenerator(forExpression, loopRangeCall));
|
||||
return;
|
||||
}
|
||||
else if (RangeCodegenUtil.isCollectionIndices(loopRangeCallee)) {
|
||||
generateForLoop(createForInCollectionIndicesRangeLoopGenerator(forExpression, loopRangeCall));
|
||||
AbstractForLoopGenerator optimizedForLoopGenerator = createOptimizedForLoopGeneratorOrNull(forExpression, loopRangeCall);
|
||||
if (optimizedForLoopGenerator != null) {
|
||||
generateForLoop(optimizedForLoopGenerator);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -634,31 +626,33 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
}
|
||||
}
|
||||
|
||||
private AbstractForLoopGenerator createForInRangeLiteralLoopGenerator(
|
||||
@Nullable
|
||||
private AbstractForLoopGenerator createOptimizedForLoopGeneratorOrNull(
|
||||
@NotNull KtForExpression forExpression,
|
||||
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
|
||||
) {
|
||||
ReceiverValue from = loopRangeCall.getDispatchReceiver();
|
||||
KtExpression to = loopRangeCall.getValueArgumentsByIndex().get(0).getArguments().get(0).getArgumentExpression();
|
||||
return new ForInRangeLiteralLoopGenerator(forExpression, from, to);
|
||||
}
|
||||
CallableDescriptor loopRangeCallee = loopRangeCall.getResultingDescriptor();
|
||||
if (RangeCodegenUtil.isOptimizableRangeTo(loopRangeCallee)) {
|
||||
ReceiverValue from = loopRangeCall.getDispatchReceiver();
|
||||
assert from != null : "Dispatch receiver should be non-null for optimizable 'rangeTo' call";
|
||||
List<ResolvedValueArgument> valueArgumentsByIndex = loopRangeCall.getValueArgumentsByIndex();
|
||||
assert valueArgumentsByIndex != null : "Value arguments should be non-null for optimizable 'rangeTo' call";
|
||||
KtExpression to = valueArgumentsByIndex.get(0).getArguments().get(0).getArgumentExpression();
|
||||
assert to != null : "1st value argument should be non-null for optimizable 'rangeTo' call";
|
||||
return new ForInRangeLiteralLoopGenerator(forExpression, from, to);
|
||||
}
|
||||
else if (RangeCodegenUtil.isArrayOrPrimitiveArrayIndices(loopRangeCallee)) {
|
||||
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
|
||||
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'Array.indices' call";
|
||||
return new ForInArrayIndicesRangeLoopGenerator(forExpression, extensionReceiver);
|
||||
}
|
||||
else if (RangeCodegenUtil.isCollectionIndices(loopRangeCallee)) {
|
||||
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
|
||||
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'Collection.indices' call";
|
||||
return new ForInCollectionIndicesRangeLoopGenerator(forExpression, extensionReceiver);
|
||||
}
|
||||
|
||||
private AbstractForLoopGenerator createForInCollectionIndicesRangeLoopGenerator(
|
||||
@NotNull KtForExpression forExpression,
|
||||
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
|
||||
) {
|
||||
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
|
||||
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'indices' call";
|
||||
return new ForInCollectionIndicesRangeLoopGenerator(forExpression, extensionReceiver);
|
||||
}
|
||||
|
||||
private AbstractForLoopGenerator createForInArrayIndicesRangeLoopGenerator(
|
||||
@NotNull KtForExpression forExpression,
|
||||
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
|
||||
) {
|
||||
ReceiverValue extensionReceiver = loopRangeCall.getExtensionReceiver();
|
||||
assert extensionReceiver != null : "Extension receiver should be non-null for optimizable 'indices' call";
|
||||
return new ForInArrayIndicesRangeLoopGenerator(forExpression, extensionReceiver);
|
||||
return null;
|
||||
}
|
||||
|
||||
private OwnerKind contextKind() {
|
||||
|
||||
Reference in New Issue
Block a user