FIR: resolve types in accessors when not resolving accessors

This commit is contained in:
Jinseong Jeon
2021-09-08 15:10:27 -07:00
committed by TeamCityServer
parent c51d37d65d
commit ad18343413
2 changed files with 22 additions and 6 deletions
@@ -77,6 +77,7 @@ internal class FirDesignatedImplicitTypesTransformerForIDE(
//Not resolved for some getters and setters #KT-46995 //Not resolved for some getters and setters #KT-46995
// check(declaration.getter?.returnTypeRef?.let { it is FirResolvedTypeRef } ?: true) // check(declaration.getter?.returnTypeRef?.let { it is FirResolvedTypeRef } ?: true)
// check(declaration.setter?.returnTypeRef?.let { it is FirResolvedTypeRef } ?: true) // check(declaration.setter?.returnTypeRef?.let { it is FirResolvedTypeRef } ?: true)
// check(declaration.setter?.valueParameters?.get(0)?.returnTypeRef?.let { it is FirResolvedTypeRef } ?: true)
} }
else -> error("Unexpected type: ${declaration::class.simpleName}") else -> error("Unexpected type: ${declaration::class.simpleName}")
} }
@@ -170,6 +170,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
if (mayResolveSetter) FirPropertyBodyResolveState.EVERYTHING_RESOLVED if (mayResolveSetter) FirPropertyBodyResolveState.EVERYTHING_RESOLVED
else FirPropertyBodyResolveState.INITIALIZER_AND_GETTER_RESOLVED else FirPropertyBodyResolveState.INITIALIZER_AND_GETTER_RESOLVED
) )
} else if (returnTypeRef is FirResolvedTypeRef) {
// Even though we're not going to resolve accessors themselves (so as to avoid resolve cycle, like KT-48634),
// we still need to resolve types in accessors (as per IMPLICIT_TYPES_BODY_RESOLVE contract).
property.getter?.transformTypeWithPropertyType(returnTypeRef)
property.setter?.transformTypeWithPropertyType(returnTypeRef)
property.setter?.transformReturnTypeRef(transformer, withExpectedType(session.builtinTypes.unitType.type))
} }
} }
} }
@@ -343,18 +349,27 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
storeVariableReturnType(this) storeVariableReturnType(this)
enhancedTypeRef = returnTypeRef enhancedTypeRef = returnTypeRef
// We need update type of getter for case when its type was approximated // We need update type of getter for case when its type was approximated
getter?.replaceReturnTypeRef(enhancedTypeRef) getter?.transformTypeWithPropertyType(enhancedTypeRef)
} }
if (mayResolveSetter) { setter?.let {
setter?.let { if (it.valueParameters[0].returnTypeRef is FirImplicitTypeRef) {
if (it.valueParameters[0].returnTypeRef is FirImplicitTypeRef) { it.transformTypeWithPropertyType(enhancedTypeRef)
it.valueParameters[0].transformReturnTypeRef(StoreType, enhancedTypeRef) }
} if (mayResolveSetter) {
transformAccessor(it, enhancedTypeRef, this) transformAccessor(it, enhancedTypeRef, this)
} }
} }
} }
private fun FirPropertyAccessor.transformTypeWithPropertyType(propertyTypeRef: FirTypeRef) {
when {
isGetter ->
replaceReturnTypeRef(propertyTypeRef)
isSetter ->
valueParameters[0].transformReturnTypeRef(StoreType, propertyTypeRef)
}
}
private fun transformAccessor( private fun transformAccessor(
accessor: FirPropertyAccessor, accessor: FirPropertyAccessor,
enhancedTypeRef: FirTypeRef, enhancedTypeRef: FirTypeRef,