From 22cfea505828a82a4154dcd098b6d2abef08683b Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Fri, 21 Oct 2022 10:29:28 +0200 Subject: [PATCH] [FIR] introduce KtFakeSourceElementKind.ReceiverFromType ^KT-54417 --- .../kotlin/fir/java/enhancement/SignatureEnhancement.kt | 5 +++++ .../src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt | 2 ++ .../src/org/jetbrains/kotlin/KtSourceElement.kt | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 958e05bcd4c..4225c64ab2a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -5,8 +5,10 @@ package org.jetbrains.kotlin.fir.java.enhancement +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.FirCachesFactory @@ -307,8 +309,10 @@ class FirSignatureEnhancement( buildReceiverParameter { type = receiverType annotations += firMethod.valueParameters.first().annotations + source = receiverType.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType) } } + this.name = name!! status = firMethod.status symbol = FirNamedFunctionSymbol(methodId) @@ -569,6 +573,7 @@ class FirSignatureEnhancement( return buildResolvedTypeRef { type = typeWithoutEnhancement.enhance(session, qualifiers) ?: typeWithoutEnhancement annotations += typeRef.annotations + source = typeRef.source } } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index c33c465a32f..08f30034f39 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -571,6 +571,7 @@ fun List.filterUseSiteTarget(target: AnnotationUseSiteTarget) fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter { val typeRef = this return buildReceiverParameter { + source = typeRef.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType) @Suppress("UNCHECKED_CAST") annotations += (typeRef.annotations as List).filterUseSiteTarget(AnnotationUseSiteTarget.RECEIVER) (typeRef.annotations as MutableList).removeIf { it.useSiteTarget == AnnotationUseSiteTarget.RECEIVER } @@ -579,6 +580,7 @@ fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter { } fun FirImplicitTypeRef.asReceiverParameter(): FirReceiverParameter = buildReceiverParameter { + source = this@asReceiverParameter.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType) type = this@asReceiverParameter } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt index 75563d4af08..d13333d6e93 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt @@ -227,6 +227,10 @@ sealed class KtFakeSourceElementKind : KtSourceElementKind() { // for implicit conversion from int to long with `.toLong` function // e.g. val x: Long = 1 + 1 becomes val x: Long = (1 + 1).toLong() object IntToLongConversion : KtFakeSourceElementKind() + + // for extension receiver type the corresponding receiver parameter is generated + // with a fake sources which refers to this the type + object ReceiverFromType : KtFakeSourceElementKind() } sealed class AbstractKtSourceElement {