Support properties in compatibility mode

This commit is contained in:
Mikhael Bogdanov
2018-05-29 14:36:30 +02:00
parent 0498c3b765
commit ad717d5335
7 changed files with 188 additions and 0 deletions
@@ -757,6 +757,23 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
@Override
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
if (accessorForCallableDescriptor.getAccessorKind() == AccessorKind.JVM_DEFAULT_COMPATIBILITY) {
markLineNumberForElement(element.getPsiOrParent(), codegen.v);
PropertyDescriptor descriptor = unwrapFakeOverrideToAnyDeclaration(original).getOriginal();
if (descriptor != original) {
descriptor = (PropertyDescriptor) descriptor
.copy(original.getContainingDeclaration(), descriptor.getModality(), descriptor.getVisibility(),
descriptor.getKind(), false);
}
boolean isGetter = callableDescriptor instanceof PropertyGetterDescriptor;
PropertyAccessorDescriptor originalAccessor = isGetter ? descriptor.getGetter(): descriptor.getSetter();
PropertyAccessorDescriptor accessorDescriptor = isGetter ? accessor.getGetter() : accessor.getSetter();
generateMethodCallTo(originalAccessor, accessorDescriptor, codegen.v)
.coerceTo(signature.getReturnType(), null, codegen.v);
codegen.v.areturn(signature.getReturnType());
return;
}
AccessorKind fieldAccessorKind = accessor instanceof AccessorForPropertyBackingField
? accessor.getAccessorKind() : null;
boolean syntheticBackingField = fieldAccessorKind == AccessorKind.FIELD_FROM_LOCAL;