From e9ccc0329ca238cbc321911363b76d85248d20a4 Mon Sep 17 00:00:00 2001 From: "vladislav.grechko" Date: Wed, 30 Aug 2023 09:15:00 +0000 Subject: [PATCH] Fix `isKotlinFunctionWithBigArity` function fixup! Fix `isKotlinFunctionWithBigArity` function Fix `isKotlinFunctionWithBigArity` function Previous implementation could return false positive results, e.g. for class named `abacaba.kotlin.Function42` ^KT-61548: Fixed Merge-request: KT-MR-11928 Merged-by: Vladislav Grechko --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../extendJavaClasses/kt61548.kt | 27 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../builtins/jvm/JavaToKotlinClassMap.kt | 11 ++++---- 8 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 08810f96a64..8594d700bee 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -3326,6 +3326,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/hashSet.kt"); } + @Test + @TestMetadata("kt61548.kt") + public void testKt61548() throws Exception { + runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt"); + } + @Test @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 8ad2ddf90ed..5854ed94a6d 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -3326,6 +3326,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/hashSet.kt"); } + @Test + @TestMetadata("kt61548.kt") + public void testKt61548() throws Exception { + runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt"); + } + @Test @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { diff --git a/compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt b/compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt new file mode 100644 index 00000000000..a006693fca1 --- /dev/null +++ b/compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt @@ -0,0 +1,27 @@ +// TARGET_BACKEND: JVM +// IGNORE_LIGHT_ANALYSIS + +// FILE: Function42.java + +package abacaba.kotlin; + +public abstract class Function42 implements CharSequence { + @Override + public char charAt(int index) { + return 'a'; + } +} + +// FILE: box.kt + +package abacaba.kotlin + +abstract class KACharSequence : Function42() { + companion object { + const val x = "OK" + } +} + +fun box(): String { + return KACharSequence.x +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 1760b0c15fe..fecd6d4777b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -3152,6 +3152,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/hashSet.kt"); } + @Test + @TestMetadata("kt61548.kt") + public void testKt61548() throws Exception { + runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt"); + } + @Test @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index cbcafe19d05..74bb270d3e8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -3326,6 +3326,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/hashSet.kt"); } + @Test + @TestMetadata("kt61548.kt") + public void testKt61548() throws Exception { + runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt"); + } + @Test @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 4bff5ae6538..f92ee0ddf29 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -3326,6 +3326,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/hashSet.kt"); } + @Test + @TestMetadata("kt61548.kt") + public void testKt61548() throws Exception { + runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt"); + } + @Test @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 5254844ef2f..d3e8a988e68 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2916,6 +2916,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/hashSet.kt"); } + @TestMetadata("kt61548.kt") + public void testKt61548() throws Exception { + runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/kt61548.kt"); + } + @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { runTest("compiler/testData/codegen/box/builtinStubMethods/extendJavaClasses/mapEntry.kt"); diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt index bc4afadf583..ec5affa418f 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt @@ -150,12 +150,11 @@ object JavaToKotlinClassMap { } private fun isKotlinFunctionWithBigArity(kotlinFqName: FqNameUnsafe, prefix: String): Boolean { - val arityString = kotlinFqName.asString().substringAfter(prefix, "") - if (arityString.isNotEmpty() && !arityString.startsWith('0')) { - val arity = arityString.toIntOrNull() - return arity != null && arity >= BuiltInFunctionArity.BIG_ARITY - } - return false + val fqNameAsString = kotlinFqName.asString() + if (!fqNameAsString.startsWith(prefix)) return false + val arityString = fqNameAsString.substring(prefix.length) + val arity = if (!arityString.startsWith('0')) arityString.toIntOrNull() else return false + return arity != null && arity >= BuiltInFunctionArity.BIG_ARITY } private fun addMapping(platformMutabilityMapping: PlatformMutabilityMapping) {