KT-5044 code cleanup, test added
This commit is contained in:
@@ -3470,13 +3470,13 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
* Translates x in a..b to a <= x && x <= b
|
* Translates x in a..b to a <= x && x <= b
|
||||||
* and x !in a..b to a > x || x > b for any primitive type
|
* and x !in a..b to a > x || x > b for any primitive type
|
||||||
*/
|
*/
|
||||||
private void generateInPrimitiveRange(StackValue leftValue, KtBinaryExpression rangeExpression, boolean isInverted) {
|
private void generateInPrimitiveRange(StackValue argument, KtBinaryExpression rangeExpression, boolean isInverted) {
|
||||||
Type rangeType = leftValue.type;
|
Type rangeType = argument.type;
|
||||||
int localVarIndex = myFrameMap.enterTemp(rangeType);
|
int localVarIndex = myFrameMap.enterTemp(rangeType);
|
||||||
// Load left bound
|
// Load left bound
|
||||||
gen(rangeExpression.getLeft(), rangeType);
|
gen(rangeExpression.getLeft(), rangeType);
|
||||||
// Load x into local variable to avoid StackValue#put side-effects
|
// Load x into local variable to avoid StackValue#put side-effects
|
||||||
leftValue.put(rangeType, v);
|
argument.put(rangeType, v);
|
||||||
v.store(localVarIndex, rangeType);
|
v.store(localVarIndex, rangeType);
|
||||||
v.load(localVarIndex, rangeType);
|
v.load(localVarIndex, rangeType);
|
||||||
|
|
||||||
|
|||||||
@@ -217,15 +217,6 @@ public class RangeCodegenUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isBuiltInRangeTo(@NotNull CallableDescriptor descriptor) {
|
|
||||||
if (!isTopLevelInPackage(descriptor, "rangeTo", "kotlin.ranges")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReceiverParameterDescriptor extensionReceiver = descriptor.getExtensionReceiverParameter();
|
|
||||||
return extensionReceiver != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Checks whether for expression 'x in a..b' a..b is primitive integral range
|
* Checks whether for expression 'x in a..b' a..b is primitive integral range
|
||||||
* with same type as x.
|
* with same type as x.
|
||||||
@@ -256,6 +247,15 @@ public class RangeCodegenUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isBuiltInRangeTo(@NotNull CallableDescriptor descriptor) {
|
||||||
|
if (!isTopLevelInPackage(descriptor, "rangeTo", "kotlin.ranges")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReceiverParameterDescriptor extensionReceiver = descriptor.getExtensionReceiverParameter();
|
||||||
|
return extensionReceiver != null;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean isTopLevelInPackage(@NotNull CallableDescriptor descriptor, @NotNull String name, @NotNull String packageName) {
|
private static boolean isTopLevelInPackage(@NotNull CallableDescriptor descriptor, @NotNull String name, @NotNull String packageName) {
|
||||||
if (!name.equals(descriptor.getName().asString())) return false;
|
if (!name.equals(descriptor.getName().asString())) return false;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun check(x: Any?): Boolean {
|
||||||
|
if (x is Int) {
|
||||||
|
return x in 239..240
|
||||||
|
}
|
||||||
|
|
||||||
|
throw java.lang.AssertionError()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun check(x: Any?, l: Any?, r: Any?): Boolean {
|
||||||
|
if (x is Int && l is Int && r is Int) {
|
||||||
|
return x in l..r
|
||||||
|
}
|
||||||
|
|
||||||
|
throw java.lang.AssertionError()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
assert(check(239))
|
||||||
|
assert(check(239, 239, 240))
|
||||||
|
assert(!check(238))
|
||||||
|
assert(!check(238, 239, 240))
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -11271,6 +11271,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inRangeWithSmartCast.kt")
|
||||||
|
public void testInRangeWithSmartCast() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/contains/inRangeWithSmartCast.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("rangeContainsString.kt")
|
@TestMetadata("rangeContainsString.kt")
|
||||||
public void testRangeContainsString() throws Exception {
|
public void testRangeContainsString() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user