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 final MemberExtractor<T> extractor,
|
||||||
@NotNull Collection<? extends CallableDescriptor> existingDescriptors
|
@NotNull Collection<? extends CallableDescriptor> existingDescriptors
|
||||||
) {
|
) {
|
||||||
//class objects do not have delegated members
|
JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject();
|
||||||
if (thisDescriptor.getKind() == ClassKind.CLASS_OBJECT) {
|
if (classOrObject == null) {
|
||||||
|
// Enum class objects do not have delegated members
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
DelegationResolver.TypeResolver lazyTypeResolver = new DelegationResolver.TypeResolver() {
|
DelegationResolver.TypeResolver lazyTypeResolver = new DelegationResolver.TypeResolver() {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@@ -283,8 +285,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
|||||||
return extractor.extract(type, name);
|
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,
|
return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, resolveSession.getTrace(), lazyMemberExtractor,
|
||||||
lazyTypeResolver);
|
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");
|
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")
|
@TestMetadata("InnerClassInClassObject.kt")
|
||||||
public void testInnerClassInClassObject() throws Exception {
|
public void testInnerClassInClassObject() throws Exception {
|
||||||
doTest("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
|
doTest("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
|
||||||
|
|||||||
@@ -568,6 +568,11 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT
|
|||||||
doTestWithAccessors("compiler/testData/loadKotlin/classObject/ClassObjectPropertyInClass.kt");
|
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")
|
@TestMetadata("InnerClassInClassObject.kt")
|
||||||
public void testInnerClassInClassObject() throws Exception {
|
public void testInnerClassInClassObject() throws Exception {
|
||||||
doTestWithAccessors("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
|
doTestWithAccessors("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
|
||||||
|
|||||||
+5
@@ -570,6 +570,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
|
|||||||
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/ClassObjectPropertyInClass.kt");
|
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")
|
@TestMetadata("InnerClassInClassObject.kt")
|
||||||
public void testInnerClassInClassObject() throws Exception {
|
public void testInnerClassInClassObject() throws Exception {
|
||||||
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
|
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/classObject/InnerClassInClassObject.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user