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) {
|
private void generateFor(@NotNull KtForExpression forExpression) {
|
||||||
ResolvedCall<? extends CallableDescriptor> loopRangeCall = RangeCodegenUtil.getLoopRangeResolvedCall(forExpression, bindingContext);
|
ResolvedCall<? extends CallableDescriptor> loopRangeCall = RangeCodegenUtil.getLoopRangeResolvedCall(forExpression, bindingContext);
|
||||||
if (loopRangeCall != null) {
|
if (loopRangeCall != null) {
|
||||||
CallableDescriptor loopRangeCallee = loopRangeCall.getResultingDescriptor();
|
AbstractForLoopGenerator optimizedForLoopGenerator = createOptimizedForLoopGeneratorOrNull(forExpression, loopRangeCall);
|
||||||
if (RangeCodegenUtil.isOptimizableRangeTo(loopRangeCallee)) {
|
if (optimizedForLoopGenerator != null) {
|
||||||
generateForLoop(createForInRangeLiteralLoopGenerator(forExpression, loopRangeCall));
|
generateForLoop(optimizedForLoopGenerator);
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (RangeCodegenUtil.isArrayOrPrimitiveArrayIndices(loopRangeCallee)) {
|
|
||||||
generateForLoop(createForInArrayIndicesRangeLoopGenerator(forExpression, loopRangeCall));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (RangeCodegenUtil.isCollectionIndices(loopRangeCallee)) {
|
|
||||||
generateForLoop(createForInCollectionIndicesRangeLoopGenerator(forExpression, loopRangeCall));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -634,31 +626,33 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private AbstractForLoopGenerator createForInRangeLiteralLoopGenerator(
|
@Nullable
|
||||||
|
private AbstractForLoopGenerator createOptimizedForLoopGeneratorOrNull(
|
||||||
@NotNull KtForExpression forExpression,
|
@NotNull KtForExpression forExpression,
|
||||||
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
|
@NotNull ResolvedCall<? extends CallableDescriptor> loopRangeCall
|
||||||
) {
|
) {
|
||||||
ReceiverValue from = loopRangeCall.getDispatchReceiver();
|
CallableDescriptor loopRangeCallee = loopRangeCall.getResultingDescriptor();
|
||||||
KtExpression to = loopRangeCall.getValueArgumentsByIndex().get(0).getArguments().get(0).getArgumentExpression();
|
if (RangeCodegenUtil.isOptimizableRangeTo(loopRangeCallee)) {
|
||||||
return new ForInRangeLiteralLoopGenerator(forExpression, from, to);
|
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(
|
return null;
|
||||||
@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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private OwnerKind contextKind() {
|
private OwnerKind contextKind() {
|
||||||
|
|||||||
Reference in New Issue
Block a user