From fdfb544730864696c2432e0110c046d245c92f0d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 21 Apr 2020 22:03:58 +0300 Subject: [PATCH] FIR: use Kotlin String constructors instead of java.lang ones #KT-38437 fixed --- .../resolveWithStdlib/stringConstructors.kt | 22 ++++++++++++++ .../resolveWithStdlib/stringConstructors.txt | 14 +++++++++ ...FirDiagnosticsWithStdlibTestGenerated.java | 5 ++++ .../kotlin/fir/scopes/jvm/JvmMappedScope.kt | 30 ++++++++++++++----- 4 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.kt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.txt diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.kt new file mode 100644 index 00000000000..c83467c243a --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.kt @@ -0,0 +1,22 @@ +// FULL_JDK + +fun consumeString(s: String) {} + +fun foo( + byteArray: ByteArray, + charArray: CharArray, + intArray: IntArray, + charset: java.nio.charset.Charset, + stringBuilder: java.lang.StringBuilder, + stringBuffer: java.lang.StringBuffer +) { + consumeString(String()) + consumeString(String(byteArray, 0, 1, charset)) + consumeString(String(byteArray, charset)) + consumeString(String(byteArray)) + consumeString(String(charArray)) + consumeString(String(charArray, 0, 1)) + consumeString(String(intArray, 0, 1)) + consumeString(String(stringBuffer)) + consumeString(String(stringBuilder)) +} \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.txt new file mode 100644 index 00000000000..bea30f85341 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.txt @@ -0,0 +1,14 @@ +FILE: stringConstructors.kt + public final fun consumeString(s: R|kotlin/String|): R|kotlin/Unit| { + } + public final fun foo(byteArray: R|kotlin/ByteArray|, charArray: R|kotlin/CharArray|, intArray: R|kotlin/IntArray|, charset: R|java/nio/charset/Charset|, stringBuilder: R|java/lang/StringBuilder|, stringBuffer: R|java/lang/StringBuffer|): R|kotlin/Unit| { + R|/consumeString|(R|kotlin/String.String|()) + R|/consumeString|(R|kotlin/text/String|(R|/byteArray|, Int(0), Int(1), R|/charset|)) + R|/consumeString|(R|kotlin/text/String|(R|/byteArray|, R|/charset|)) + R|/consumeString|(R|kotlin/text/String|(R|/byteArray|)) + R|/consumeString|(R|kotlin/text/String|(R|/charArray|)) + R|/consumeString|(R|kotlin/text/String|(R|/charArray|, Int(0), Int(1))) + R|/consumeString|(R|kotlin/text/String|(R|/intArray|, Int(0), Int(1))) + R|/consumeString|(R|kotlin/text/String|(R|/stringBuffer|)) + R|/consumeString|(R|kotlin/text/String|(R|/stringBuilder|)) + } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index 3f830886973..126ad49f60c 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -233,6 +233,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/simpleLazy.kt"); } + @TestMetadata("stringConstructors.kt") + public void testStringConstructors() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/stringConstructors.kt"); + } + @TestMetadata("toSortedMapWithComparator.kt") public void testToSortedMapWithComparator() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/toSortedMapWithComparator.kt"); diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt index b37c6cbf244..f7083c2f6d0 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt @@ -71,13 +71,29 @@ class JvmMappedScope( } // NOTE: No-arg constructors - private val additionalConstructorBlackList = setOf( - "java/lang/String.()V", - "java/lang/Throwable.()V", - "java/lang/Throwable.(Ljava/lang/String;Ljava/lang/Throwable;)V", - "java/lang/Throwable.(Ljava/lang/Throwable;)V", - "java/lang/Throwable.(Ljava/lang/String;)V" - ) + @OptIn(ExperimentalStdlibApi::class) + private val additionalConstructorBlackList = buildSet { + // kotlin.text.String pseudo-constructors should be used instead of java.lang.String constructors + listOf( + "", + "Lkotlin/ByteArray;IILjava/nio/charset/Charset;", + "Lkotlin/ByteArray;Ljava/nio/charset/Charset;", + "Lkotlin/ByteArray;II", + "Lkotlin/ByteArray;", + "Lkotlin/CharArray;", + "Lkotlin/CharArray;II", + "Lkotlin/IntArray;II", + "Ljava/lang/StringBuffer;", + "Ljava/lang/StringBuilder;", + ).mapTo(this) { arguments -> "java/lang/String.($arguments)V" } + + listOf( + "", + "Ljava/lang/String;Ljava/lang/Throwable;", + "Ljava/lang/Throwable;", + "Ljava/lang/String;" + ).mapTo(this) { arguments -> "java/lang/Throwable.($arguments)V" } + } fun prepareSignatures(klass: FirRegularClass): Signatures {