[FIR] Cleanup FIR modules. Part 5 (body.resolve package)
This commit is contained in:
-2
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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()
|
||||||
|
|||||||
+16
-15
@@ -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 -> {
|
||||||
|
|||||||
+4
-3
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-5
@@ -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) {}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user