parse method in/out parameters

This commit is contained in:
Stepan Koltsov
2011-12-15 20:15:32 +04:00
parent a687580a39
commit 7dfede2d76
6 changed files with 46 additions and 18 deletions
@@ -1,8 +1,8 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import jet.typeinfo.TypeInfoVariance;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.JetSignatureAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader; import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureWriter; import org.jetbrains.jet.rt.signature.JetSignatureWriter;
@@ -184,21 +184,12 @@ public class BothSignatureWriter {
signatureVisitor().visitTypeVariable(name); signatureVisitor().visitTypeVariable(name);
jetSignatureWriter.visitTypeVariable(name, nullable); 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) { public void writeFormalTypeParameter(final String name, Variance variance) {
checkTopLevel(); checkTopLevel();
signatureVisitor().visitFormalTypeParameter(name); signatureVisitor().visitFormalTypeParameter(name);
jetSignatureWriter.visitFormalTypeParameter(name, translateVariance(variance)); jetSignatureWriter.visitFormalTypeParameter(name, JetSignatureUtils.translateVariance(variance));
} }
public void writeFormalTypeParameterEnd() { public void writeFormalTypeParameterEnd() {
@@ -547,7 +547,7 @@ public class JavaDescriptorResolver {
final List<TypeParameterDescriptor> r = new ArrayList<TypeParameterDescriptor>(); final List<TypeParameterDescriptor> r = new ArrayList<TypeParameterDescriptor>();
new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() { new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() {
@Override @Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, TypeInfoVariance variance) { public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
return new JetSignatureExceptionsAdapter() { return new JetSignatureExceptionsAdapter() {
int index = 0; int index = 0;
@@ -578,7 +578,7 @@ public class JavaDescriptorResolver {
functionDescriptor, functionDescriptor,
Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
true, // TODO: wrong true, // TODO: wrong
Variance.INVARIANT, // TOOD: wrong JetSignatureUtils.translateVariance(variance),
name, name,
++index); ++index);
r.add(typeParameter); r.add(typeParameter);
@@ -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()];
}
}
@@ -0,0 +1,3 @@
namespace test
fun <in T> f() = 1
@@ -0,0 +1,3 @@
namespace test
fun <out T> f() = 1
@@ -237,7 +237,12 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
private void serialize(Variance variance, StringBuilder sb) { 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) { private void serialize(JetType type, StringBuilder sb) {
@@ -318,9 +323,7 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
private void serialize(TypeParameterDescriptor param, StringBuilder sb) { private void serialize(TypeParameterDescriptor param, StringBuilder sb) {
if (param.getVariance() != Variance.INVARIANT) { serialize(param.getVariance(), sb);
serialize(param.getVariance(), sb);
}
sb.append(param.getName()); sb.append(param.getName());
// TODO: serialize bounds // TODO: serialize bounds
} }