synchronizing my and Alex' signature writers and readers

This commit is contained in:
Stepan Koltsov
2011-12-14 17:42:52 +04:00
committed by Nikolay Krasko
parent 9a8a1be1bb
commit c46fe1381f
9 changed files with 37 additions and 13 deletions
@@ -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.JetSignatureAdapter;
import org.jetbrains.jet.lang.resolve.java.signature.JetSignatureReader; import org.jetbrains.jet.lang.resolve.java.signature.JetSignatureReader;
import org.jetbrains.jet.lang.resolve.java.signature.JetSignatureWriter; 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.Type;
import org.objectweb.asm.signature.SignatureVisitor; import org.objectweb.asm.signature.SignatureVisitor;
import org.objectweb.asm.signature.SignatureWriter; import org.objectweb.asm.signature.SignatureWriter;
@@ -182,11 +183,11 @@ public class BothSignatureWriter {
jetSignatureWriter.visitTypeVariable(name, nullable); jetSignatureWriter.visitTypeVariable(name, nullable);
} }
public void writeFormalTypeParameter(final String name) { public void writeFormalTypeParameter(final String name, Variance variance) {
checkTopLevel(); checkTopLevel();
signatureVisitor().visitFormalTypeParameter(name); signatureVisitor().visitFormalTypeParameter(name);
jetSignatureWriter.visitFormalTypeParameter(name); jetSignatureWriter.visitFormalTypeParameter(name, variance);
} }
public void writerFormalTypeParametersStart() { public void writerFormalTypeParametersStart() {
@@ -540,7 +540,7 @@ public class JetTypeMapper {
} }
private void writeFormalTypeParameter(TypeParameterDescriptor typeParameterDescriptor, BothSignatureWriter signatureVisitor) { private void writeFormalTypeParameter(TypeParameterDescriptor typeParameterDescriptor, BothSignatureWriter signatureVisitor) {
signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName()); signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName(), typeParameterDescriptor.getVariance());
classBound: classBound:
{ {
@@ -73,7 +73,6 @@ public class SignatureUtil {
} }
sb.append('<'); sb.append('<');
for(JetTypeParameter param : parameters) { for(JetTypeParameter param : parameters) {
sb.append("T");
Variance variance = param.getVariance(); Variance variance = param.getVariance();
if(variance == Variance.IN_VARIANCE) if(variance == Variance.IN_VARIANCE)
sb.append("in "); sb.append("in ");
@@ -34,7 +34,7 @@ public abstract class JetTypeJetSignatureReader implements JetSignatureVisitor {
@Override @Override
public void visitFormalTypeParameter(String name) { public void visitFormalTypeParameter(String name, Variance variance) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@@ -1,11 +1,13 @@
package org.jetbrains.jet.lang.resolve.java.signature; package org.jetbrains.jet.lang.resolve.java.signature;
import org.jetbrains.jet.lang.types.Variance;
/** /**
* @author Stepan Koltsov * @author Stepan Koltsov
*/ */
public class JetSignatureAdapter implements JetSignatureVisitor { public class JetSignatureAdapter implements JetSignatureVisitor {
@Override @Override
public void visitFormalTypeParameter(String name) { public void visitFormalTypeParameter(String name, Variance variance) {
} }
@Override @Override
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.resolve.java.signature; 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.SignatureReader;
import org.objectweb.asm.signature.SignatureVisitor; import org.objectweb.asm.signature.SignatureVisitor;
@@ -26,8 +27,19 @@ public class JetSignatureReader {
if (signature.charAt(0) == '<') { if (signature.charAt(0) == '<') {
pos = 2; pos = 2;
do { 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); int end = signature.indexOf(':', pos);
v.visitFormalTypeParameter(signature.substring(pos - 1, end)); v.visitFormalTypeParameter(signature.substring(pos - 1, end), variance);
pos = end + 1; pos = end + 1;
c = signature.charAt(pos); c = signature.charAt(pos);
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.resolve.java.signature; package org.jetbrains.jet.lang.resolve.java.signature;
import org.jetbrains.jet.lang.types.Variance;
import org.objectweb.asm.signature.SignatureVisitor; import org.objectweb.asm.signature.SignatureVisitor;
/** /**
@@ -30,7 +31,7 @@ public interface JetSignatureVisitor {
* *
* @param name the name of the formal parameter. * @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. * Visits the class bound of the last visited formal type parameter.
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.resolve.java.signature; package org.jetbrains.jet.lang.resolve.java.signature;
import org.jetbrains.jet.lang.types.Variance;
import org.objectweb.asm.signature.SignatureWriter; import org.objectweb.asm.signature.SignatureWriter;
/** /**
@@ -43,11 +44,23 @@ public class JetSignatureWriter implements JetSignatureVisitor {
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
@Override @Override
public void visitFormalTypeParameter(final String name) { public void visitFormalTypeParameter(final String name, Variance variance) {
if (!hasFormals) { if (!hasFormals) {
hasFormals = true; hasFormals = true;
buf.append('<'); 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(name);
buf.append(':'); buf.append(':');
} }
-4
View File
@@ -543,10 +543,6 @@ public abstract class TypeInfo<T> implements JetObject {
signature.variables = new LinkedList<TypeInfoProjection>(); signature.variables = new LinkedList<TypeInfoProjection>();
signature.varNames = new HashMap<String, Integer>(); signature.varNames = new HashMap<String, Integer>();
} }
if (string[cur] != 'T') {
throw new IllegalStateException(new String(string));
}
cur++;
signature.variables.add(parseVar(signature)); signature.variables.add(parseVar(signature));
} }
cur++; cur++;