diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java index ab2d5de350d..df828641deb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.signature.JetSignatureAdapter; import org.jetbrains.jet.lang.resolve.java.signature.JetSignatureReader; import org.jetbrains.jet.lang.resolve.java.signature.JetSignatureWriter; +import org.jetbrains.jet.lang.types.Variance; import org.objectweb.asm.Type; import org.objectweb.asm.signature.SignatureVisitor; import org.objectweb.asm.signature.SignatureWriter; @@ -182,11 +183,11 @@ public class BothSignatureWriter { jetSignatureWriter.visitTypeVariable(name, nullable); } - public void writeFormalTypeParameter(final String name) { + public void writeFormalTypeParameter(final String name, Variance variance) { checkTopLevel(); signatureVisitor().visitFormalTypeParameter(name); - jetSignatureWriter.visitFormalTypeParameter(name); + jetSignatureWriter.visitFormalTypeParameter(name, variance); } public void writerFormalTypeParametersStart() { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 58a60e131b6..45344286ed0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -540,7 +540,7 @@ public class JetTypeMapper { } private void writeFormalTypeParameter(TypeParameterDescriptor typeParameterDescriptor, BothSignatureWriter signatureVisitor) { - signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName()); + signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName(), typeParameterDescriptor.getVariance()); classBound: { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/SignatureUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/SignatureUtil.java index 2903242169c..392037c636e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/SignatureUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/SignatureUtil.java @@ -73,7 +73,6 @@ public class SignatureUtil { } sb.append('<'); for(JetTypeParameter param : parameters) { - sb.append("T"); Variance variance = param.getVariance(); if(variance == Variance.IN_VARIANCE) sb.append("in "); 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 0e0819d8f7a..69f5e4b1444 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 @@ -34,7 +34,7 @@ public abstract class JetTypeJetSignatureReader implements JetSignatureVisitor { @Override - public void visitFormalTypeParameter(String name) { + public void visitFormalTypeParameter(String name, Variance variance) { throw new IllegalStateException(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureAdapter.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureAdapter.java index 5f9d10245b0..a1c62a009ff 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureAdapter.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureAdapter.java @@ -1,11 +1,13 @@ package org.jetbrains.jet.lang.resolve.java.signature; +import org.jetbrains.jet.lang.types.Variance; + /** * @author Stepan Koltsov */ public class JetSignatureAdapter implements JetSignatureVisitor { @Override - public void visitFormalTypeParameter(String name) { + public void visitFormalTypeParameter(String name, Variance variance) { } @Override diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureReader.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureReader.java index cbdebb01b3a..f4c78b26a44 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureReader.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureReader.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.lang.resolve.java.signature; +import org.jetbrains.jet.lang.types.Variance; import org.objectweb.asm.signature.SignatureReader; import org.objectweb.asm.signature.SignatureVisitor; @@ -26,8 +27,19 @@ public class JetSignatureReader { if (signature.charAt(0) == '<') { pos = 2; do { + Variance variance; + if (signature.substring(pos).startsWith("in ")) { + variance = Variance.IN_VARIANCE; + pos += "in ".length(); + } else if (signature.substring(pos).startsWith("out ")) { + variance = Variance.OUT_VARIANCE; + pos += "out ".length(); + } else { + variance = Variance.INVARIANT; + pos += "".length(); + } int end = signature.indexOf(':', pos); - v.visitFormalTypeParameter(signature.substring(pos - 1, end)); + v.visitFormalTypeParameter(signature.substring(pos - 1, end), variance); pos = end + 1; c = signature.charAt(pos); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureVisitor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureVisitor.java index e353dd6dbb3..6995d8b7e86 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureVisitor.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.lang.resolve.java.signature; +import org.jetbrains.jet.lang.types.Variance; import org.objectweb.asm.signature.SignatureVisitor; /** @@ -30,7 +31,7 @@ public interface JetSignatureVisitor { * * @param name the name of the formal parameter. */ - void visitFormalTypeParameter(String name); + void visitFormalTypeParameter(String name, Variance variance); /** * Visits the class bound of the last visited formal type parameter. diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureWriter.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureWriter.java index 7e1a7837a08..4755613ff2f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureWriter.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/signature/JetSignatureWriter.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.lang.resolve.java.signature; +import org.jetbrains.jet.lang.types.Variance; import org.objectweb.asm.signature.SignatureWriter; /** @@ -43,11 +44,23 @@ public class JetSignatureWriter implements JetSignatureVisitor { // ------------------------------------------------------------------------ @Override - public void visitFormalTypeParameter(final String name) { + public void visitFormalTypeParameter(final String name, Variance variance) { if (!hasFormals) { hasFormals = true; buf.append('<'); } + switch (variance) { + case OUT_VARIANCE: + buf.append("out "); + break; + case IN_VARIANCE: + buf.append("in "); + break; + case INVARIANT: + break; + default: + throw new IllegalStateException(); + } buf.append(name); buf.append(':'); } diff --git a/stdlib/src/jet/typeinfo/TypeInfo.java b/stdlib/src/jet/typeinfo/TypeInfo.java index dfdda4e367e..925cb84d745 100644 --- a/stdlib/src/jet/typeinfo/TypeInfo.java +++ b/stdlib/src/jet/typeinfo/TypeInfo.java @@ -543,10 +543,6 @@ public abstract class TypeInfo implements JetObject { signature.variables = new LinkedList(); signature.varNames = new HashMap(); } - if (string[cur] != 'T') { - throw new IllegalStateException(new String(string)); - } - cur++; signature.variables.add(parseVar(signature)); } cur++;