提交 309b6b3e 编写于 作者: S Stepan Koltsov

fix erased parameters codegen and parsing

上级 74575986
......@@ -232,11 +232,11 @@ public class BothSignatureWriter {
writeAsmType0(asmType);
}
public void writeFormalTypeParameter(final String name, Variance variance) {
public void writeFormalTypeParameter(final String name, Variance variance, boolean reified) {
checkTopLevel();
signatureVisitor().visitFormalTypeParameter(name);
jetSignatureWriter.visitFormalTypeParameter(name, JetSignatureUtils.translateVariance(variance));
jetSignatureWriter.visitFormalTypeParameter(name, JetSignatureUtils.translateVariance(variance), reified);
generic = true;
}
......
......@@ -130,6 +130,9 @@ public class FunctionCodegen {
av.visitEnd();
}
for (final TypeParameterDescriptor typeParameterDescriptor : typeParameters) {
if (!typeParameterDescriptor.isReified()) {
continue;
}
AnnotationVisitor av = mv.visitParameterAnnotation(start++, JvmStdlibNames.JET_TYPE_PARAMETER.getDescriptor(), true);
av.visit(JvmStdlibNames.JET_TYPE_PARAMETER_NAME_FIELD, typeParameterDescriptor.getName());
av.visitEnd();
......@@ -171,6 +174,9 @@ public class FunctionCodegen {
add++;
for (final TypeParameterDescriptor typeParameterDescriptor : typeParameters) {
if (!typeParameterDescriptor.isReified()) {
continue;
}
int slot = frameMap.enterTemp();
add++;
codegen.addTypeParameter(typeParameterDescriptor, StackValue.local(slot, JetTypeMapper.TYPE_TYPEINFO));
......
......@@ -495,7 +495,7 @@ public class JetTypeMapper {
}
private void writeFormalTypeParameter(TypeParameterDescriptor typeParameterDescriptor, BothSignatureWriter signatureVisitor) {
signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName(), typeParameterDescriptor.getVariance());
signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName(), typeParameterDescriptor.getVariance(), typeParameterDescriptor.isReified());
classBound:
{
......
......@@ -375,12 +375,13 @@ public class JavaDescriptorResolver {
private final DeclarationDescriptor containingDeclaration;
private final PsiTypeParameterListOwner psiOwner;
private final String name;
private final boolean reified;
private final int index;
private final TypeInfoVariance variance;
private final TypeVariableResolver typeVariableResolver;
protected JetSignatureTypeParameterVisitor(DeclarationDescriptor containingDeclaration, PsiTypeParameterListOwner psiOwner,
String name, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver)
String name, boolean reified, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver)
{
if (name.isEmpty()) {
throw new IllegalStateException();
......@@ -389,6 +390,7 @@ public class JavaDescriptorResolver {
this.containingDeclaration = containingDeclaration;
this.psiOwner = psiOwner;
this.name = name;
this.reified = reified;
this.index = index;
this.variance = variance;
this.typeVariableResolver = typeVariableResolver;
......@@ -425,7 +427,7 @@ public class JavaDescriptorResolver {
TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
containingDeclaration,
Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
true, // TODO: wrong
reified,
JetSignatureUtils.translateVariance(variance),
name,
index);
......@@ -462,8 +464,8 @@ public class JavaDescriptorResolver {
private int formalTypeParameterIndex = 0;
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, reified, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
@Override
protected void done(TypeParameterDescriptor typeParameterDescriptor) {
r.add(typeParameterDescriptor);
......@@ -1269,9 +1271,9 @@ public class JavaDescriptorResolver {
private int formalTypeParameterIndex = 0;
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, reified, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
@Override
protected void done(TypeParameterDescriptor typeParameterDescriptor) {
r.add(typeParameterDescriptor);
......
......@@ -74,7 +74,7 @@ class TypeInfoParser {
new JetSignatureReader(annotationValue).accept(new JetSignatureExceptionsAdapter() {
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
// TODO: nullability
......
......@@ -7,7 +7,7 @@ import jet.typeinfo.TypeInfoVariance;
*/
public class JetSignatureAdapter implements JetSignatureVisitor {
@Override
public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance) {
public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) {
return this;
}
......
......@@ -7,7 +7,7 @@ import jet.typeinfo.TypeInfoVariance;
*/
public class JetSignatureExceptionsAdapter implements JetSignatureVisitor {
@Override
public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance) {
public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) {
throw new IllegalStateException();
}
......
......@@ -49,6 +49,12 @@ public class JetSignatureReader {
pos = 1;
do {
TypeInfoVariance variance;
boolean reified = true;
if (signature.substring(pos).startsWith("erased ")) {
reified = false;
pos += "erased ".length();
}
if (signature.substring(pos).startsWith("in ")) {
variance = TypeInfoVariance.IN;
pos += "in ".length();
......@@ -67,7 +73,7 @@ public class JetSignatureReader {
if (typeParameterName.isEmpty()) {
throw new IllegalStateException("incorrect signature: " + signature);
}
JetSignatureVisitor parameterVisitor = v.visitFormalTypeParameter(typeParameterName, variance);
JetSignatureVisitor parameterVisitor = v.visitFormalTypeParameter(typeParameterName, variance, reified);
pos = end + 1;
c = signature.charAt(pos);
......
......@@ -28,9 +28,11 @@ public interface JetSignatureVisitor {
/**
* Visits a formal type parameter.
*
* TODO should not store reified flag in signature
*
* @param name the name of the formal parameter.
*/
JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance);
JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified);
void visitFormalTypeParameterEnd();
......
......@@ -43,11 +43,14 @@ public class JetSignatureWriter implements JetSignatureVisitor {
// ------------------------------------------------------------------------
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, TypeInfoVariance variance) {
public JetSignatureVisitor visitFormalTypeParameter(final String name, TypeInfoVariance variance, boolean reified) {
if (!hasFormals) {
hasFormals = true;
buf.append('<');
}
if (!reified) {
buf.append("erased ");
}
switch (variance) {
case OUT:
buf.append("out ");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册