Class objects also can have delegated members
This commit is contained in:
+4
-4
@@ -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
|
||||
}
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user