From 5449cea6b7c4e164641dcbf0795272bedd71757d Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 8 Oct 2015 18:17:53 +0300 Subject: [PATCH] Make Array type parameter T non-reified --- .../BasicExpressionTypingVisitor.java | 5 ++++- compiler/testData/builtin-classes.txt | 4 ++-- .../codegen/box/diagnostics/vararg/kt4172.kt | 1 + .../codegen/box/diagnostics/vararg/kt4172.txt | 2 +- .../diagnostics/tests/cast/AsArray.kt | 1 + .../diagnostics/tests/cast/AsArray.txt | 3 +++ .../diagnostics/tests/cast/IsArray.kt | 1 - .../diagnostics/tests/cast/IsArray.txt | 3 --- .../dataFlowInfoTraversal/ArrayExpression.kt | 1 + .../commonSystem/theSameFunctionInArgs.kt | 1 + .../commonSystem/theSameFunctionInArgs.txt | 2 +- .../tests/inference/mapFunction.kt | 1 + .../tests/inference/mapFunction.txt | 2 +- .../tests/inference/regressions/kt2200.kt | 1 + .../tests/inference/regressions/kt2200.txt | 2 +- .../tests/inference/regressions/kt2294.kt | 2 +- .../tests/inference/regressions/kt2294.txt | 2 +- .../testsWithStdLib/cast/IsArray.kt | 5 +++++ .../testsWithStdLib/cast/IsArray.txt | 5 +++++ .../cast/IsReified.kt | 0 .../cast/IsReified.txt | 0 .../checkers/JetDiagnosticsTestGenerated.java | 18 ++++++---------- ...JetDiagnosticsTestWithStdLibGenerated.java | 21 +++++++++++++++++++ core/builtins/native/kotlin/Array.kt | 2 +- .../reflect/ReflectJavaAnnotationArguments.kt | 6 +++--- 25 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/cast/AsArray.kt create mode 100644 compiler/testData/diagnostics/tests/cast/AsArray.txt delete mode 100644 compiler/testData/diagnostics/tests/cast/IsArray.kt delete mode 100644 compiler/testData/diagnostics/tests/cast/IsArray.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.txt rename compiler/testData/diagnostics/{tests => testsWithStdLib}/cast/IsReified.kt (100%) rename compiler/testData/diagnostics/{tests => testsWithStdLib}/cast/IsReified.txt (100%) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index fa361df9d40..965e6db5dad 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -579,6 +579,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { TypeConstructor typeConstructor = type.getConstructor(); ClassifierDescriptor typeDeclarationDescriptor = typeConstructor.getDeclarationDescriptor(); + boolean typeIsArray = KotlinBuiltIns.isArray(type); if (typeDeclarationDescriptor instanceof ClassDescriptor) { List parameters = typeConstructor.getParameters(); @@ -586,8 +587,10 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { Iterator typeArgumentsIterator = type.getArguments().iterator(); for (TypeParameterDescriptor parameter : parameters) { - if (!parameter.isReified()) return false; + if (!typeIsArray && !parameter.isReified()) return false; + TypeProjection typeArgument = typeArgumentsIterator.next(); + if (typeArgument == null) return false; if (typeArgument.isStarProjection()) return false; if (!isClassAvailableAtRuntime(typeArgument.getType(), true)) return false; diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 90dc9a0f34b..e31740d6317 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -12,8 +12,8 @@ public open class Any { /*primary*/ public constructor Any() } -public final class Array : kotlin.Cloneable { - /*primary*/ private constructor Array() +public final class Array : kotlin.Cloneable { + /*primary*/ private constructor Array() public open override /*1*/ fun clone(): kotlin.Array public final operator fun get(/*0*/ index: kotlin.Int): T public final operator fun iterator(): kotlin.Iterator diff --git a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt index 1bf761f1a15..80e1489d641 100644 --- a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt +++ b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt @@ -11,4 +11,5 @@ object D { fun foo(array: Array) = array } +@Suppress("UNCHECKED_CAST") inline fun array(vararg t : T) : Array = t as Array \ No newline at end of file diff --git a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt index 758c16c68a0..bbe26dab445 100644 --- a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt +++ b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt @@ -1,6 +1,6 @@ package -@kotlin.inline() public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array +@kotlin.Suppress(names = {"UNCHECKED_CAST"}) @kotlin.inline() public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array public fun box(): kotlin.String public fun main(/*0*/ args: kotlin.Array): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/cast/AsArray.kt b/compiler/testData/diagnostics/tests/cast/AsArray.kt new file mode 100644 index 00000000000..d4b86b61325 --- /dev/null +++ b/compiler/testData/diagnostics/tests/cast/AsArray.kt @@ -0,0 +1 @@ +fun f(x: Any) = x as Array \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/cast/AsArray.txt b/compiler/testData/diagnostics/tests/cast/AsArray.txt new file mode 100644 index 00000000000..90205bf3010 --- /dev/null +++ b/compiler/testData/diagnostics/tests/cast/AsArray.txt @@ -0,0 +1,3 @@ +package + +public fun f(/*0*/ x: kotlin.Any): kotlin.Array diff --git a/compiler/testData/diagnostics/tests/cast/IsArray.kt b/compiler/testData/diagnostics/tests/cast/IsArray.kt deleted file mode 100644 index 5bc070e0377..00000000000 --- a/compiler/testData/diagnostics/tests/cast/IsArray.kt +++ /dev/null @@ -1 +0,0 @@ -fun f(a: Array) = a.isArrayOf() diff --git a/compiler/testData/diagnostics/tests/cast/IsArray.txt b/compiler/testData/diagnostics/tests/cast/IsArray.txt deleted file mode 100644 index acc56726e3e..00000000000 --- a/compiler/testData/diagnostics/tests/cast/IsArray.txt +++ /dev/null @@ -1,3 +0,0 @@ -package - -public fun f(/*0*/ a: kotlin.Array): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ArrayExpression.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ArrayExpression.kt index afca19bc7fb..f414fc2bdab 100644 --- a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ArrayExpression.kt +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ArrayExpression.kt @@ -1,6 +1,7 @@ // !CHECK_TYPE fun foo(arr: Array): Int { + @Suppress("UNCHECKED_CAST") val result = (arr as Array)[0] checkSubtype>(arr) return result diff --git a/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.kt b/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.kt index 65b81903685..f239828d1e2 100644 --- a/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.kt +++ b/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.kt @@ -1,5 +1,6 @@ // !CHECK_TYPE +@Suppress("UNCHECKED_CAST") fun arrayOf(vararg t : T) : Array = t as Array fun test() { diff --git a/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.txt b/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.txt index 59e62cf50ee..6e40915d38f 100644 --- a/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.txt +++ b/compiler/testData/diagnostics/tests/inference/commonSystem/theSameFunctionInArgs.txt @@ -1,4 +1,4 @@ package -public fun arrayOf(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array +@kotlin.Suppress(names = {"UNCHECKED_CAST"}) public fun arrayOf(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array public fun test(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inference/mapFunction.kt b/compiler/testData/diagnostics/tests/inference/mapFunction.kt index 5717fb0770e..c5bfc0765f4 100644 --- a/compiler/testData/diagnostics/tests/inference/mapFunction.kt +++ b/compiler/testData/diagnostics/tests/inference/mapFunction.kt @@ -27,6 +27,7 @@ fun foo() { // --------------------- // copy from kotlin util (but with `infix` modifier on `map`) +@Suppress("UNCHECKED_CAST") fun array(vararg t : T) : Array = t as Array infix fun Array.map(transform : (T) -> R) : List {} diff --git a/compiler/testData/diagnostics/tests/inference/mapFunction.txt b/compiler/testData/diagnostics/tests/inference/mapFunction.txt index 2ad8f81b7a8..1d79d84e318 100644 --- a/compiler/testData/diagnostics/tests/inference/mapFunction.txt +++ b/compiler/testData/diagnostics/tests/inference/mapFunction.txt @@ -1,7 +1,7 @@ package package a { - public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array + @kotlin.Suppress(names = {"UNCHECKED_CAST"}) public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array public fun foo(): kotlin.Unit public infix fun kotlin.Array.map(/*0*/ transform: (T) -> R): kotlin.List public infix fun kotlin.Iterable.map(/*0*/ transform: (T) -> R): kotlin.List diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt index d3e473eedb8..6ea311e2e5a 100644 --- a/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt @@ -13,4 +13,5 @@ fun main(args: Array) { } //from library +@Suppress("UNCHECKED_CAST") fun array(vararg t : T) : Array = t as Array \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2200.txt b/compiler/testData/diagnostics/tests/inference/regressions/kt2200.txt index 41ce4d5cdfd..317554c913b 100644 --- a/compiler/testData/diagnostics/tests/inference/regressions/kt2200.txt +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2200.txt @@ -1,6 +1,6 @@ package package n { - public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array + @kotlin.Suppress(names = {"UNCHECKED_CAST"}) public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array public fun main(/*0*/ args: kotlin.Array): kotlin.Unit } diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt index 14f3e3dc8f7..c5e4fa5eb02 100644 --- a/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt @@ -14,5 +14,5 @@ public fun test() } //-------------------- - +@Suppress("UNCHECKED_CAST") fun array(vararg t : T) : Array = t as Array diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2294.txt b/compiler/testData/diagnostics/tests/inference/regressions/kt2294.txt index a01fc4b95a7..b9caebf3c5c 100644 --- a/compiler/testData/diagnostics/tests/inference/regressions/kt2294.txt +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2294.txt @@ -1,7 +1,7 @@ package package a { - public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array + @kotlin.Suppress(names = {"UNCHECKED_CAST"}) public fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array public fun foo(/*0*/ array: kotlin.Array): kotlin.Array public fun test(): kotlin.Unit } diff --git a/compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.kt b/compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.kt new file mode 100644 index 00000000000..42ed82698b3 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.kt @@ -0,0 +1,5 @@ +fun f(a: Array) = a.isArrayOf() + +fun f1(a: Array) = a is Array<*> + +fun f2(a: Array) = a is Array \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.txt b/compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.txt new file mode 100644 index 00000000000..32a406f803e --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.txt @@ -0,0 +1,5 @@ +package + +public fun f(/*0*/ a: kotlin.Array): kotlin.Boolean +public fun f1(/*0*/ a: kotlin.Array): kotlin.Boolean +public fun f2(/*0*/ a: kotlin.Array): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/cast/IsReified.kt b/compiler/testData/diagnostics/testsWithStdLib/cast/IsReified.kt similarity index 100% rename from compiler/testData/diagnostics/tests/cast/IsReified.kt rename to compiler/testData/diagnostics/testsWithStdLib/cast/IsReified.kt diff --git a/compiler/testData/diagnostics/tests/cast/IsReified.txt b/compiler/testData/diagnostics/testsWithStdLib/cast/IsReified.txt similarity index 100% rename from compiler/testData/diagnostics/tests/cast/IsReified.txt rename to compiler/testData/diagnostics/testsWithStdLib/cast/IsReified.txt diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 6fd090b5a0b..c1656ba8d4e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -2079,6 +2079,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/cast"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("AsArray.kt") + public void testAsArray() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/AsArray.kt"); + doTest(fileName); + } + @TestMetadata("AsErasedError.kt") public void testAsErasedError() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/AsErasedError.kt"); @@ -2115,12 +2121,6 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } - @TestMetadata("IsArray.kt") - public void testIsArray() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/IsArray.kt"); - doTest(fileName); - } - @TestMetadata("IsErasedAllowForDerivedWithOneSubstitutedAndOneSameGeneric.kt") public void testIsErasedAllowForDerivedWithOneSubstitutedAndOneSameGeneric() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/IsErasedAllowForDerivedWithOneSubstitutedAndOneSameGeneric.kt"); @@ -2313,12 +2313,6 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } - @TestMetadata("IsReified.kt") - public void testIsReified() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/IsReified.kt"); - doTest(fileName); - } - @TestMetadata("IsTraits.kt") public void testIsTraits() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/IsTraits.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 45770c3cf00..a6f1f3a7dd0 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -524,6 +524,27 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/cast") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Cast extends AbstractJetDiagnosticsTestWithStdLib { + public void testAllFilesPresentInCast() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/cast"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("IsArray.kt") + public void testIsArray() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/cast/IsArray.kt"); + doTest(fileName); + } + + @TestMetadata("IsReified.kt") + public void testIsReified() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/cast/IsReified.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/builtins/native/kotlin/Array.kt b/core/builtins/native/kotlin/Array.kt index ed6ba662ec1..9f98407486b 100644 --- a/core/builtins/native/kotlin/Array.kt +++ b/core/builtins/native/kotlin/Array.kt @@ -23,7 +23,7 @@ package kotlin * See [Kotlin language documentation](http://kotlinlang.org/docs/reference/basic-types.html#arrays) * for more information on arrays. */ -public class Array private (): Cloneable { +public class Array private (): Cloneable { /** * Returns the array element at the specified [index]. This method can be called using the * index operator: diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaAnnotationArguments.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaAnnotationArguments.kt index d7ac0b8f1d9..ca59be0b317 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaAnnotationArguments.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaAnnotationArguments.kt @@ -27,7 +27,7 @@ abstract class ReflectJavaAnnotationArgument( return when { value.javaClass.isEnumClassOrSpecializedEnumEntryClass() -> ReflectJavaEnumValueAnnotationArgument(name, value as Enum<*>) value is Annotation -> ReflectJavaAnnotationAsAnnotationArgument(name, value) - value is Array -> ReflectJavaArrayAnnotationArgument(name, value) + value is Array<*> -> ReflectJavaArrayAnnotationArgument(name, value) value is Class<*> -> ReflectJavaClassObjectAnnotationArgument(name, value) else -> ReflectJavaLiteralAnnotationArgument(name, value) } @@ -42,9 +42,9 @@ class ReflectJavaLiteralAnnotationArgument( class ReflectJavaArrayAnnotationArgument( name: Name?, - private val values: Array + private val values: Array<*> ) : ReflectJavaAnnotationArgument(name), JavaArrayAnnotationArgument { - override fun getElements() = values.map { ReflectJavaAnnotationArgument.create(it, null) } + override fun getElements() = values.map { ReflectJavaAnnotationArgument.create(it!!, null) } } class ReflectJavaEnumValueAnnotationArgument(