From bae92f3a33b3ce4bdb6360f8aabb4e6cd1a093a5 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 5 Sep 2018 13:25:49 +0300 Subject: [PATCH] Sealed class: handle the case with actual type alias #KT-26141 Fixed Before this commit, class super-type could be sealed only in the case it's the class we are inside or in the same file with. However, it's quite possible for the expect sealed class to be implemented by typealias. So in this commit we allow class super-type to be sealed if it's typealias expansion we are inside. --- .../org/jetbrains/kotlin/resolve/BodyResolver.java | 12 ++++++++++++ .../tests/multiplatform/sealedTypeAlias.kt | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 36fe54c1b85..e7cff04b914 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -40,7 +40,9 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.kotlin.resolve.calls.util.CallMaker; +import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; +import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver; import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices; @@ -497,6 +499,16 @@ public class BodyResolver { parentEnumOrSealed = new HashSet<>(); } parentEnumOrSealed.add(currentDescriptor.getTypeConstructor()); + if (currentDescriptor.isExpect()) { + List actualDescriptors = ExpectedActualResolver.INSTANCE.findCompatibleActualForExpected( + currentDescriptor, DescriptorUtilsKt.getModule( currentDescriptor) + ); + for (MemberDescriptor actualDescriptor: actualDescriptors) { + if (actualDescriptor instanceof TypeAliasDescriptor) { + parentEnumOrSealed.add(((TypeAliasDescriptor) actualDescriptor).getExpandedType().getConstructor()); + } + } + } } } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/sealedTypeAlias.kt b/compiler/testData/diagnostics/tests/multiplatform/sealedTypeAlias.kt index 2390f38994d..8694b547fb8 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/sealedTypeAlias.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/sealedTypeAlias.kt @@ -3,8 +3,8 @@ // FILE: common.kt expect sealed class Presence { - object Online: Presence - object Offline: Presence + object Online: Presence + object Offline: Presence } // MODULE: m2-jvm(m1-common)