RAW FIR: record property accessors' own modality properly

This commit is contained in:
Jinseong Jeon
2021-02-23 15:18:03 -08:00
committed by Dmitriy Novozhilov
parent e009b71f88
commit 1090eca086
9 changed files with 39 additions and 40 deletions
@@ -29,10 +29,10 @@ internal fun isInsideExternalClass(containingClass: FirRegularClass, context: Ch
private inline fun isInsideSpecificClass(
containingClass: FirRegularClass,
context: CheckerContext,
specificStatus: (FirRegularClass) -> Boolean
predicate: (FirRegularClass) -> Boolean
): Boolean =
specificStatus.invoke(containingClass) ||
context.containingDeclarations.asReversed().any { it is FirRegularClass && specificStatus.invoke(it) }
predicate.invoke(containingClass) ||
context.containingDeclarations.asReversed().any { it is FirRegularClass && predicate.invoke(it) }
internal fun FirMemberDeclaration.isEffectivelyExpect(
containingClass: FirRegularClass?,
@@ -1151,7 +1151,7 @@ class DeclarationsConverter(
}
val status =
// Downward propagation of `inline` and `external` modifiers (from property to its accessors)
FirDeclarationStatusImpl(accessorVisibility, Modality.FINAL).apply {
FirDeclarationStatusImpl(accessorVisibility, modifiers.getModality()).apply {
isInline = propertyModifiers.hasInline() || modifiers.hasInline()
isExternal = propertyModifiers.hasExternal() || modifiers.hasExternal()
}
@@ -339,7 +339,7 @@ class RawFirBuilder(
if (this?.visibility != null && this.visibility != Visibilities.Unknown) this.visibility else property.visibility
// Downward propagation of `inline` and `external` modifiers (from property to its accessors)
val status =
FirDeclarationStatusImpl(accessorVisibility, Modality.FINAL).apply {
FirDeclarationStatusImpl(accessorVisibility, this?.modality).apply {
isInline = property.hasModifier(INLINE_KEYWORD) ||
this@toFirPropertyAccessor?.hasModifier(INLINE_KEYWORD) == true
isExternal = property.hasModifier(EXTERNAL_KEYWORD) ||
@@ -195,8 +195,8 @@ val FirProperty.hasBackingField: Boolean
else -> {
val getter = getter ?: return true
if (isVar && setter == null) return true
if (setter?.hasBody == false) return true
if (!getter.hasBody) return true
if (setter?.hasBody == false && setter?.isAbstract == false) return true
if (!getter.hasBody && !getter.isAbstract) return true
return isReferredViaField == true
}