[FIR] Cleanup FIR modules. Part 5 (body.resolve package)

This commit is contained in:
Dmitriy Novozhilov
2020-06-26 14:59:37 +03:00
parent 285b6d28af
commit e817f919c2
6 changed files with 34 additions and 28 deletions
@@ -94,7 +94,6 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
protected inline val integerLiteralTypeApproximator: IntegerLiteralTypeApproximationTransformer get() = components.integerLiteralTypeApproximator protected inline val integerLiteralTypeApproximator: IntegerLiteralTypeApproximationTransformer get() = components.integerLiteralTypeApproximator
protected inline val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater get() = components.integerOperatorsTypeUpdater protected inline val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater get() = components.integerOperatorsTypeUpdater
val ResolutionMode.expectedType: FirTypeRef? val ResolutionMode.expectedType: FirTypeRef?
get() = when (this) { get() = when (this) {
is ResolutionMode.WithExpectedType -> expectedTypeRef is ResolutionMode.WithExpectedType -> expectedTypeRef
@@ -294,4 +293,3 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
override val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater = IntegerOperatorsTypeUpdater(integerLiteralTypeApproximator) override val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater = IntegerOperatorsTypeUpdater(integerLiteralTypeApproximator)
} }
} }
@@ -146,7 +146,8 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
dataFlowAnalyzer.exitTryMainBlock(tryExpression) dataFlowAnalyzer.exitTryMainBlock(tryExpression)
tryExpression.transformCatches(this, ResolutionMode.ContextDependent) tryExpression.transformCatches(this, ResolutionMode.ContextDependent)
var callCompleted: Boolean = false var callCompleted = false
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
var result = syntheticCallGenerator.generateCalleeForTryExpression(tryExpression)?.let { var result = syntheticCallGenerator.generateCalleeForTryExpression(tryExpression)?.let {
val expectedTypeRef = data.expectedType val expectedTypeRef = data.expectedType
@@ -199,7 +200,10 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
return result.compose() return result.compose()
} }
override fun transformThrowExpression(throwExpression: FirThrowExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> { override fun transformThrowExpression(
throwExpression: FirThrowExpression,
data: ResolutionMode
): CompositeTransformResult<FirStatement> {
return transformer.transformExpression(throwExpression, data).also { return transformer.transformExpression(throwExpression, data).also {
dataFlowAnalyzer.exitThrowExceptionNode(it.single as FirThrowExpression) dataFlowAnalyzer.exitThrowExceptionNode(it.single as FirThrowExpression)
} }
@@ -661,7 +661,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
.mapNotNull { (it as? FirExpression)?.resultType?.coneTypeUnsafe() } .mapNotNull { (it as? FirExpression)?.resultType?.coneTypeUnsafe() }
af.replaceReturnTypeRef( af.replaceReturnTypeRef(
af.returnTypeRef.resolvedTypeFromPrototype( af.returnTypeRef.resolvedTypeFromPrototype(
inferenceComponents.ctx.commonSuperTypeOrNull(returnTypes) ?: session.builtinTypes.unitType.coneTypeUnsafe() inferenceComponents.ctx.commonSuperTypeOrNull(returnTypes) ?: session.builtinTypes.unitType.type
) )
) )
af.replaceTypeRef(af.constructFunctionalTypeRef()) af.replaceTypeRef(af.constructFunctionalTypeRef())
@@ -689,6 +689,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
it.bind(this@addReturn) it.bind(this@addReturn)
} }
} }
@Suppress("UNCHECKED_CAST")
return (returnExpression as E).compose() return (returnExpression as E).compose()
} }
return element.compose() return element.compose()
@@ -45,18 +45,10 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
var enableArrayOfCallTransformation = false var enableArrayOfCallTransformation = false
init { init {
@Suppress("LeakingThis")
components.callResolver.initTransformer(this) components.callResolver.initTransformer(this)
} }
private inline fun <T> withFirArrayOfCallTransformer(block: () -> T): T {
enableArrayOfCallTransformation = true
return try {
block()
} finally {
enableArrayOfCallTransformation = false
}
}
override fun transformExpression(expression: FirExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> { override fun transformExpression(expression: FirExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> {
if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) { if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) {
val type = buildErrorTypeRef { val type = buildErrorTypeRef {
@@ -242,7 +234,6 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
withNewLocalScope { withNewLocalScope {
transformBlockInCurrentScope(block, data) transformBlockInCurrentScope(block, data)
} }
return block.compose() return block.compose()
} }
@@ -444,7 +435,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
checkNotNullCall.argumentList.transformArguments(transformer, ResolutionMode.ContextDependent) checkNotNullCall.argumentList.transformArguments(transformer, ResolutionMode.ContextDependent)
var callCompleted: Boolean = false var callCompleted = false
val result = components.syntheticCallGenerator.generateCalleeForCheckNotNullCall(checkNotNullCall)?.let { val result = components.syntheticCallGenerator.generateCalleeForCheckNotNullCall(checkNotNullCall)?.let {
val completionResult = callCompleter.completeCall(it, data.expectedType) val completionResult = callCompleter.completeCall(it, data.expectedType)
callCompleted = completionResult.callCompleted callCompleted = completionResult.callCompleted
@@ -499,7 +490,6 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
// This can happen in erroneous code only // This can happen in erroneous code only
resolvedAssignment resolvedAssignment
} }
// TODO: maybe replace with FirAbstractAssignment for performance?
(result as? FirVariableAssignment)?.let { dataFlowAnalyzer.exitVariableAssignment(it) } (result as? FirVariableAssignment)?.let { dataFlowAnalyzer.exitVariableAssignment(it) }
return result.compose() return result.compose()
} }
@@ -584,12 +574,11 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
constExpression.annotations.forEach { it.accept(this, data) } constExpression.annotations.forEach { it.accept(this, data) }
fun constructLiteralType(classId: ClassId, isNullable: Boolean = false): ConeKotlinType { fun constructLiteralType(classId: ClassId, isNullable: Boolean = false): ConeKotlinType {
val symbol = symbolProvider.getClassLikeSymbolByFqName(classId) ?: return ConeClassErrorType("Missing stdlib class: ${classId}") val symbol = symbolProvider.getClassLikeSymbolByFqName(classId) ?: return ConeClassErrorType("Missing stdlib class: $classId")
return symbol.toLookupTag().constructClassType(emptyArray(), isNullable) return symbol.toLookupTag().constructClassType(emptyArray(), isNullable)
} }
val kind = constExpression.kind val type = when (val kind = constExpression.kind) {
val type = when (kind) {
FirConstKind.Null -> session.builtinTypes.nullableNothingType.type FirConstKind.Null -> session.builtinTypes.nullableNothingType.type
FirConstKind.Boolean -> session.builtinTypes.booleanType.type FirConstKind.Boolean -> session.builtinTypes.booleanType.type
FirConstKind.Char -> constructLiteralType(StandardClassIds.Char) FirConstKind.Char -> constructLiteralType(StandardClassIds.Char)
@@ -600,6 +589,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
FirConstKind.String -> constructLiteralType(StandardClassIds.String) FirConstKind.String -> constructLiteralType(StandardClassIds.String)
FirConstKind.Float -> constructLiteralType(StandardClassIds.Float) FirConstKind.Float -> constructLiteralType(StandardClassIds.Float)
FirConstKind.Double -> constructLiteralType(StandardClassIds.Double) FirConstKind.Double -> constructLiteralType(StandardClassIds.Double)
FirConstKind.IntegerLiteral, FirConstKind.UnsignedIntegerLiteral -> { FirConstKind.IntegerLiteral, FirConstKind.UnsignedIntegerLiteral -> {
val integerLiteralType = val integerLiteralType =
ConeIntegerLiteralTypeImpl(constExpression.value as Long, isUnsigned = kind == FirConstKind.UnsignedIntegerLiteral) ConeIntegerLiteralTypeImpl(constExpression.value as Long, isUnsigned = kind == FirConstKind.UnsignedIntegerLiteral)
@@ -608,6 +598,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
val approximatedType = integerLiteralType.getApproximatedType(expectedType) val approximatedType = integerLiteralType.getApproximatedType(expectedType)
val newConstKind = approximatedType.toConstKind() val newConstKind = approximatedType.toConstKind()
if (newConstKind == null) { if (newConstKind == null) {
@Suppress("UNCHECKED_CAST")
constExpression.replaceKind(FirConstKind.Int as FirConstKind<T>) constExpression.replaceKind(FirConstKind.Int as FirConstKind<T>)
dataFlowAnalyzer.exitConstExpresion(constExpression as FirConstExpression<*>) dataFlowAnalyzer.exitConstExpresion(constExpression as FirConstExpression<*>)
constExpression.resultType = buildErrorTypeRef { constExpression.resultType = buildErrorTypeRef {
@@ -616,6 +607,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
} }
return constExpression.compose() return constExpression.compose()
} }
@Suppress("UNCHECKED_CAST")
constExpression.replaceKind(newConstKind as FirConstKind<T>) constExpression.replaceKind(newConstKind as FirConstKind<T>)
approximatedType approximatedType
} else { } else {
@@ -656,6 +648,15 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
} }
private inline fun <T> withFirArrayOfCallTransformer(block: () -> T): T {
enableArrayOfCallTransformation = true
return try {
block()
} finally {
enableArrayOfCallTransformation = false
}
}
private fun ConeTypeProjection.toFirTypeProjection(): FirTypeProjection = when (this) { private fun ConeTypeProjection.toFirTypeProjection(): FirTypeProjection = when (this) {
is ConeStarProjection -> buildStarProjection() is ConeStarProjection -> buildStarProjection()
else -> { else -> {
@@ -3,8 +3,6 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
@@ -30,7 +28,10 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@OptIn(AdapterForResolveProcessor::class) @OptIn(AdapterForResolveProcessor::class)
class FirImplicitTypeBodyResolveProcessor(session: FirSession, scopeSession: ScopeSession) : FirTransformerBasedResolveProcessor(session, scopeSession) { class FirImplicitTypeBodyResolveProcessor(
session: FirSession,
scopeSession: ScopeSession
) : FirTransformerBasedResolveProcessor(session, scopeSession) {
override val transformer = FirImplicitTypeBodyResolveTransformerAdapter(session, scopeSession) override val transformer = FirImplicitTypeBodyResolveTransformerAdapter(session, scopeSession)
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.FirSymbolOwner
@@ -18,7 +19,7 @@ class LocalClassesNavigationInfo(
private val parentClassForFunction: Map<FirCallableMemberDeclaration<*>, FirClass<*>>, private val parentClassForFunction: Map<FirCallableMemberDeclaration<*>, FirClass<*>>,
val allMembers: List<FirSymbolOwner<*>> val allMembers: List<FirSymbolOwner<*>>
) { ) {
val designationMap by lazy { val designationMap: Map<FirCallableMemberDeclaration<*>, List<FirClass<*>>> by lazy {
parentClassForFunction.keys.keysToMap { parentClassForFunction.keys.keysToMap {
pathForCallable(it) pathForCallable(it)
} }
@@ -45,10 +46,10 @@ fun FirClass<*>.collectLocalClassesNavigationInfo(): LocalClassesNavigationInfo
} }
private class NavigationInfoVisitor : FirDefaultVisitorVoid() { private class NavigationInfoVisitor : FirDefaultVisitorVoid() {
val resultingMap = mutableMapOf<FirCallableMemberDeclaration<*>, FirClass<*>>() val resultingMap: MutableMap<FirCallableMemberDeclaration<*>, FirClass<*>> = mutableMapOf()
val parentForClass = mutableMapOf<FirClass<*>, FirClass<*>?>() val parentForClass: MutableMap<FirClass<*>, FirClass<*>?> = mutableMapOf()
val allMembers = mutableListOf<FirSymbolOwner<*>>() val allMembers: MutableList<FirSymbolOwner<*>> = mutableListOf()
private var currentPath = persistentListOf<FirClass<*>>() private var currentPath: PersistentList<FirClass<*>> = persistentListOf()
override fun visitElement(element: FirElement) {} override fun visitElement(element: FirElement) {}