fixup
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueKindUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueKindUtils.kt
index 7171147..032bb52 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueKindUtils.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueKindUtils.kt
@@ -26,19 +26,20 @@
if (isVar) return DataFlowValue.Kind.MUTABLE_PROPERTY
if (isOverridable) return DataFlowValue.Kind.PROPERTY_WITH_GETTER
if (!hasDefaultGetter()) return DataFlowValue.Kind.PROPERTY_WITH_GETTER
- val visibilityFromOtherModules = visibilityFromOtherModules()
- if (visibilityFromOtherModules == VisibilityFromOtherModule.INVISIBLE) return DataFlowValue.Kind.STABLE_VALUE
+ val isInvisibleFromOtherModuleUnwrappedFakeOverride = DescriptorUtils.unwrapFakeOverride(this).isInvisibleFromOtherModules()
+ if (isInvisibleFromOtherModuleUnwrappedFakeOverride) return DataFlowValue.Kind.STABLE_VALUE
val declarationModule = DescriptorUtils.getContainingModule(this)
if (!areCompiledTogether(usageModule, declarationModule)) return DataFlowValue.Kind.ALIEN_PUBLIC_PROPERTY
if (kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
if (overriddenDescriptors.any { isDeclaredInAnotherModule(usageModule) }) {
- val deprecationForInvisibleParentNeeded =
- visibilityFromOtherModules == VisibilityFromOtherModule.PARENT_INVISIBLE_BASE_PARENT_VISIBLE &&
+ val deprecationForInvisibleFakeOverride =
+ kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE &&
+ isInvisibleFromOtherModules() != isInvisibleFromOtherModuleUnwrappedFakeOverride &&
!languageVersionSettings.supportsFeature(ProhibitSmartcastsOnPropertyFromAlienBaseClassInheritedInInvisibleClass)
return when {
- deprecationForInvisibleParentNeeded ->
+ deprecationForInvisibleFakeOverride ->
DataFlowValue.Kind.LEGACY_ALIEN_BASE_PROPERTY_INHERITED_IN_INVISIBLE_CLASS
!languageVersionSettings.supportsFeature(ProhibitSmartcastsOnPropertyFromAlienBaseClass) ->
DataFlowValue.Kind.LEGACY_ALIEN_BASE_PROPERTY
@@ -163,35 +164,11 @@
return true
}
-private enum class VisibilityFromOtherModule {
- INVISIBLE,
- PARENT_INVISIBLE_BASE_PARENT_VISIBLE,
- VISIBLE
-}
-
-private fun DeclarationDescriptorWithVisibility.visibilityFromOtherModules(): VisibilityFromOtherModule {
- if (DescriptorVisibilities.INVISIBLE_FROM_OTHER_MODULES.contains(visibility)) return VisibilityFromOtherModule.INVISIBLE
+private fun DeclarationDescriptorWithVisibility.isInvisibleFromOtherModules(): Boolean {
+ if (DescriptorVisibilities.INVISIBLE_FROM_OTHER_MODULES.contains(visibility)) return true
val containingDeclaration = containingDeclaration
- if (containingDeclaration !is DeclarationDescriptorWithVisibility) {
- return VisibilityFromOtherModule.VISIBLE
- }
- val containingDeclarationVisibilityFromOtherModule = containingDeclaration.visibilityFromOtherModules()
- if (this !is CallableMemberDescriptor || kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE ||
- containingDeclarationVisibilityFromOtherModule == VisibilityFromOtherModule.VISIBLE
- ) {
- return containingDeclarationVisibilityFromOtherModule
- }
- // Note: only the case with one base class is under interest here,
- // otherwise it's an interface property and smart cast is already not possible
- val baseContainingDeclaration = DescriptorUtils.unwrapFakeOverride(this).containingDeclaration
- if (baseContainingDeclaration !is DeclarationDescriptorWithVisibility) {
- return containingDeclarationVisibilityFromOtherModule
- }
- if (baseContainingDeclaration.visibilityFromOtherModules() == VisibilityFromOtherModule.INVISIBLE) {
- return VisibilityFromOtherModule.INVISIBLE
- }
- return VisibilityFromOtherModule.PARENT_INVISIBLE_BASE_PARENT_VISIBLE
+ return containingDeclaration is DeclarationDescriptorWithVisibility && containingDeclaration.isInvisibleFromOtherModules()
}
private fun PropertyDescriptor.hasDefaultGetter(): Boolean {