KT-3722: Write correct generic type information for generated fields

#KT-3722 Fixed
This commit is contained in:
Mikhael Bogdanov
2013-06-27 13:29:19 +04:00
parent a37be3c205
commit 8cd1880805
6 changed files with 171 additions and 3 deletions
@@ -162,7 +162,7 @@ public class PropertyCodegen extends GenerationStateAware {
String name = backingFieldContext.getFieldName(propertyDescriptor, isDelegate);
return builder.newField(element, modifiers, name, type.getDescriptor(),
null, defaultValue);
typeMapper.mapFieldSignature(jetType), defaultValue);
}
private FieldVisitor generatePropertyDelegateAccess(JetProperty p, PropertyDescriptor propertyDescriptor) {
@@ -43,7 +43,8 @@ public class BothSignatureWriter {
public enum Mode {
METHOD(CheckSignatureAdapter.METHOD_SIGNATURE),
CLASS(CheckSignatureAdapter.CLASS_SIGNATURE),;
CLASS(CheckSignatureAdapter.CLASS_SIGNATURE),
TYPE(CheckSignatureAdapter.TYPE_SIGNATURE);
private final int asmType;
@@ -61,6 +62,9 @@ public class BothSignatureWriter {
RETURN_TYPE,
METHOD_END,
FIELD,
FIELD_END,
SUPERS,
CLASS_END,
}
@@ -341,6 +345,16 @@ public class BothSignatureWriter {
checkState(State.PARAMETERS);
}
public void writeFieldTypeStart() {
transitionState(State.START, State.FIELD);
jetSignatureWriter = new JetSignatureWriter();
}
public void writeFieldTypeEnd() {
jetSignatureWriter = null;
transitionState(State.FIELD, State.FIELD_END);
}
public void writeParameterType(JvmMethodParameterKind parameterKind) {
transitionState(State.PARAMETERS, State.PARAMETER);
@@ -486,7 +500,7 @@ public class BothSignatureWriter {
@Nullable
public String makeJavaGenericSignature() {
if (state != State.METHOD_END && state != State.CLASS_END) {
if (state != State.METHOD_END && state != State.CLASS_END && state != State.FIELD_END) {
throw new IllegalStateException();
}
checkTopLevel();
@@ -636,6 +636,15 @@ public class JetTypeMapper extends BindingTraceAware {
return signatureVisitor.makeJvmMethodSignature(methodName);
}
@Nullable
public String mapFieldSignature(@NotNull JetType backingFieldType) {
BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE, true);
signatureVisitor.writeFieldTypeStart();
mapType(backingFieldType, signatureVisitor, JetTypeMapperMode.VALUE);
signatureVisitor.writeFieldTypeEnd();
return signatureVisitor.makeJavaGenericSignature();
}
private void writeThisIfNeeded(
@NotNull CallableMemberDescriptor descriptor,
@NotNull OwnerKind kind,