[K2] Resolve bodies of const properties during IMPLICIT_TYPES_BODY_RESOLVE
This is required to implement constant evaluator on the FIR level. #KT-64151
This commit is contained in:
+2
-1
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||
@@ -144,7 +145,7 @@ open class FirDeclarationsResolveTransformer(
|
||||
|
||||
val returnTypeRefBeforeResolve = property.returnTypeRef
|
||||
val cannotHaveDeepImplicitTypeRefs = property.backingField?.returnTypeRef !is FirImplicitTypeRef
|
||||
if (implicitTypeOnly && returnTypeRefBeforeResolve !is FirImplicitTypeRef && cannotHaveDeepImplicitTypeRefs) {
|
||||
if (!property.isConst && implicitTypeOnly && returnTypeRefBeforeResolve !is FirImplicitTypeRef && cannotHaveDeepImplicitTypeRefs) {
|
||||
return property
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||
@@ -167,7 +168,8 @@ open class FirImplicitAwareBodyResolveTransformer(
|
||||
}
|
||||
|
||||
val canHaveDeepImplicitTypeRefs = member is FirProperty && member.backingField?.returnTypeRef is FirResolvedTypeRef == false
|
||||
if (member.returnTypeRef is FirResolvedTypeRef && !canHaveDeepImplicitTypeRefs) return member
|
||||
val isConstProperty = member is FirProperty && member.isConst
|
||||
if (member.returnTypeRef is FirResolvedTypeRef && !canHaveDeepImplicitTypeRefs && !isConstProperty) return member
|
||||
val symbol = member.symbol
|
||||
val status = implicitBodyResolveComputationSession.getStatus(symbol)
|
||||
if (status is ImplicitBodyResolveComputationStatus.Computed) {
|
||||
|
||||
@@ -172,6 +172,8 @@ enum class FirResolvePhase(val noProcessor: Boolean = false) {
|
||||
* val baz get() = foo() // implicit type is Int
|
||||
* ```
|
||||
*
|
||||
* Also resolve initializers of const properties.
|
||||
*
|
||||
* This is a [*jumping phase*][FirResolvePhase].
|
||||
*
|
||||
* @see TYPES
|
||||
@@ -180,6 +182,12 @@ enum class FirResolvePhase(val noProcessor: Boolean = false) {
|
||||
|
||||
/**
|
||||
* The compiler evaluates expressions that are used as initializers for const properties and defaults of annotation's constructor.
|
||||
*
|
||||
* This phase has two reasons to exist as a separate phase:
|
||||
* 1. It is a synchronization point.
|
||||
* Compiler visits this phase only when all const properties are resolved.
|
||||
* This is especially useful when evaluating const properties from the Java world.
|
||||
* 2. The Analysis API can get results of constant evaluation before [BODY_RESOLVE] phase.
|
||||
*/
|
||||
CONSTANT_EVALUATION,
|
||||
|
||||
|
||||
Reference in New Issue
Block a user