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
}
+7 -7
View File
@@ -28,19 +28,19 @@ package MyPackage
abstract fun j() {}
//property accessors
<!MUST_BE_INITIALIZED!>var i: Int<!> abstract get abstract set
var i1: Int = 0; abstract get abstract set
var i: Int abstract get abstract set
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var j: Int<!> get() = i; abstract set
var j1: Int = 0; get() = i; abstract set
var j: Int get() = i; abstract set
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; abstract set
<!MUST_BE_INITIALIZED!>var k: Int<!> abstract set
var k1: Int = 0; abstract set
<!MUST_BE_INITIALIZED!>var l: Int<!> abstract get abstract set
var l1: Int = 0; abstract get abstract set
var l: Int abstract get abstract set
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var n: Int<!> abstract get abstract set(v: Int) {}
var n: Int abstract get abstract set(v: Int) {}
// FILE: c.kt
//creating an instance
@@ -29,18 +29,17 @@ abstract class MyAbstractClass() {
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
//property accessors
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var i: Int<!> abstract get abstract set
var i1: Int = 0; abstract get abstract set
var i: Int abstract get abstract set
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var j: Int<!> get() = i; abstract set
<!MUST_BE_INITIALIZED!>var j1: Int<!> get() = i; abstract set
var j: Int get() = i; abstract set
var j1: Int get() = i; abstract set
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> abstract set
var k1: Int = 0; abstract set
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var l: Int<!> abstract get abstract set
var l1: Int = 0; abstract get abstract set
var l: Int abstract get abstract set
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var n: Int<!> abstract get abstract set(v: Int) {}
var n: Int abstract get abstract set(v: Int) {}
}
+7 -7
View File
@@ -29,17 +29,17 @@ class MyClass() {
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
//property accessors
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var i: Int<!> abstract get abstract set
var i1: Int = 0; abstract get abstract set
var i: Int abstract get abstract set
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var j: Int<!> get() = i; abstract set
var j1: Int = 0; get() = i; abstract set
var j: Int get() = i; abstract set
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; abstract set
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> abstract set
var k1: Int = 0; abstract set
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var l: Int<!> abstract get abstract set
var l1: Int = 0; abstract get abstract set
var l: Int abstract get abstract set
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var n: Int<!> abstract get abstract set(v: Int) {}
var n: Int abstract get abstract set(v: Int) {}
}
+3 -3
View File
@@ -32,8 +32,8 @@ interface MyTrait {
var i: Int abstract get abstract set
var i1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; abstract get abstract set
<!BACKING_FIELD_IN_INTERFACE!>var j: Int<!> get() = i; abstract set
<!BACKING_FIELD_IN_INTERFACE!>var j1: Int<!> = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; get() = i; abstract set
var j: Int get() = i; abstract set
var j1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; get() = i; abstract set
var k: Int abstract set
var k1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; abstract set
@@ -41,5 +41,5 @@ interface MyTrait {
var l: Int abstract get abstract set
var l1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; abstract get abstract set
<!BACKING_FIELD_IN_INTERFACE!>var n: Int<!> abstract get abstract set(v: Int) {}
var n: Int abstract get abstract set(v: Int) {}
}
@@ -31,17 +31,17 @@ enum class MyEnum() {
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
//property accessors
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var i: Int<!> abstract get abstract set
var i1: Int = 0; abstract get abstract set
var i: Int abstract get abstract set
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
<!MUST_BE_INITIALIZED!>var j: Int<!> get() = i; abstract set
var j1: Int = 0; get() = i; abstract set
var j: Int get() = i; abstract set
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; abstract set
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> abstract set
var k1: Int = 0; abstract set
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var l: Int<!> abstract get abstract set
var l1: Int = 0; abstract get abstract set
<!MUST_BE_INITIALIZED!>var n: Int<!> abstract get abstract set(v: Int) {}
var l: Int abstract get abstract set
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; abstract get abstract set
var n: Int abstract get abstract set(v: Int) {}
}