diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java index b8e2bc6edc0..141777e9a86 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java @@ -166,7 +166,7 @@ public class BothSignatureWriter { writeClassEnd(); return; case Type.ARRAY: - writeArrayType(nullable); + writeArrayType(nullable, Variance.INVARIANT); writeAsmType(asmType.getElementType(), false, kotlinTypeName); writeArrayEnd(); return; @@ -235,9 +235,9 @@ public class BothSignatureWriter { jetSignatureWriter.visitEnd(); } - public void writeArrayType(boolean nullable) { + public void writeArrayType(boolean nullable, Variance projectionKind) { push(signatureVisitor().visitArrayType()); - jetSignatureWriter.visitArrayType(nullable); + jetSignatureWriter.visitArrayType(nullable, toJetSignatureVariance(projectionKind)); if (jvmCurrentType == null) { ++jvmCurrentTypeArrayLevel; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 36102ba929f..5e071d2e4bd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -266,10 +266,11 @@ public class JetTypeMapper extends BindingTraceAware { if (jetType.getArguments().size() != 1) { throw new UnsupportedOperationException("arrays must have one type argument"); } - JetType memberType = jetType.getArguments().get(0).getType(); + TypeProjection memberProjection = jetType.getArguments().get(0); + JetType memberType = memberProjection.getType(); if (signatureVisitor != null) { - signatureVisitor.writeArrayType(jetType.isNullable()); + signatureVisitor.writeArrayType(jetType.isNullable(), memberProjection.getProjectionKind()); mapType(memberType, signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER); signatureVisitor.writeArrayEnd(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java index 7bea8a01802..8989fc143f3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java @@ -161,7 +161,7 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd } @Override - public JetSignatureVisitor visitArrayType(final boolean nullable) { + public JetSignatureVisitor visitArrayType(final boolean nullable, final JetSignatureVariance wildcard) { return new JetTypeJetSignatureReader(javaSemanticServices, kotlinBuiltIns, typeVariableResolver) { @Override public void visitBaseType(char descriptor, boolean nullable) { @@ -178,7 +178,8 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd @Override protected void done(@NotNull JetType jetType) { - JetType arrayType = TypeUtils.makeNullableAsSpecified(KotlinBuiltIns.getInstance().getArrayType(jetType), nullable); + JetType arrayType = TypeUtils.makeNullableAsSpecified(KotlinBuiltIns.getInstance().getArrayType( + parseVariance(wildcard), jetType), nullable); JetTypeJetSignatureReader.this.done(arrayType); } }; diff --git a/compiler/testData/loadKotlin/type/ArrayOfInNumber.kt b/compiler/testData/loadKotlin/type/ArrayOfInNumber.kt new file mode 100644 index 00000000000..fed727282ea --- /dev/null +++ b/compiler/testData/loadKotlin/type/ArrayOfInNumber.kt @@ -0,0 +1,3 @@ +package test + +fun nothing(): Array = throw Exception() diff --git a/compiler/testData/loadKotlin/type/ArrayOfInNumber.txt b/compiler/testData/loadKotlin/type/ArrayOfInNumber.txt new file mode 100644 index 00000000000..e8ae7526d38 --- /dev/null +++ b/compiler/testData/loadKotlin/type/ArrayOfInNumber.txt @@ -0,0 +1,3 @@ +namespace test + +internal final fun nothing(): jet.Array diff --git a/compiler/testData/loadKotlin/type/ArrayOfOutNumber.kt b/compiler/testData/loadKotlin/type/ArrayOfOutNumber.kt new file mode 100644 index 00000000000..0e7de6b2b9d --- /dev/null +++ b/compiler/testData/loadKotlin/type/ArrayOfOutNumber.kt @@ -0,0 +1,3 @@ +package test + +fun nothing(): Array = throw Exception() diff --git a/compiler/testData/loadKotlin/type/ArrayOfOutNumber.txt b/compiler/testData/loadKotlin/type/ArrayOfOutNumber.txt new file mode 100644 index 00000000000..b63a0c6b5fb --- /dev/null +++ b/compiler/testData/loadKotlin/type/ArrayOfOutNumber.txt @@ -0,0 +1,3 @@ +namespace test + +internal final fun nothing(): jet.Array diff --git a/compiler/testData/loadKotlin/type/ArrayOfOutT.kt b/compiler/testData/loadKotlin/type/ArrayOfOutT.kt new file mode 100644 index 00000000000..5d14493e6db --- /dev/null +++ b/compiler/testData/loadKotlin/type/ArrayOfOutT.kt @@ -0,0 +1,3 @@ +package test + +fun nothing(): Array = throw Exception() diff --git a/compiler/testData/loadKotlin/type/ArrayOfOutT.txt b/compiler/testData/loadKotlin/type/ArrayOfOutT.txt new file mode 100644 index 00000000000..5b912720b96 --- /dev/null +++ b/compiler/testData/loadKotlin/type/ArrayOfOutT.txt @@ -0,0 +1,3 @@ +namespace test + +internal final fun nothing(): jet.Array diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java index bd6b39d916e..28260c2bb44 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java @@ -724,6 +724,11 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT doTest("compiler/testData/loadKotlin/type/AnyQ.kt"); } + @TestMetadata("ArrayOfInNumber.kt") + public void testArrayOfInNumber() throws Exception { + doTest("compiler/testData/loadKotlin/type/ArrayOfInNumber.kt"); + } + @TestMetadata("ArrayOfInt.kt") public void testArrayOfInt() throws Exception { doTest("compiler/testData/loadKotlin/type/ArrayOfInt.kt"); @@ -734,6 +739,16 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT doTest("compiler/testData/loadKotlin/type/ArrayOfInteger.kt"); } + @TestMetadata("ArrayOfOutNumber.kt") + public void testArrayOfOutNumber() throws Exception { + doTest("compiler/testData/loadKotlin/type/ArrayOfOutNumber.kt"); + } + + @TestMetadata("ArrayOfOutT.kt") + public void testArrayOfOutT() throws Exception { + doTest("compiler/testData/loadKotlin/type/ArrayOfOutT.kt"); + } + @TestMetadata("ArrayOfString.kt") public void testArrayOfString() throws Exception { doTest("compiler/testData/loadKotlin/type/ArrayOfString.kt"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index 95053d20689..3c36fc78af9 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -726,6 +726,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestSinglePackage("compiler/testData/loadKotlin/type/AnyQ.kt"); } + @TestMetadata("ArrayOfInNumber.kt") + public void testArrayOfInNumber() throws Exception { + doTestSinglePackage("compiler/testData/loadKotlin/type/ArrayOfInNumber.kt"); + } + @TestMetadata("ArrayOfInt.kt") public void testArrayOfInt() throws Exception { doTestSinglePackage("compiler/testData/loadKotlin/type/ArrayOfInt.kt"); @@ -736,6 +741,16 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestSinglePackage("compiler/testData/loadKotlin/type/ArrayOfInteger.kt"); } + @TestMetadata("ArrayOfOutNumber.kt") + public void testArrayOfOutNumber() throws Exception { + doTestSinglePackage("compiler/testData/loadKotlin/type/ArrayOfOutNumber.kt"); + } + + @TestMetadata("ArrayOfOutT.kt") + public void testArrayOfOutT() throws Exception { + doTestSinglePackage("compiler/testData/loadKotlin/type/ArrayOfOutT.kt"); + } + @TestMetadata("ArrayOfString.kt") public void testArrayOfString() throws Exception { doTestSinglePackage("compiler/testData/loadKotlin/type/ArrayOfString.kt"); diff --git a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java index 0f5bed09806..7d0a3147e03 100644 --- a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java +++ b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java @@ -75,7 +75,7 @@ public class JetSignatureAdapter implements JetSignatureVisitor { } @Override - public JetSignatureVisitor visitArrayType(boolean nullable) { + public JetSignatureVisitor visitArrayType(boolean nullable, JetSignatureVariance wildcard) { return this; } diff --git a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java index a789c096a93..b3f7945c120 100644 --- a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java +++ b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java @@ -78,7 +78,7 @@ public class JetSignatureExceptionsAdapter implements JetSignatureVisitor { } @Override - public JetSignatureVisitor visitArrayType(boolean nullable) { + public JetSignatureVisitor visitArrayType(boolean nullable, JetSignatureVariance wildcard) { throw new IllegalStateException(); } diff --git a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java index c255c4c8aca..bbf47505d1a 100644 --- a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java +++ b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java @@ -172,7 +172,13 @@ public class JetSignatureReader { return pos; case '[': - return parseType(signature, pos, v.visitArrayType(nullable)); + switch (c = signature.charAt(pos)) { + case '+': + case '-': + return parseType(signature, pos + 1, v.visitArrayType(nullable, JetSignatureVariance.parseVariance(c))); + default: + return parseType(signature, pos, v.visitArrayType(nullable, JetSignatureVariance.INVARIANT)); + } case 'T': end = signature.indexOf(';', pos); diff --git a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java index 95d95cdd477..474f741db27 100644 --- a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java +++ b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java @@ -123,7 +123,7 @@ public interface JetSignatureVisitor { * @return a non null visitor to visit the signature of the array element * type. */ - JetSignatureVisitor visitArrayType(boolean nullable); + JetSignatureVisitor visitArrayType(boolean nullable, JetSignatureVariance wildcard); /** * Starts the visit of a signature corresponding to a class or interface diff --git a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java index cdc5f1db008..1cbf36a91ee 100644 --- a/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java +++ b/runtime/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java @@ -157,9 +157,12 @@ public class JetSignatureWriter implements JetSignatureVisitor { } @Override - public JetSignatureWriter visitArrayType(boolean nullable) { + public JetSignatureWriter visitArrayType(boolean nullable, JetSignatureVariance wildcard) { visitNullabe(nullable); buf.append('['); + if (wildcard != JetSignatureVariance.INVARIANT) { + buf.append(wildcard.getC()); + } return this; } @@ -195,7 +198,7 @@ public class JetSignatureWriter implements JetSignatureVisitor { ++argumentStack; buf.append('<'); } - if (variance.getC() != '=') { + if (variance != JetSignatureVariance.INVARIANT) { buf.append(variance.getC()); } return this;