[FIR] Add missing getters generation

This commit is contained in:
Nikolay Lunyak
2021-08-09 15:56:36 +03:00
committed by TeamCityServer
parent b72488b4c2
commit 1291f9e460
@@ -11,11 +11,12 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.utils.isInline
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.*
@@ -47,6 +48,8 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.name.SpecialNames
open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) {
private val statusResolver: FirStatusResolver = FirStatusResolver(session, scopeSession)
@@ -148,6 +151,10 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
storeVariableReturnType(property)
}
}
// In case an explicit backing field declaration
// is present, and the default accessors haven't
// been generated earlier.
property.generateMissingDefaultAccessors()
val delegate = property.delegate
if (delegate != null) {
transformPropertyAccessorsWithDelegate(property, delegate)
@@ -178,6 +185,51 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
}
}
private fun FirProperty.generateMissingDefaultAccessors() {
val fieldDeclaration = backingField ?: return
val typeCheckerContext = session.typeContext.newBaseTypeCheckerContext(
errorTypesEqualToAnything = false,
stubTypesEqualToAnything = false
)
if (fieldDeclaration.isSubtypeOf(this, typeCheckerContext)) {
this.replaceGetter(
FirDefaultPropertyGetter(
null,
this.moduleData,
FirDeclarationOrigin.Source,
this.returnTypeRef,
this.visibility,
this.symbol,
).also {
it.status = this.getDefaultAccessorStatus()
}
)
} else if (this.isVar && this.isSubtypeOf(fieldDeclaration, typeCheckerContext)) {
this.replaceSetter(
FirDefaultPropertySetter(
null,
this.moduleData,
FirDeclarationOrigin.Source,
this.returnTypeRef,
this.visibility,
this.symbol,
).also {
it.status = this.getDefaultAccessorStatus()
}
)
}
}
fun FirProperty.getDefaultAccessorStatus(): FirDeclarationStatus {
// Downward propagation of `inline` and `external` modifiers (from property to its accessors)
return FirDeclarationStatusImpl(this.visibility, this.modality).apply {
isInline = this@getDefaultAccessorStatus.isInline
isExternal = this@getDefaultAccessorStatus.isExternal
}
}
override fun transformField(field: FirField, data: ResolutionMode): FirField {
val returnTypeRef = field.returnTypeRef
if (implicitTypeOnly) return field