kt-1760 delegation to java iface:

- removed codegen's unnecessary lookup for a declaration
- skipped class' only supertype (if any) methods when delegating
This commit is contained in:
Kirill Berezin
2012-08-26 17:51:36 +04:00
committed by Andrey Breslav
parent 78cb5381f7
commit b84f068c33
6 changed files with 79 additions and 11 deletions
@@ -779,7 +779,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
StackValue field = StackValue.field(fieldType, classname, delegateField, false);
field.store(fieldType, iv);
JetClass superClass = (JetClass) classDescriptorToDeclaration(bindingContext, superClassDescriptor);
final CodegenContext delegateContext = context.intoClass(superClassDescriptor,
new OwnerKind.DelegateKind(StackValue.field(fieldType, classname,
delegateField, false),
@@ -788,7 +787,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
MapTypeMode.IMPL)
.getInternalName()),
state);
generateDelegates(superClass, delegateContext, field);
generateDelegates(superClassDescriptor, delegateContext, field);
}
private void lookupConstructorExpressionsInClosureIfPresent(final ConstructorContext constructorContext) {
@@ -1208,18 +1207,17 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return false;
}
protected void generateDelegates(JetClass toClass, CodegenContext delegateContext, StackValue field) {
protected void generateDelegates(ClassDescriptor toClass, CodegenContext delegateContext, StackValue field) {
final FunctionCodegen functionCodegen = new FunctionCodegen(delegateContext, v, state);
final PropertyCodegen propertyCodegen = new PropertyCodegen(delegateContext, v, functionCodegen, state);
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, toClass);
for (DeclarationDescriptor declaration : descriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
if (declaration instanceof CallableMemberDescriptor) {
CallableMemberDescriptor callableMemberDescriptor = (CallableMemberDescriptor) declaration;
if (callableMemberDescriptor.getKind() == CallableMemberDescriptor.Kind.DELEGATION) {
Set<? extends CallableMemberDescriptor> overriddenDescriptors = callableMemberDescriptor.getOverriddenDescriptors();
for (CallableMemberDescriptor overriddenDescriptor : overriddenDescriptors) {
if (overriddenDescriptor.getContainingDeclaration() == classDescriptor) {
if (overriddenDescriptor.getContainingDeclaration() == toClass) {
if (declaration instanceof PropertyDescriptor) {
propertyCodegen
.genDelegate((PropertyDescriptor) declaration, (PropertyDescriptor) overriddenDescriptor, field);