diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java index 440d0587873..70c66da4870 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java @@ -1,8 +1,8 @@ package org.jetbrains.jet.codegen; -import jet.typeinfo.TypeInfoVariance; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.resolve.java.JetSignatureUtils; import org.jetbrains.jet.rt.signature.JetSignatureAdapter; import org.jetbrains.jet.rt.signature.JetSignatureReader; import org.jetbrains.jet.rt.signature.JetSignatureWriter; @@ -184,21 +184,12 @@ public class BothSignatureWriter { signatureVisitor().visitTypeVariable(name); jetSignatureWriter.visitTypeVariable(name, nullable); } - - private TypeInfoVariance translateVariance(Variance variance) { - switch (variance) { - case IN_VARIANCE: return TypeInfoVariance.IN; - case OUT_VARIANCE: return TypeInfoVariance.OUT; - case INVARIANT: return TypeInfoVariance.INVARIANT; - default: throw new IllegalStateException(); - } - } - + public void writeFormalTypeParameter(final String name, Variance variance) { checkTopLevel(); signatureVisitor().visitFormalTypeParameter(name); - jetSignatureWriter.visitFormalTypeParameter(name, translateVariance(variance)); + jetSignatureWriter.visitFormalTypeParameter(name, JetSignatureUtils.translateVariance(variance)); } public void writeFormalTypeParameterEnd() { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index e6c73ef29eb..9bde734e3ba 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -551,7 +551,7 @@ public class JavaDescriptorResolver { final List r = new ArrayList(); new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() { @Override - public JetSignatureVisitor visitFormalTypeParameter(final String name, TypeInfoVariance variance) { + public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) { return new JetSignatureExceptionsAdapter() { int index = 0; @@ -582,7 +582,7 @@ public class JavaDescriptorResolver { functionDescriptor, Collections.emptyList(), // TODO: wrong true, // TODO: wrong - Variance.INVARIANT, // TOOD: wrong + JetSignatureUtils.translateVariance(variance), name, ++index); r.add(typeParameter); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetSignatureUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetSignatureUtils.java new file mode 100644 index 00000000000..a1207b905fe --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetSignatureUtils.java @@ -0,0 +1,28 @@ +package org.jetbrains.jet.lang.resolve.java; + +import jet.typeinfo.TypeInfoVariance; +import org.jetbrains.jet.lang.types.Variance; + +/** + * @author Stepan Koltsov + */ +public class JetSignatureUtils { + + static { + if (Variance.INVARIANT.ordinal() != TypeInfoVariance.INVARIANT.ordinal()) + throw new IllegalStateException(); + if (Variance.IN_VARIANCE.ordinal() != TypeInfoVariance.IN.ordinal()) + throw new IllegalStateException(); + if (Variance.OUT_VARIANCE.ordinal() != TypeInfoVariance.OUT.ordinal()) + throw new IllegalStateException(); + } + + public static TypeInfoVariance translateVariance(Variance variance) { + return TypeInfoVariance.values()[variance.ordinal()]; + } + + public static Variance translateVariance(TypeInfoVariance variance) { + return Variance.values()[variance.ordinal()]; + } + +} diff --git a/compiler/testData/readClass/FunInParam.kt b/compiler/testData/readClass/FunInParam.kt new file mode 100644 index 00000000000..c12eb63fc3e --- /dev/null +++ b/compiler/testData/readClass/FunInParam.kt @@ -0,0 +1,3 @@ +namespace test + +fun f() = 1 diff --git a/compiler/testData/readClass/FunOutParam.kt b/compiler/testData/readClass/FunOutParam.kt new file mode 100644 index 00000000000..7198872c6f8 --- /dev/null +++ b/compiler/testData/readClass/FunOutParam.kt @@ -0,0 +1,3 @@ +namespace test + +fun f() = 1 diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index 03936722192..2d375655704 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -237,7 +237,12 @@ public class ReadClassDataTest extends UsefulTestCase { } private void serialize(Variance variance, StringBuilder sb) { - sb.append(variance); + if (variance == Variance.INVARIANT) { + + } else { + sb.append(variance); + sb.append(' '); + } } private void serialize(JetType type, StringBuilder sb) { @@ -318,9 +323,7 @@ public class ReadClassDataTest extends UsefulTestCase { } private void serialize(TypeParameterDescriptor param, StringBuilder sb) { - if (param.getVariance() != Variance.INVARIANT) { - serialize(param.getVariance(), sb); - } + serialize(param.getVariance(), sb); sb.append(param.getName()); // TODO: serialize bounds }