diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index cb40eaf4f11..f90b73798de 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -600,17 +600,9 @@ public class ExpressionCodegen extends KtVisitor impleme private void generateFor(@NotNull KtForExpression forExpression) { ResolvedCall 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 impleme } } - private AbstractForLoopGenerator createForInRangeLiteralLoopGenerator( + @Nullable + private AbstractForLoopGenerator createOptimizedForLoopGeneratorOrNull( @NotNull KtForExpression forExpression, @NotNull ResolvedCall 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 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 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 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() {