From 7c6375c85a457f2870728edc13a17f5e21b8eba3 Mon Sep 17 00:00:00 2001 From: strangepleasures Date: Tue, 21 Nov 2023 13:20:26 +0000 Subject: [PATCH] KT-63552 [SLC] Support empty arrays in property initializers and default parameter values --- .../api/fir/evaluate/FirAnnotationValueConverter.kt | 3 ++- .../lightClassByPsi/defaultParameterValue.fir.java | 10 +++++++++- .../lightClassByPsi/defaultParameterValue.java | 10 +++++++++- .../lightClassByPsi/defaultParameterValue.kt | 4 +++- .../lightClassByPsi/defaultParameterValue.lib.java | 10 +++++++++- .../unsafePropertyInitializers.descriptors.java | 12 ++++++++++++ .../lightClassByPsi/unsafePropertyInitializers.java | 12 ++++++++++++ .../lightClassByPsi/unsafePropertyInitializers.kt | 4 +++- .../unsafePropertyInitializers.lib.java | 12 ++++++++++++ 9 files changed, 71 insertions(+), 6 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt index 6ee54804b36..cf58ea2e620 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt @@ -148,7 +148,8 @@ internal object FirAnnotationValueConverter { is FirNamedFunctionSymbol -> { // arrayOf call with a single vararg argument. if (resolvedSymbol.callableId.asSingleFqName() in ArrayFqNames.ARRAY_CALL_FQ_NAMES) - argumentList.arguments.single().convertConstantExpression(builder) + argumentList.arguments.singleOrNull()?.convertConstantExpression(builder) + ?: KtArrayAnnotationValue(emptyList(), sourcePsi) else null } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.fir.java index ba9c5b86e13..5ac83138053 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.fir.java @@ -36,6 +36,9 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() private final java.lang.String s = "foo" /* initializer type: java.lang.String */; + @org.jetbrains.annotations.NotNull() + private final java.lang.String[] empty = {} /* initializer type: null */; + @org.jetbrains.annotations.NotNull() private final java.lang.String[] sarr = {"a", "bc"} /* initializer type: null */; @@ -81,6 +84,9 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() public final java.lang.String getS();// getS() + @org.jetbrains.annotations.NotNull() + public final java.lang.String[] getEmpty();// getEmpty() + @org.jetbrains.annotations.NotNull() public final java.lang.String[] getSarr();// getSarr() @@ -89,7 +95,7 @@ public final class Foo /* Foo*/ { public Foo();// .ctor() - public Foo(boolean, byte, char, char, short, int, long, float, double, @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() long[], @org.jetbrains.annotations.NotNull() double[], @org.jetbrains.annotations.NotNull() java.lang.String[], @org.jetbrains.annotations.NotNull() java.lang.Class, @org.jetbrains.annotations.NotNull() java.lang.Class[], @org.jetbrains.annotations.NotNull() Em, @org.jetbrains.annotations.NotNull() Em[]);// .ctor(boolean, byte, char, char, short, int, long, float, double, java.lang.String, int[], long[], double[], java.lang.String[], java.lang.Class, java.lang.Class[], Em, Em[]) + public Foo(boolean, byte, char, char, short, int, long, float, double, @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() long[], @org.jetbrains.annotations.NotNull() double[], @org.jetbrains.annotations.NotNull() java.lang.String[], @org.jetbrains.annotations.NotNull() java.lang.Class, @org.jetbrains.annotations.NotNull() java.lang.Class[], @org.jetbrains.annotations.NotNull() Em, @org.jetbrains.annotations.NotNull() Em[], @org.jetbrains.annotations.NotNull() java.lang.String[]);// .ctor(boolean, byte, char, char, short, int, long, float, double, java.lang.String, int[], long[], double[], java.lang.String[], java.lang.Class, java.lang.Class[], Em, Em[], java.lang.String[]) public final boolean getZ();// getZ() @@ -109,5 +115,7 @@ public final class Foo /* Foo*/ { public final short getSh();// getSh() + public final void bar(@org.jetbrains.annotations.NotNull() int[]);// bar(int[]) + public final void foo(int);// foo(int) } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.java index bcf2f0c6dfc..87f97d0b180 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.java @@ -33,6 +33,9 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() private final java.lang.String s; + @org.jetbrains.annotations.NotNull() + private final java.lang.String[] empty; + @org.jetbrains.annotations.NotNull() private final java.lang.String[] sarr; @@ -78,6 +81,9 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() public final java.lang.String getS();// getS() + @org.jetbrains.annotations.NotNull() + public final java.lang.String[] getEmpty();// getEmpty() + @org.jetbrains.annotations.NotNull() public final java.lang.String[] getSarr();// getSarr() @@ -86,7 +92,7 @@ public final class Foo /* Foo*/ { public Foo();// .ctor() - public Foo(boolean, byte, char, char, short, int, long, float, double, @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() long[], @org.jetbrains.annotations.NotNull() double[], @org.jetbrains.annotations.NotNull() java.lang.String[], @org.jetbrains.annotations.NotNull() java.lang.Class, @org.jetbrains.annotations.NotNull() java.lang.Class[], @org.jetbrains.annotations.NotNull() Em, @org.jetbrains.annotations.NotNull() Em[]);// .ctor(boolean, byte, char, char, short, int, long, float, double, java.lang.String, int[], long[], double[], java.lang.String[], java.lang.Class, java.lang.Class[], Em, Em[]) + public Foo(boolean, byte, char, char, short, int, long, float, double, @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() long[], @org.jetbrains.annotations.NotNull() double[], @org.jetbrains.annotations.NotNull() java.lang.String[], @org.jetbrains.annotations.NotNull() java.lang.Class, @org.jetbrains.annotations.NotNull() java.lang.Class[], @org.jetbrains.annotations.NotNull() Em, @org.jetbrains.annotations.NotNull() Em[], @org.jetbrains.annotations.NotNull() java.lang.String[]);// .ctor(boolean, byte, char, char, short, int, long, float, double, java.lang.String, int[], long[], double[], java.lang.String[], java.lang.Class, java.lang.Class[], Em, Em[], java.lang.String[]) public final boolean getZ();// getZ() @@ -106,5 +112,7 @@ public final class Foo /* Foo*/ { public final short getSh();// getSh() + public final void bar(@org.jetbrains.annotations.NotNull() int[]);// bar(int[]) + public final void foo(int);// foo(int) } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.kt index 70031bb1253..b8e70c6b870 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.kt +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.kt @@ -17,9 +17,11 @@ class Foo( val cl: Class<*> = Foo::class.java, val clarr: Array> = arrayOf(Foo::class.java), val em: Em = Em.BAR, - val emarr: Array = arrayOf(Em.FOO, Em.BAR) + val emarr: Array = arrayOf(Em.FOO, Em.BAR), + val empty: Array = arrayOf() ) { fun foo(a: Int = 5) {} + fun bar(x: IntArray = intArrayOf()) {} } enum class Em { diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.lib.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.lib.java index 7f3af619712..2a3146d403f 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.lib.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/defaultParameterValue.lib.java @@ -36,6 +36,9 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() private final java.lang.String s; + @org.jetbrains.annotations.NotNull() + private final java.lang.String[] empty; + @org.jetbrains.annotations.NotNull() private final java.lang.String[] sarr; @@ -81,6 +84,9 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() public final java.lang.String getS();// getS() + @org.jetbrains.annotations.NotNull() + public final java.lang.String[] getEmpty();// getEmpty() + @org.jetbrains.annotations.NotNull() public final java.lang.String[] getSarr();// getSarr() @@ -89,7 +95,7 @@ public final class Foo /* Foo*/ { public Foo();// .ctor() - public Foo(boolean, byte, char, char, short, int, long, float, double, @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() long[], @org.jetbrains.annotations.NotNull() double[], @org.jetbrains.annotations.NotNull() java.lang.String[], @org.jetbrains.annotations.NotNull() java.lang.Class, @org.jetbrains.annotations.NotNull() java.lang.Class[], @org.jetbrains.annotations.NotNull() Em, @org.jetbrains.annotations.NotNull() Em[]);// .ctor(boolean, byte, char, char, short, int, long, float, double, java.lang.String, int[], long[], double[], java.lang.String[], java.lang.Class, java.lang.Class[], Em, Em[]) + public Foo(boolean, byte, char, char, short, int, long, float, double, @org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() long[], @org.jetbrains.annotations.NotNull() double[], @org.jetbrains.annotations.NotNull() java.lang.String[], @org.jetbrains.annotations.NotNull() java.lang.Class, @org.jetbrains.annotations.NotNull() java.lang.Class[], @org.jetbrains.annotations.NotNull() Em, @org.jetbrains.annotations.NotNull() Em[], @org.jetbrains.annotations.NotNull() java.lang.String[]);// .ctor(boolean, byte, char, char, short, int, long, float, double, java.lang.String, int[], long[], double[], java.lang.String[], java.lang.Class, java.lang.Class[], Em, Em[], java.lang.String[]) public final boolean getZ();// getZ() @@ -109,5 +115,7 @@ public final class Foo /* Foo*/ { public final short getSh();// getSh() + public final void bar(@org.jetbrains.annotations.NotNull() int[]);// bar(int[]) + public final void foo(int);// foo(int) } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.descriptors.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.descriptors.java index c52f005546e..34dadcc0f2e 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.descriptors.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.descriptors.java @@ -11,6 +11,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() private static final int[] arrayOfIntPrimitives; + @org.jetbrains.annotations.NotNull() + private static final int[] emptyArayOfInts; + @org.jetbrains.annotations.NotNull() private static final java.lang.Character[] arrayOfCharObjects; @@ -32,6 +35,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() private static final java.lang.String[] arrayOfStrings; + @org.jetbrains.annotations.NotNull() + private static final java.lang.String[] emptyArayOfStrings; + @org.jetbrains.annotations.NotNull() private static final java.util.List listOfStrings; @@ -56,6 +62,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() public static final int[] getArrayOfIntPrimitives();// getArrayOfIntPrimitives() + @org.jetbrains.annotations.NotNull() + public static final int[] getEmptyArayOfInts();// getEmptyArayOfInts() + @org.jetbrains.annotations.NotNull() public static final java.lang.Character[] getArrayOfCharObjects();// getArrayOfCharObjects() @@ -77,6 +86,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() public static final java.lang.String[] getArrayOfStrings();// getArrayOfStrings() + @org.jetbrains.annotations.NotNull() + public static final java.lang.String[] getEmptyArayOfStrings();// getEmptyArayOfStrings() + @org.jetbrains.annotations.NotNull() public static final java.util.List getListOfStrings();// getListOfStrings() diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.java index b0bb2178650..372e6e47899 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.java @@ -11,6 +11,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() private static final int[] arrayOfIntPrimitives = {5, -1, 2147483647, -2147483648} /* initializer type: null */; + @org.jetbrains.annotations.NotNull() + private static final int[] emptyArayOfInts = {} /* initializer type: null */; + @org.jetbrains.annotations.NotNull() private static final java.lang.Character[] arrayOfCharObjects = {'C', '\u0000', '\n', '\r', '\'', '\u00FF'} /* initializer type: null */; @@ -32,6 +35,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() private static final java.lang.String[] arrayOfStrings = {"", "quotes \" ''quotes", "\r\n", "\u4F60\u597D\u4E16\u754C"} /* initializer type: null */; + @org.jetbrains.annotations.NotNull() + private static final java.lang.String[] emptyArayOfStrings = {} /* initializer type: null */; + @org.jetbrains.annotations.NotNull() private static final java.util.List listOfStrings; @@ -56,6 +62,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() public static final int[] getArrayOfIntPrimitives();// getArrayOfIntPrimitives() + @org.jetbrains.annotations.NotNull() + public static final int[] getEmptyArayOfInts();// getEmptyArayOfInts() + @org.jetbrains.annotations.NotNull() public static final java.lang.Character[] getArrayOfCharObjects();// getArrayOfCharObjects() @@ -77,6 +86,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() public static final java.lang.String[] getArrayOfStrings();// getArrayOfStrings() + @org.jetbrains.annotations.NotNull() + public static final java.lang.String[] getEmptyArayOfStrings();// getEmptyArayOfStrings() + @org.jetbrains.annotations.NotNull() public static final java.util.List getListOfStrings();// getListOfStrings() diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.kt index 3e1568e87c4..2805c1a6e85 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.kt +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.kt @@ -12,4 +12,6 @@ val arrayOfFloatObjects = arrayOf(2f + 3f, -1.23E-7f, Float.MIN_VALUE, Float.MAX val arrayOfFloatPrimitives = floatArrayOf(2f + 3f, -1.23E-7f, Float.MIN_VALUE, Float.MAX_VALUE, Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, 0.0f / 0.0f, 1.0f / 0.0f, -1.0f / 0.0f) val arrayOfStrings = arrayOf("", "quotes \" ''quotes", "\r\n", "你好世界") val arrayOfEnums = arrayOf(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) -val arrayOfNAny = arrayOf(1, 2L, "abc", AnnotationTarget.CLASS, null) \ No newline at end of file +val arrayOfNAny = arrayOf(1, 2L, "abc", AnnotationTarget.CLASS, null) +val emptyArayOfStrings: Array = arrayOf() +val emptyArayOfInts: IntArray = intArrayOf() diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.lib.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.lib.java index c52f005546e..34dadcc0f2e 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.lib.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/unsafePropertyInitializers.lib.java @@ -11,6 +11,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() private static final int[] arrayOfIntPrimitives; + @org.jetbrains.annotations.NotNull() + private static final int[] emptyArayOfInts; + @org.jetbrains.annotations.NotNull() private static final java.lang.Character[] arrayOfCharObjects; @@ -32,6 +35,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() private static final java.lang.String[] arrayOfStrings; + @org.jetbrains.annotations.NotNull() + private static final java.lang.String[] emptyArayOfStrings; + @org.jetbrains.annotations.NotNull() private static final java.util.List listOfStrings; @@ -56,6 +62,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() public static final int[] getArrayOfIntPrimitives();// getArrayOfIntPrimitives() + @org.jetbrains.annotations.NotNull() + public static final int[] getEmptyArayOfInts();// getEmptyArayOfInts() + @org.jetbrains.annotations.NotNull() public static final java.lang.Character[] getArrayOfCharObjects();// getArrayOfCharObjects() @@ -77,6 +86,9 @@ public final class UnsafePropertyInitializersKt /* UnsafePropertyInitializersKt* @org.jetbrains.annotations.NotNull() public static final java.lang.String[] getArrayOfStrings();// getArrayOfStrings() + @org.jetbrains.annotations.NotNull() + public static final java.lang.String[] getEmptyArayOfStrings();// getEmptyArayOfStrings() + @org.jetbrains.annotations.NotNull() public static final java.util.List getListOfStrings();// getListOfStrings()