From 90977f6a8c74608cf917cfe7e2a2713aa2065d8f Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 9 Jun 2023 21:47:20 +0900 Subject: [PATCH] [FE] Extract special access patching logic in ARGUMENTS_OF_ANNOTATIONS --- ...irAnnotationArgumentsResolveTransformer.kt | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt index 71c050811ef..fa3e3201a1c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAnnotationArgumentsResolveTransformer.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveCon import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformerDispatcher import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer -import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguouslyResolvedAnnotationArgument import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol @@ -294,43 +293,52 @@ private class FirExpressionsResolveTransformerForSpecificAnnotations(transformer qualifiedAccessExpression: FirQualifiedAccessExpression, data: ResolutionMode ): FirStatement { - val calleeReference = qualifiedAccessExpression.calleeReference - if (calleeReference is FirResolvedNamedReference && - calleeReference.resolvedSymbol.let { it is FirEnumEntrySymbol && it.containingClassLookupTag()?.classId in classIdsToCheck } && - qualifiedAccessExpression is FirPropertyAccessExpression - ) { - val symbolFromCompilerPhase = calleeReference.resolvedSymbol - - (qualifiedAccessExpression.explicitReceiver as? FirResolvedQualifier)?.let { - qualifiedAccessExpression.replaceResolvedQualifierReceiver(it) - } - qualifiedAccessExpression.replaceDispatchReceiver(FirNoReceiverExpression) - qualifiedAccessExpression.replaceTypeRef(noExpectedType) - qualifiedAccessExpression.replaceCalleeReference(buildSimpleNamedReference { - source = calleeReference.source - name = calleeReference.name - }) - - val resolved = super.transformQualifiedAccessExpression(qualifiedAccessExpression, data) - - if (resolved is FirQualifiedAccessExpression) { - // The initial resolution must have been to an enum entry. Report ambiguity if symbolFromArgumentsPhase is different to - // original symbol including null (meaning we would resolve to something other than an enum entry). - val symbolFromArgumentsPhase = resolved.calleeReference.toResolvedBaseSymbol() - if (symbolFromCompilerPhase != symbolFromArgumentsPhase) { - resolved.replaceCalleeReference(buildErrorNamedReference { - source = resolved.calleeReference.source - diagnostic = ConeAmbiguouslyResolvedAnnotationArgument(symbolFromCompilerPhase, symbolFromArgumentsPhase) - }) + if (qualifiedAccessExpression is FirPropertyAccessExpression) { + val calleeReference = qualifiedAccessExpression.calleeReference + if (calleeReference is FirResolvedNamedReference) { + val resolvedSymbol = calleeReference.resolvedSymbol + if (resolvedSymbol is FirEnumEntrySymbol && resolvedSymbol.containingClassLookupTag()?.classId in classIdsToCheck) { + resolveSpecialPropertyAccess(qualifiedAccessExpression, calleeReference, resolvedSymbol, data) } } - - return resolved } return super.transformQualifiedAccessExpression(qualifiedAccessExpression, data) } + private fun resolveSpecialPropertyAccess( + qualifiedAccessExpression: FirPropertyAccessExpression, + calleeReference: FirResolvedNamedReference, + resolvedSymbol: FirEnumEntrySymbol, + data: ResolutionMode, + ): FirStatement { + (qualifiedAccessExpression.explicitReceiver as? FirResolvedQualifier)?.let { + qualifiedAccessExpression.replaceResolvedQualifierReceiver(it) + } + qualifiedAccessExpression.replaceDispatchReceiver(FirNoReceiverExpression) + qualifiedAccessExpression.replaceTypeRef(noExpectedType) + qualifiedAccessExpression.replaceCalleeReference(buildSimpleNamedReference { + source = calleeReference.source + name = calleeReference.name + }) + + val resolved = super.transformQualifiedAccessExpression(qualifiedAccessExpression, data) + + if (resolved is FirQualifiedAccessExpression) { + // The initial resolution must have been to an enum entry. Report ambiguity if symbolFromArgumentsPhase is different to + // original symbol including null (meaning we would resolve to something other than an enum entry). + val symbolFromArgumentsPhase = resolved.calleeReference.toResolvedBaseSymbol() + if (resolvedSymbol != symbolFromArgumentsPhase) { + resolved.replaceCalleeReference(buildErrorNamedReference { + source = resolved.calleeReference.source + diagnostic = ConeAmbiguouslyResolvedAnnotationArgument(resolvedSymbol, symbolFromArgumentsPhase) + }) + } + } + + return resolved + } + private fun FirQualifiedAccessExpression.replaceResolvedQualifierReceiver(receiver: FirResolvedQualifier) { var lastReceiver = buildPropertyAccessExpression { source = receiver.source