diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt index 99836bac933..11edbfe5888 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt @@ -69,13 +69,17 @@ protected constructor( // NB we should resolve type alias descriptors even if a class descriptor with corresponding name is present val classes = classDescriptors(name) val typeAliases = typeAliasDescriptors(name) - var resultingClass: ClassDescriptor? = null + // See getFirstClassifierDiscriminateHeaders() + var result: ClassifierDescriptor? = null for (klass in classes) { - // See getFirstClassifierDiscriminateHeaders() if (!klass.isHeader) return klass - if (resultingClass == null) resultingClass = klass + if (result == null) result = klass } - return resultingClass ?: typeAliases.firstOrNull() + for (typeAlias in typeAliases) { + if (!typeAlias.isHeader) return typeAlias + if (result == null) result = typeAlias + } + return result } override fun getContributedFunctions(name: Name, location: LookupLocation): Collection { diff --git a/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/common.kt b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/common.kt new file mode 100644 index 00000000000..325e2668d8a --- /dev/null +++ b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/common.kt @@ -0,0 +1,3 @@ +class Foo(val a: A? = null) + +header class A diff --git a/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/jvm.kt b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/jvm.kt new file mode 100644 index 00000000000..3f1e5af8ae7 --- /dev/null +++ b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/jvm.kt @@ -0,0 +1,5 @@ +impl typealias A = AImpl + +class AImpl { + fun jvm(): A = this +} diff --git a/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/jvm2.kt b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/jvm2.kt new file mode 100644 index 00000000000..19a4ef10a49 --- /dev/null +++ b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/jvm2.kt @@ -0,0 +1 @@ +val a = Foo().a?.jvm() diff --git a/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/output.txt b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/output.txt new file mode 100644 index 00000000000..e2a887ac2ae --- /dev/null +++ b/compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/output.txt @@ -0,0 +1,11 @@ +-- Common -- +Exit code: OK +Output: + +-- JVM -- +Exit code: OK +Output: + +-- JVM (2) -- +Exit code: OK +Output: diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java index 83a9c4ba682..869b8a24218 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java @@ -155,6 +155,12 @@ public class MultiPlatformIntegrationTestGenerated extends AbstractMultiPlatform KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/multiplatform/implTypeAlias"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, true); } + @TestMetadata("discriminateHeaderClassInFavorOfTypeAlias") + public void testDiscriminateHeaderClassInFavorOfTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/implTypeAlias/discriminateHeaderClassInFavorOfTypeAlias/"); + doTest(fileName); + } + @TestMetadata("generic") public void testGeneric() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/implTypeAlias/generic/");