[FE] Extract special access patching logic in ARGUMENTS_OF_ANNOTATIONS
This commit is contained in:
+39
-31
@@ -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.FirAbstractBodyResolveTransformerDispatcher
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer
|
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.resolve.transformers.body.resolve.FirExpressionsResolveTransformer
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
|
||||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguouslyResolvedAnnotationArgument
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguouslyResolvedAnnotationArgument
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
|
||||||
@@ -294,43 +293,52 @@ private class FirExpressionsResolveTransformerForSpecificAnnotations(transformer
|
|||||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||||
data: ResolutionMode
|
data: ResolutionMode
|
||||||
): FirStatement {
|
): FirStatement {
|
||||||
val calleeReference = qualifiedAccessExpression.calleeReference
|
if (qualifiedAccessExpression is FirPropertyAccessExpression) {
|
||||||
if (calleeReference is FirResolvedNamedReference &&
|
val calleeReference = qualifiedAccessExpression.calleeReference
|
||||||
calleeReference.resolvedSymbol.let { it is FirEnumEntrySymbol && it.containingClassLookupTag()?.classId in classIdsToCheck } &&
|
if (calleeReference is FirResolvedNamedReference) {
|
||||||
qualifiedAccessExpression is FirPropertyAccessExpression
|
val resolvedSymbol = calleeReference.resolvedSymbol
|
||||||
) {
|
if (resolvedSymbol is FirEnumEntrySymbol && resolvedSymbol.containingClassLookupTag()?.classId in classIdsToCheck) {
|
||||||
val symbolFromCompilerPhase = calleeReference.resolvedSymbol
|
resolveSpecialPropertyAccess(qualifiedAccessExpression, calleeReference, resolvedSymbol, data)
|
||||||
|
|
||||||
(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)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resolved
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.transformQualifiedAccessExpression(qualifiedAccessExpression, data)
|
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) {
|
private fun FirQualifiedAccessExpression.replaceResolvedQualifierReceiver(receiver: FirResolvedQualifier) {
|
||||||
var lastReceiver = buildPropertyAccessExpression {
|
var lastReceiver = buildPropertyAccessExpression {
|
||||||
source = receiver.source
|
source = receiver.source
|
||||||
|
|||||||
Reference in New Issue
Block a user