[FIR] simplify receiver parameter creation
^KT-54417
This commit is contained in:
committed by
Space Team
parent
ef5a3303b2
commit
649bf92d98
+10
-3
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user