Class objects also can have delegated members

This commit is contained in:
Alexander Udalov
2013-10-29 15:59:08 +04:00
parent 29f3c4a1a0
commit cdecbc0915
6 changed files with 45 additions and 4 deletions
@@ -261,10 +261,12 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@NotNull final MemberExtractor<T> extractor,
@NotNull Collection<? extends CallableDescriptor> existingDescriptors
) {
//class objects do not have delegated members
if (thisDescriptor.getKind() == ClassKind.CLASS_OBJECT) {
JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject();
if (classOrObject == null) {
// Enum class objects do not have delegated members
return Collections.emptySet();
}
DelegationResolver.TypeResolver lazyTypeResolver = new DelegationResolver.TypeResolver() {
@Nullable
@Override
@@ -283,8 +285,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
return extractor.extract(type, name);
}
};
JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject();
assert classOrObject != null : "Should not be null for non class object class.";
return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, resolveSession.getTrace(), lazyMemberExtractor,
lazyTypeResolver);
}
@@ -0,0 +1,11 @@
package test
trait T {
fun foo(): Int
}
class A : T {
override fun foo() = 42
class object : T by A()
}
@@ -0,0 +1,15 @@
package test
internal final class A : test.T {
/*primary*/ public constructor A()
internal open override /*1*/ fun foo(): jet.Int
internal class object <class-object-for-A> : test.T {
/*primary*/ private constructor <class-object-for-A>()
internal open override /*1*/ /*delegation*/ fun foo(): jet.Int
}
}
internal trait T {
internal abstract fun foo(): jet.Int
}
@@ -294,6 +294,11 @@ public class DescriptorSerializationTestGenerated extends AbstractDescriptorSeri
doTest("compiler/testData/loadKotlin/classObject/ClassObjectPropertyInClass.kt");
}
@TestMetadata("Delegation.kt")
public void testDelegation() throws Exception {
doTest("compiler/testData/loadKotlin/classObject/Delegation.kt");
}
@TestMetadata("InnerClassInClassObject.kt")
public void testInnerClassInClassObject() throws Exception {
doTest("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
@@ -568,6 +568,11 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT
doTestWithAccessors("compiler/testData/loadKotlin/classObject/ClassObjectPropertyInClass.kt");
}
@TestMetadata("Delegation.kt")
public void testDelegation() throws Exception {
doTestWithAccessors("compiler/testData/loadKotlin/classObject/Delegation.kt");
}
@TestMetadata("InnerClassInClassObject.kt")
public void testInnerClassInClassObject() throws Exception {
doTestWithAccessors("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
@@ -570,6 +570,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/ClassObjectPropertyInClass.kt");
}
@TestMetadata("Delegation.kt")
public void testDelegation() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/Delegation.kt");
}
@TestMetadata("InnerClassInClassObject.kt")
public void testInnerClassInClassObject() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");