diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt index 5e9b657d5de..7442b182faa 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeIntrinsicRangeValue.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.codegen.range.inExpression.InExpressionGenerator import org.jetbrains.kotlin.codegen.range.inExpression.InFloatingPointRangeLiteralExpressionGenerator import org.jetbrains.kotlin.codegen.range.inExpression.InIntegralContinuousRangeExpressionGenerator import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.isTopLevelInPackage import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt index 0418b50b018..8b7cfde114a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/RangeCodegenUtil.kt @@ -208,17 +208,25 @@ fun isPrimitiveRangeContains(descriptor: CallableDescriptor): Boolean { } fun isUnsignedIntegerRangeContains(descriptor: CallableDescriptor): Boolean { - if (descriptor.name.asString() != "contains") return false - val dispatchReceiverType = descriptor.dispatchReceiverParameter?.type val extensionReceiverType = descriptor.extensionReceiverParameter?.type - return (dispatchReceiverType != null && isUnsignedRange(dispatchReceiverType)) || - (extensionReceiverType != null && isUnsignedRange(extensionReceiverType)) + when { + dispatchReceiverType != null && extensionReceiverType == null -> { + if (descriptor.name.asString() != "contains") return false + return isUnsignedRange(dispatchReceiverType) + } + extensionReceiverType != null && dispatchReceiverType == null -> { + if (!descriptor.isTopLevelInPackage("contains", "kotlin.ranges")) return false + return isUnsignedRange(extensionReceiverType) + } + else -> + return false + } } fun isPrimitiveNumberRangeExtensionContainsPrimitiveNumber(descriptor: CallableDescriptor): Boolean { - if (descriptor.name.asString() != "contains") return false + if (!descriptor.isTopLevelInPackage("contains", "kotlin.ranges")) return false val extensionReceiverType = descriptor.extensionReceiverParameter?.type ?: return false diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index e118a1d2068..c8e7869f00d 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -20611,6 +20611,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt b/compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt new file mode 100644 index 00000000000..56930898fc4 --- /dev/null +++ b/compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt @@ -0,0 +1,12 @@ +// WITH_RUNTIME +// KJS_WITH_FULL_RUNTIME + +operator fun ClosedRange.contains(value: Long) = false +operator fun ClosedRange.contains(value: ULong) = false + +fun box(): String { + if (10L in 1..10) return "Failed: Long in Int..Int" + if (10UL in 1U..10U) return "Failed: ULong in UInt..UInt" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 8df5d378b01..7046df58952 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -22207,6 +22207,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e7dc61889c7..dde80c35d45 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -22207,6 +22207,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 30146ace1d6..45f5d958c21 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -20611,6 +20611,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index ba8da39592c..aacdbf871c9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -17137,6 +17137,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 004d0bccc91..e85f091219e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -17137,6 +17137,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index ba8b105ef31..1e2440ff05c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -17242,6 +17242,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/ranges/contains/rangeContainsString.kt"); } + @TestMetadata("userDefinedContainsExtension.kt") + public void testUserDefinedContainsExtension() throws Exception { + runTest("compiler/testData/codegen/box/ranges/contains/userDefinedContainsExtension.kt"); + } + @TestMetadata("compiler/testData/codegen/box/ranges/contains/generated") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)