[FIR] simplify receiver parameter creation

^KT-54417
This commit is contained in:
Dmitrii Gridin
2022-11-02 15:46:08 +01:00
committed by Space Team
parent ef5a3303b2
commit 649bf92d98
3 changed files with 36 additions and 10 deletions
@@ -1183,7 +1183,7 @@ class DeclarationsConverter(
) )
} else { } else {
this.isLocal = false this.isLocal = false
receiverParameter = receiverType?.convertToReceiverParameter() receiverParameter = receiverType?.asReceiverParameter(receiverType?.extractReceiverAnnotations())
dispatchReceiverType = currentDispatchReceiverType() dispatchReceiverType = currentDispatchReceiverType()
withCapturedTypeParameters(true, propertySource, firTypeParameters) { withCapturedTypeParameters(true, propertySource, firTypeParameters) {
@@ -1611,7 +1611,7 @@ class DeclarationsConverter(
functionSymbol = FirAnonymousFunctionSymbol() functionSymbol = FirAnonymousFunctionSymbol()
FirAnonymousFunctionBuilder().apply { FirAnonymousFunctionBuilder().apply {
source = functionSource source = functionSource
receiverParameter = receiverType?.convertToReceiverParameter() receiverParameter = receiverType?.asReceiverParameter(receiverType?.extractReceiverAnnotations())
symbol = functionSymbol symbol = functionSymbol
isLambda = false isLambda = false
hasExplicitParameterList = true hasExplicitParameterList = true
@@ -1626,7 +1626,7 @@ class DeclarationsConverter(
functionSymbol = FirNamedFunctionSymbol(callableIdForName(functionName)) functionSymbol = FirNamedFunctionSymbol(callableIdForName(functionName))
FirSimpleFunctionBuilder().apply { FirSimpleFunctionBuilder().apply {
source = functionSource source = functionSource
receiverParameter = receiverType?.convertToReceiverParameter() receiverParameter = receiverType?.asReceiverParameter(receiverType?.extractReceiverAnnotations())
name = functionName name = functionName
status = FirDeclarationStatusImpl( status = FirDeclarationStatusImpl(
if (isLocal) Visibilities.Local else modifiers.getVisibility(), if (isLocal) Visibilities.Local else modifiers.getVisibility(),
@@ -1950,6 +1950,13 @@ class DeclarationsConverter(
} }
} }
private fun FirTypeRef.extractReceiverAnnotations(): List<FirAnnotationCall> {
@Suppress("UNCHECKED_CAST")
val receiverAnnotations = annotations.filter { it is FirAnnotationCall && it.useSiteTarget == RECEIVER } as List<FirAnnotationCall>
(annotations as? MutableList<FirAnnotation>)?.removeIf { it.useSiteTarget == RECEIVER }
return receiverAnnotations
}
/** /**
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeRef * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeRef
*/ */
@@ -189,6 +189,12 @@ open class RawFirBuilder(
source = this@toFirOrImplicitType?.toFirSourceElement(KtFakeSourceElementKind.ImplicitTypeRef) source = this@toFirOrImplicitType?.toFirSourceElement(KtFakeSourceElementKind.ImplicitTypeRef)
} }
private fun KtTypeReference.receiverAnnotations(): List<FirAnnotationCall> {
return annotationEntries
.filter { it.useSiteTarget?.getAnnotationUseSiteTarget() == RECEIVER }
.map { it.convert<FirAnnotationCall>() }
}
private fun KtTypeReference?.toFirOrUnitType(): FirTypeRef = private fun KtTypeReference?.toFirOrUnitType(): FirTypeRef =
convertSafe() ?: implicitUnitType convertSafe() ?: implicitUnitType
@@ -1295,13 +1301,19 @@ open class RawFirBuilder(
} else { } else {
typeReference.toFirOrImplicitType() typeReference.toFirOrImplicitType()
} }
val receiverType = function.receiverTypeReference.convertSafe<FirTypeRef>() val receiverType = function.receiverTypeReference.convertSafe<FirTypeRef>()
val receiverAnnotations = if (receiverType != null) {
function.receiverTypeReference?.receiverAnnotations()
} else {
null
}
val labelName: String? val labelName: String?
val isAnonymousFunction = function.name == null && !function.parent.let { it is KtFile || it is KtClassBody } val isAnonymousFunction = function.name == null && !function.parent.let { it is KtFile || it is KtClassBody }
val functionBuilder = if (isAnonymousFunction) { val functionBuilder = if (isAnonymousFunction) {
FirAnonymousFunctionBuilder().apply { FirAnonymousFunctionBuilder().apply {
receiverParameter = receiverType?.convertToReceiverParameter() receiverParameter = receiverType?.asReceiverParameter(receiverAnnotations)
symbol = FirAnonymousFunctionSymbol() symbol = FirAnonymousFunctionSymbol()
isLambda = false isLambda = false
hasExplicitParameterList = true hasExplicitParameterList = true
@@ -1310,7 +1322,7 @@ open class RawFirBuilder(
} }
} else { } else {
FirSimpleFunctionBuilder().apply { FirSimpleFunctionBuilder().apply {
receiverParameter = receiverType?.convertToReceiverParameter() receiverParameter = receiverType?.asReceiverParameter(receiverAnnotations)
name = function.nameAsSafeName name = function.nameAsSafeName
labelName = runIf(!name.isSpecial) { name.identifier } labelName = runIf(!name.isSpecial) { name.identifier }
symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName)) symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName))
@@ -1642,7 +1654,14 @@ open class RawFirBuilder(
} }
} else { } else {
isLocal = false isLocal = false
receiverParameter = receiverTypeReference.convertSafe<FirTypeRef>()?.convertToReceiverParameter() val receiverType = receiverTypeReference.convertSafe<FirTypeRef>()
val receiverAnnotations = if (receiverType != null) {
receiverTypeReference?.receiverAnnotations()
} else {
null
}
receiverParameter = receiverType?.asReceiverParameter(receiverAnnotations)
symbol = FirPropertySymbol(callableIdForName(propertyName)) symbol = FirPropertySymbol(callableIdForName(propertyName))
dispatchReceiverType = currentDispatchReceiverType() dispatchReceiverType = currentDispatchReceiverType()
extractTypeParametersTo(this, symbol) extractTypeParametersTo(this, symbol)
@@ -1840,9 +1859,11 @@ open class RawFirBuilder(
for (modifierList in allModifierLists) { for (modifierList in allModifierLists) {
for (annotationEntry in modifierList.annotationEntries) { for (annotationEntry in modifierList.annotationEntries) {
if (annotationEntry.useSiteTarget?.getAnnotationUseSiteTarget() == RECEIVER) continue
firTypeBuilder.annotations += annotationEntry.convert<FirAnnotation>() firTypeBuilder.annotations += annotationEntry.convert<FirAnnotation>()
} }
} }
return firTypeBuilder.build() return firTypeBuilder.build()
} }
@@ -568,13 +568,11 @@ fun List<FirAnnotationCall>.filterUseSiteTarget(target: AnnotationUseSiteTarget)
} }
} }
fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter { fun FirTypeRef.asReceiverParameter(receiverAnnotations: List<FirAnnotationCall>?): FirReceiverParameter {
val typeRef = this val typeRef = this
return buildReceiverParameter { return buildReceiverParameter {
source = typeRef.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType) source = typeRef.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType)
@Suppress("UNCHECKED_CAST") receiverAnnotations?.let { annotations += it.filterUseSiteTarget(AnnotationUseSiteTarget.RECEIVER) }
annotations += (typeRef.annotations as List<FirAnnotationCall>).filterUseSiteTarget(AnnotationUseSiteTarget.RECEIVER)
(typeRef.annotations as MutableList<FirAnnotation>).removeIf { it.useSiteTarget == AnnotationUseSiteTarget.RECEIVER }
type = typeRef type = typeRef
} }
} }