[FIR] introduce KtFakeSourceElementKind.ReceiverFromType

^KT-54417
This commit is contained in:
Dmitrii Gridin
2022-10-21 10:29:28 +02:00
committed by Space Team
parent 8cd404c84c
commit 22cfea5058
3 changed files with 11 additions and 0 deletions
@@ -5,8 +5,10 @@
package org.jetbrains.kotlin.fir.java.enhancement package org.jetbrains.kotlin.fir.java.enhancement
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.FirCachesFactory import org.jetbrains.kotlin.fir.caches.FirCachesFactory
@@ -307,8 +309,10 @@ class FirSignatureEnhancement(
buildReceiverParameter { buildReceiverParameter {
type = receiverType type = receiverType
annotations += firMethod.valueParameters.first().annotations annotations += firMethod.valueParameters.first().annotations
source = receiverType.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType)
} }
} }
this.name = name!! this.name = name!!
status = firMethod.status status = firMethod.status
symbol = FirNamedFunctionSymbol(methodId) symbol = FirNamedFunctionSymbol(methodId)
@@ -569,6 +573,7 @@ class FirSignatureEnhancement(
return buildResolvedTypeRef { return buildResolvedTypeRef {
type = typeWithoutEnhancement.enhance(session, qualifiers) ?: typeWithoutEnhancement type = typeWithoutEnhancement.enhance(session, qualifiers) ?: typeWithoutEnhancement
annotations += typeRef.annotations annotations += typeRef.annotations
source = typeRef.source
} }
} }
@@ -571,6 +571,7 @@ fun List<FirAnnotationCall>.filterUseSiteTarget(target: AnnotationUseSiteTarget)
fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter { fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter {
val typeRef = this val typeRef = this
return buildReceiverParameter { return buildReceiverParameter {
source = typeRef.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
annotations += (typeRef.annotations as List<FirAnnotationCall>).filterUseSiteTarget(AnnotationUseSiteTarget.RECEIVER) annotations += (typeRef.annotations as List<FirAnnotationCall>).filterUseSiteTarget(AnnotationUseSiteTarget.RECEIVER)
(typeRef.annotations as MutableList<FirAnnotation>).removeIf { it.useSiteTarget == AnnotationUseSiteTarget.RECEIVER } (typeRef.annotations as MutableList<FirAnnotation>).removeIf { it.useSiteTarget == AnnotationUseSiteTarget.RECEIVER }
@@ -579,6 +580,7 @@ fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter {
} }
fun FirImplicitTypeRef.asReceiverParameter(): FirReceiverParameter = buildReceiverParameter { fun FirImplicitTypeRef.asReceiverParameter(): FirReceiverParameter = buildReceiverParameter {
source = this@asReceiverParameter.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType)
type = this@asReceiverParameter type = this@asReceiverParameter
} }
@@ -227,6 +227,10 @@ sealed class KtFakeSourceElementKind : KtSourceElementKind() {
// for implicit conversion from int to long with `.toLong` function // for implicit conversion from int to long with `.toLong` function
// e.g. val x: Long = 1 + 1 becomes val x: Long = (1 + 1).toLong() // e.g. val x: Long = 1 + 1 becomes val x: Long = (1 + 1).toLong()
object IntToLongConversion : KtFakeSourceElementKind() 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 { sealed class AbstractKtSourceElement {