diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 69a9082dbee..5a9d07249d7 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -397,7 +397,7 @@ class DeclarationsConverter( withCapturedTypeParameters { val status = FirDeclarationStatusImpl( if (isLocal) Visibilities.Local else modifiers.getVisibility(), - modifiers.getModality() + modifiers.getModality(isClassOrObject = true) ).apply { isExpect = modifiers.hasExpect() isActual = modifiers.hasActual() @@ -1070,7 +1070,7 @@ class DeclarationsConverter( fun defaultAccessorStatus() = // Downward propagation of `inline` and `external` modifiers (from property to its accessors) - FirDeclarationStatusImpl(propertyVisibility, modifiers.getModality()).apply { + FirDeclarationStatusImpl(propertyVisibility, modifiers.getModality(isClassOrObject = false)).apply { isInline = modifiers.hasInline() isExternal = modifiers.hasExternal() } @@ -1097,7 +1097,7 @@ class DeclarationsConverter( // Upward propagation of `inline` and `external` modifiers (from accessors to property) // Note that, depending on `var` or `val`, checking setter's modifiers should be careful: for `val`, setter doesn't // exist (null); for `var`, the retrieval of the specific modifier is supposed to be `true` - status = FirDeclarationStatusImpl(propertyVisibility, modifiers.getModality()).apply { + status = FirDeclarationStatusImpl(propertyVisibility, modifiers.getModality(isClassOrObject = false)).apply { isExpect = modifiers.hasExpect() || classWrapper?.hasExpect() == true isActual = modifiers.hasActual() isOverride = modifiers.hasOverride() @@ -1218,7 +1218,7 @@ class DeclarationsConverter( } val status = // Downward propagation of `inline` and `external` modifiers (from property to its accessors) - FirDeclarationStatusImpl(accessorVisibility, modifiers.getModality()).apply { + FirDeclarationStatusImpl(accessorVisibility, modifiers.getModality(isClassOrObject = false)).apply { isInline = propertyModifiers.hasInline() || modifiers.hasInline() isExternal = propertyModifiers.hasExternal() || modifiers.hasExternal() } @@ -1388,7 +1388,7 @@ class DeclarationsConverter( name = functionName status = FirDeclarationStatusImpl( if (isLocal) Visibilities.Local else modifiers.getVisibility(), - modifiers.getModality() + modifiers.getModality(isClassOrObject = false) ).apply { isExpect = modifiers.hasExpect() || classWrapper?.hasExpect() == true isActual = modifiers.hasActual() diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 32e42a8d68f..a609f5da606 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -66,7 +66,7 @@ class ValueParameter( symbol = FirPropertySymbol(callableId) dispatchReceiverType = currentDispatchReceiver isLocal = false - status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply { + status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality(isClassOrObject = false)).apply { this.isExpect = isExpect isActual = modifiers.hasActual() isOverride = modifiers.hasOverride() diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt index a2c883a32c2..24ae47162ec 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt @@ -146,10 +146,10 @@ class Modifier( } } - fun getModality(): Modality? { + fun getModality(isClassOrObject: Boolean): Modality? { return when { inheritanceModifiers.contains(InheritanceModifier.FINAL) -> Modality.FINAL - inheritanceModifiers.contains(InheritanceModifier.SEALED) -> Modality.SEALED + inheritanceModifiers.contains(InheritanceModifier.SEALED) -> if (isClassOrObject) Modality.SEALED else null inheritanceModifiers.contains(InheritanceModifier.ABSTRACT) -> Modality.ABSTRACT inheritanceModifiers.contains(InheritanceModifier.OPEN) -> Modality.OPEN else -> null diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 3594f8185bd..7feba2f2b9f 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -148,7 +148,7 @@ open class RawFirBuilder( when { this == null -> null hasModifier(FINAL_KEYWORD) -> Modality.FINAL - hasModifier(SEALED_KEYWORD) -> Modality.SEALED + hasModifier(SEALED_KEYWORD) -> if (this@modality is KtClassOrObject) Modality.SEALED else null hasModifier(ABSTRACT_KEYWORD) -> Modality.ABSTRACT else -> if (hasModifier(OPEN_KEYWORD)) Modality.OPEN else null } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/sealedOnMembers.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/sealedOnMembers.fir.kt index c9061508727..fd7e97ebe76 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/sealedOnMembers.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/sealedOnMembers.fir.kt @@ -8,7 +8,7 @@ interface B { abstract var bar: Unit } -interface C : A, B +interface C : A, B abstract class D(sealed var x: Int) { abstract var y: Unit