From aebb3bf0ee27aee701aea0b8ffca31396781a16c Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 11 Sep 2023 17:41:10 +0200 Subject: [PATCH] [FIR AA] Use resolvedType instead of coneTypeOrNull where applicable #KT-61367 Fixed --- .../analysis/api/fir/annotations/firAnnotationUtils.kt | 9 ++------- .../analysis/api/fir/components/KtFirCallResolver.kt | 8 ++++++-- .../api/fir/components/KtFirExpressionTypeProvider.kt | 2 +- .../api/fir/components/KtFirSmartcastProvider.kt | 3 ++- .../api/fir/evaluate/FirAnnotationValueConverter.kt | 2 ++ .../api/fir/evaluate/FirCompileTimeConstantEvaluator.kt | 8 ++++---- .../api/fir/references/FirReferenceResolveHelper.kt | 4 ++-- .../fir/references/KtFirCollectionLiteralReference.kt | 3 +++ .../api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt | 5 +++-- .../level/api/fir/file/structure/FirElementsRecorder.kt | 7 ++----- .../level/api/fir/transformers/LLFirBodyLazyResolver.kt | 3 ++- .../low/level/api/fir/util/firCheckResolvedUtils.kt | 3 +++ 12 files changed, 32 insertions(+), 25 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt index 0d9153788fd..d9279e6bf2f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/firAnnotationUtils.kt @@ -23,13 +23,7 @@ import org.jetbrains.kotlin.fir.declarations.resolvePhase import org.jetbrains.kotlin.fir.declarations.resolved import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId import org.jetbrains.kotlin.fir.declarations.toAnnotationClassIdSafe -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression -import org.jetbrains.kotlin.fir.expressions.arguments -import org.jetbrains.kotlin.fir.expressions.calleeReference -import org.jetbrains.kotlin.fir.expressions.unwrapAndFlattenArgument +import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationsHelper import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol @@ -51,6 +45,7 @@ internal fun mapAnnotationParameters(annotation: FirAnnotation): Map()?.isExtensionFunctionType == true) { + if (dispatchReceiver?.resolvedType?.isExtensionFunctionType == true) { firstArgIsExtensionReceiver = true } @@ -923,7 +923,7 @@ internal class KtFirCallResolver( private fun FirArrayLiteral.toTypeArgumentsMapping( partiallyAppliedSymbol: KtPartiallyAppliedSymbol<*, *> ): Map { - val elementType = coneTypeSafe()?.arrayElementType()?.asKtType() ?: return emptyMap() + val elementType = resolvedType.arrayElementType()?.asKtType() ?: return emptyMap() val typeParameter = partiallyAppliedSymbol.symbol.typeParameters.singleOrNull() ?: return emptyMap() return mapOf(typeParameter to elementType) } @@ -1157,6 +1157,8 @@ internal class KtFirCallResolver( private fun FirArrayLiteral.toKtCallInfo(): KtCallInfo? { val arrayOfSymbol = with(analysisSession) { + + @OptIn(UnresolvedExpressionTypeAccess::class) val type = coneTypeSafe() ?: return run { val defaultArrayOfSymbol = arrayOfSymbol(arrayOf) ?: return null @@ -1202,6 +1204,8 @@ internal class KtFirCallResolver( val firSymbol = arrayOfSymbol.firSymbol // No type parameter means this is an arrayOf call of primitives, in which case there is no type arguments val typeParameter = firSymbol.fir.typeParameters.singleOrNull() ?: return KtSubstitutor.Empty(token) + + @OptIn(UnresolvedExpressionTypeAccess::class) val elementType = coneTypeSafe()?.arrayElementType() ?: return KtSubstitutor.Empty(token) val coneSubstitutor = substitutorByMap(mapOf(typeParameter.symbol to elementType), rootModuleSession) return firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index c23e804daf1..09131e3a5fb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -72,7 +72,7 @@ internal class KtFirExpressionTypeProvider( // For unresolved `super`, we manually create an intersection type so that IDE features like completion can work correctly. val containingClass = (fir.dispatchReceiver as? FirThisReceiverExpression)?.calleeReference?.boundSymbol as? FirClassSymbol<*> - if (fir.calleeReference is FirSuperReference && fir.coneTypeOrNull is ConeErrorType && containingClass != null) { + if (fir.calleeReference is FirSuperReference && fir.resolvedType is ConeErrorType && containingClass != null) { val superTypes = containingClass.resolvedSuperTypes when (superTypes.size) { 0 -> analysisSession.builtinTypes.ANY diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt index 83915d136ee..b82223ddca6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSmartcastProvider.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.isStableSmartcast +import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis @@ -105,7 +106,7 @@ internal class KtFirSmartcastProvider( if (receiver == null || receiver == firExpression.explicitReceiver) return null if (!receiver.isStableSmartcast()) return null - val type = receiver.coneTypeSafe()?.asKtType() ?: return null + val type = receiver.resolvedType.asKtType() return KtImplicitReceiverSmartCast(type, kind, token) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt index 1e398ea0fb9..a38078d01ea 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirAnnotationValueConverter.kt @@ -45,6 +45,8 @@ internal object FirAnnotationValueConverter { private fun FirConstExpression.convertConstantExpression(): KtConstantAnnotationValue? { val expression = psi as? KtElement + + @OptIn(UnresolvedExpressionTypeAccess::class) val type = coneTypeOrNull val constantValue = when { value == null -> KtConstantValue.KtNullConstantValue(expression) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt index 03674125ade..79e0b298244 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt @@ -178,19 +178,19 @@ internal object FirCompileTimeConstantEvaluator { val opr1 = evaluate(functionCall.explicitReceiver, mode) ?: return null opr1.evaluate(function)?.let { - return it.adjustType(functionCall.coneTypeOrNull) + return it.adjustType(functionCall.resolvedType) } val argument = functionCall.arguments.firstOrNull() ?: return null val opr2 = evaluate(argument, mode) ?: return null opr1.evaluate(function, opr2)?.let { - return it.adjustType(functionCall.coneTypeOrNull) + return it.adjustType(functionCall.resolvedType) } return null } - private fun FirConstExpression<*>.adjustType(expectedType: ConeKotlinType?): FirConstExpression<*> { - val expectedKind = expectedType?.toConstantValueKind() + private fun FirConstExpression<*>.adjustType(expectedType: ConeKotlinType): FirConstExpression<*> { + val expectedKind = expectedType.toConstantValueKind() // Note that the resolved type for the const expression is not always matched with the const kind. For example, // fun foo(x: Int) { // when (x) { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index 923bdd23e65..b0278c2c740 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -422,7 +422,7 @@ internal object FirReferenceResolveHelper { // accessing the `super` property on `this`, hence this weird looking if condition. In addition, the current class type is available // from the dispatch receiver `this`. if (expression is KtLabelReferenceExpression && fir is FirPropertyAccessExpression && fir.calleeReference is FirSuperReference) { - return listOfNotNull(fir.dispatchReceiver?.coneTypeOrNull?.toTargetSymbol(session, symbolBuilder)) + return listOfNotNull(fir.dispatchReceiver?.resolvedType?.toTargetSymbol(session, symbolBuilder)) } val receiverOrImplicitInvoke = if (fir is FirImplicitInvokeCall) { fir.explicitReceiver?.unwrapSmartcastExpression() @@ -733,7 +733,7 @@ internal object FirReferenceResolveHelper { session: FirSession, symbolBuilder: KtSymbolByFirBuilder ): Collection { - val type = fir.coneTypeOrNull ?: return emptyList() + val type = fir.resolvedType return listOfNotNull(type.toTargetSymbol(session, symbolBuilder)) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirCollectionLiteralReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirCollectionLiteralReference.kt index b0ba0fbb1ca..dc143c1f788 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirCollectionLiteralReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirCollectionLiteralReference.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider. import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe import org.jetbrains.kotlin.fir.expressions.FirArrayLiteral +import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe @@ -24,6 +25,8 @@ class KtFirCollectionLiteralReference( override fun KtAnalysisSession.resolveToSymbols(): Collection { check(this is KtFirAnalysisSession) val fir = element.getOrBuildFirSafe(firResolveSession) ?: return emptyList() + + @OptIn(UnresolvedExpressionTypeAccess::class) val type = fir.coneTypeSafe() ?: return listOfNotNull(arrayOfSymbol(arrayOf)) val call = arrayTypeToArrayOfCall[type.lookupTag.classId] ?: arrayOf return listOfNotNull(arrayOfSymbol(call)) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt index f38da37191d..43bb57391bd 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef +import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.fir.types.toSymbol import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.name.StandardClassIds @@ -111,7 +112,7 @@ private class CodeFragmentCapturedValueVisitor( private fun processElement(element: FirElement) { if (element is FirExpression) { - val symbol = element.coneTypeOrNull?.toSymbol(session) + val symbol = element.resolvedType.toSymbol(session) if (symbol != null) { registerFile(symbol) } @@ -290,4 +291,4 @@ private class CodeFragmentCapturedValueVisitor( private val FirBasedSymbol<*>.isMutated: Boolean get() = assignmentLhs.lastOrNull() == this -} \ No newline at end of file +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt index 7ffbed2e83a..2f535c094dd 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt @@ -15,10 +15,7 @@ import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.* -import org.jetbrains.kotlin.fir.types.FirErrorTypeRef -import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.fir.types.FirUserTypeRef +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.lexer.KtTokens @@ -218,7 +215,7 @@ internal open class FirElementsRecorder : FirVisitor