From 4d484dd971e18ddcda33f70a16932df5031713e3 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 20 May 2020 16:13:35 +0300 Subject: [PATCH] FIR: Support java array in type argument ^KT-37321 Fixed --- .../resolve/problems/javaArrayInGeneric.kt | 15 -------- .../resolve/problems/javaArrayInGeneric.txt | 4 -- .../stdlib/j+k/ArrayInGenericArguments.kt | 19 ++++++++++ .../stdlib/j+k/ArrayInGenericArguments.txt | 5 +++ .../fir/FirDiagnosticsTestGenerated.java | 10 ++--- ...DiagnosticsWithLightTreeTestGenerated.java | 10 ++--- .../java/FirTypeEnhancementTestGenerated.java | 5 +++ .../jetbrains/kotlin/fir/java/JavaUtils.kt | 38 +++++++++++-------- .../ArrayInGenericArguments.fir.txt | 10 +++++ .../compiledJava/ArrayInGenericArguments.java | 7 ++++ .../compiledJava/ArrayInGenericArguments.txt | 1 + .../jvm/compiler/LoadJavaTestGenerated.java | 5 +++ ...dJavaWithPsiClassReadingTestGenerated.java | 5 +++ .../compiler/ir/IrLoadJavaTestGenerated.java | 5 +++ .../LoadJavaUsingJavacTestGenerated.java | 5 +++ ...mRuntimeDescriptorLoaderTestGenerated.java | 5 +++ 16 files changed, 105 insertions(+), 44 deletions(-) delete mode 100644 compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.kt delete mode 100644 compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.kt create mode 100644 compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.txt create mode 100644 compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.fir.txt create mode 100644 compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java create mode 100644 compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.txt diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.kt b/compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.kt deleted file mode 100644 index c298df891a8..00000000000 --- a/compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.kt +++ /dev/null @@ -1,15 +0,0 @@ -// FILE: Inv.java - -public class Inv {} - -// FILE: A.java - -public class A { - public static Inv KEY = new Inv<>(); -} - -// FILE: main.kt - -fun test() { - val key = A.KEY -} \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.txt b/compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.txt deleted file mode 100644 index d480c229ce8..00000000000 --- a/compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.txt +++ /dev/null @@ -1,4 +0,0 @@ -FILE: main.kt - public final fun test(): R|kotlin/Unit| { - lval key: R|ft>, Inv<>?>!| = Q|A|.R|/A.KEY| - } diff --git a/compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.kt b/compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.kt new file mode 100644 index 00000000000..24d90dc0360 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.kt @@ -0,0 +1,19 @@ +// FILE: DataKey.java +public class DataKey {} + +// FILE: Keys.java +public class Keys { + public static final DataKey X = null; + public static final DataKey Y = null; + + public static T getData(DataKey key) { + return null; + } +} + +// FILE: main.kt +fun main() { + // Keys.X type loaded as DataKey + Keys.getData(Keys.X)[0].length + Keys.getData(Keys.Y).length +} diff --git a/compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.txt b/compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.txt new file mode 100644 index 00000000000..399fa0e7a81 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.txt @@ -0,0 +1,5 @@ +FILE: main.kt + public final fun main(): R|kotlin/Unit| { + Q|Keys|.R|/Keys.getData|!>, kotlin/Array!>?>!|>(Q|Keys|.R|/Keys.X|).R|FakeOverride!|>|(Int(0)).R|kotlin/String.length| + Q|Keys|.R|/Keys.getData|!|>(Q|Keys|.R|/Keys.Y|).R|kotlin/String.length| + } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 495134e8a53..4dffb60f89f 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -1669,11 +1669,6 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/analysis-tests/testData/resolve/problems/javaAccessorConversion.kt"); } - @TestMetadata("javaArrayInGeneric.kt") - public void testJavaArrayInGeneric() throws Exception { - runTest("compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.kt"); - } - @TestMetadata("javaQualifier.kt") public void testJavaQualifier() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/problems/javaQualifier.kt"); @@ -2194,6 +2189,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/stdlib/j+k"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @TestMetadata("ArrayInGenericArguments.kt") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.kt"); + } + @TestMetadata("flexibleWildcard.kt") public void testFlexibleWildcard() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/flexibleWildcard.kt"); diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index 7f8cc01e0ae..8c775499204 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -1669,11 +1669,6 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/problems/javaAccessorConversion.kt"); } - @TestMetadata("javaArrayInGeneric.kt") - public void testJavaArrayInGeneric() throws Exception { - runTest("compiler/fir/analysis-tests/testData/resolve/problems/javaArrayInGeneric.kt"); - } - @TestMetadata("javaQualifier.kt") public void testJavaQualifier() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/problems/javaQualifier.kt"); @@ -2194,6 +2189,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/stdlib/j+k"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @TestMetadata("ArrayInGenericArguments.kt") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/ArrayInGenericArguments.kt"); + } + @TestMetadata("flexibleWildcard.kt") public void testFlexibleWildcard() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/stdlib/j+k/flexibleWildcard.kt"); diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/FirTypeEnhancementTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/FirTypeEnhancementTestGenerated.java index 497dc0144ee..06f3cf5d830 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/FirTypeEnhancementTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/FirTypeEnhancementTestGenerated.java @@ -28,6 +28,11 @@ public class FirTypeEnhancementTestGenerated extends AbstractFirTypeEnhancementT KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/loadJava/compiledJava"), Pattern.compile("^(.+)\\.java$"), null, true); } + @TestMetadata("ArrayInGenericArguments.java") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java"); + } + @TestMetadata("ArrayTypeVariance.java") public void testArrayTypeVariance() throws Exception { runTest("compiler/testData/loadJava/compiledJava/ArrayTypeVariance.java"); diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 93ee2767781..79a1878bc77 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -14,8 +14,8 @@ import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter -import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter @@ -123,20 +123,7 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( classId.toConeKotlinType(emptyArray(), isNullable = false) } is JavaArrayType -> { - val componentType = componentType - if (componentType !is JavaPrimitiveType) { - val classId = StandardClassIds.Array - val argumentType = componentType.toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack) - classId.toConeFlexibleType( - arrayOf(argumentType), - typeArgumentsForUpper = arrayOf(ConeKotlinTypeProjectionOut(argumentType)) - ) - } else { - val javaComponentName = componentType.type?.typeName?.asString()?.capitalize() ?: error("Array of voids") - val classId = StandardClassIds.byName(javaComponentName + "Array") - - classId.toConeFlexibleType(emptyArray()) - } + toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack) } is JavaWildcardType -> bound?.toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack) ?: run { StandardClassIds.Any.toConeFlexibleType(emptyArray()) @@ -148,6 +135,26 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( } } +private fun JavaArrayType.toConeKotlinTypeWithoutEnhancement( + session: FirSession, + javaTypeParameterStack: JavaTypeParameterStack +): ConeFlexibleType { + val componentType = componentType + return if (componentType !is JavaPrimitiveType) { + val classId = StandardClassIds.Array + val argumentType = componentType.toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack) + classId.toConeFlexibleType( + arrayOf(argumentType), + typeArgumentsForUpper = arrayOf(ConeKotlinTypeProjectionOut(argumentType)) + ) + } else { + val javaComponentName = componentType.type?.typeName?.asString()?.capitalize() ?: error("Array of voids") + val classId = StandardClassIds.byName(javaComponentName + "Array") + + classId.toConeFlexibleType(emptyArray()) + } +} + private fun ClassId.toConeFlexibleType( typeArguments: Array, typeArgumentsForUpper: Array = typeArguments @@ -385,6 +392,7 @@ private fun JavaType?.toConeProjectionWithoutEnhancement( } } is JavaClassifierType -> toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack) + is JavaArrayType -> toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack) else -> ConeClassErrorType("Unexpected type argument: $this") } } diff --git a/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.fir.txt b/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.fir.txt new file mode 100644 index 00000000000..cd7c38e68a5 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.fir.txt @@ -0,0 +1,10 @@ +public open class ArrayInGenericArguments : R|kotlin/Any| { + public final static field X: R|ft!>, kotlin/Array!>?>!>, ArrayInGenericArguments.DataKey!>, kotlin/Array!>?>!>?>!| + + public final static field Y: R|ft!>, ArrayInGenericArguments.DataKey!>?>!| + + public final static field Z: R|ft!>, kotlin/Array!>?>!>, ArrayInGenericArguments.DataKey!>, kotlin/Array!>?>!>?>!| + + public constructor(): R|ArrayInGenericArguments| + +} diff --git a/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java b/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java new file mode 100644 index 00000000000..172c13fd5cc --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java @@ -0,0 +1,7 @@ +public class ArrayInGenericArguments { + public static class DataKey {} + + public static final DataKey X = null; + public static final DataKey Y = null; + public static final DataKey Z = null; +} diff --git a/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.txt b/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.txt new file mode 100644 index 00000000000..56e54040790 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.txt @@ -0,0 +1 @@ +package test diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index c4a87ef1743..3c16526e600 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -30,6 +30,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/loadJava/compiledJava"), Pattern.compile("^(.+)\\.java$"), null, true); } + @TestMetadata("ArrayInGenericArguments.java") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java"); + } + @TestMetadata("ArrayTypeVariance.java") public void testArrayTypeVariance() throws Exception { runTest("compiler/testData/loadJava/compiledJava/ArrayTypeVariance.java"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaWithPsiClassReadingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaWithPsiClassReadingTestGenerated.java index 1ceafa5f045..8c2f71c4771 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaWithPsiClassReadingTestGenerated.java @@ -28,6 +28,11 @@ public class LoadJavaWithPsiClassReadingTestGenerated extends AbstractLoadJavaWi KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/loadJava/compiledJava"), Pattern.compile("^(.+)\\.java$"), null, true); } + @TestMetadata("ArrayInGenericArguments.java") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java"); + } + @TestMetadata("ArrayTypeVariance.java") public void testArrayTypeVariance() throws Exception { runTest("compiler/testData/loadJava/compiledJava/ArrayTypeVariance.java"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java index afbe65a5b1e..51cbaf37ad2 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java @@ -31,6 +31,11 @@ public class IrLoadJavaTestGenerated extends AbstractIrLoadJavaTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/loadJava/compiledJava"), Pattern.compile("^(.+)\\.java$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("ArrayInGenericArguments.java") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java"); + } + @TestMetadata("ArrayTypeVariance.java") public void testArrayTypeVariance() throws Exception { runTest("compiler/testData/loadJava/compiledJava/ArrayTypeVariance.java"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java index 1bc34872dfd..96712104654 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java @@ -30,6 +30,11 @@ public class LoadJavaUsingJavacTestGenerated extends AbstractLoadJavaUsingJavacT KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/loadJava/compiledJava"), Pattern.compile("^(.+)\\.java$"), null, true); } + @TestMetadata("ArrayInGenericArguments.java") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java"); + } + @TestMetadata("ArrayTypeVariance.java") public void testArrayTypeVariance() throws Exception { runTest("compiler/testData/loadJava/compiledJava/ArrayTypeVariance.java"); diff --git a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 92b045b4e61..a5b832699b4 100644 --- a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -2921,6 +2921,11 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/loadJava/compiledJava"), Pattern.compile("^(.+)\\.java$"), null, true, "sam", "kotlinSignature/propagation"); } + @TestMetadata("ArrayInGenericArguments.java") + public void testArrayInGenericArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledJava/ArrayInGenericArguments.java"); + } + @TestMetadata("ArrayTypeVariance.java") public void testArrayTypeVariance() throws Exception { runTest("compiler/testData/loadJava/compiledJava/ArrayTypeVariance.java");