[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
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
}
}
@@ -571,6 +571,7 @@ fun List<FirAnnotationCall>.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<FirAnnotationCall>).filterUseSiteTarget(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 {
source = this@asReceiverParameter.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType)
type = this@asReceiverParameter
}
@@ -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 {