[FIR] LT builder: extract convertAnnotationList from convertModifierList

To simplify the logic around `convertModifierList` as a combination of
annotations and modifiers doesn't work well

^KT-63042
This commit is contained in:
Dmitrii Gridin
2023-12-06 14:17:43 +01:00
committed by Space Team
parent c5cba4c053
commit 5bd1a97632
2 changed files with 111 additions and 60 deletions
@@ -242,23 +242,33 @@ class LightTreeRawFirDeclarationBuilder(
/***** MODIFIERS *****/ /***** MODIFIERS *****/
/** /**
* @param skipAnnotations skip annotations as they are requiring correct [withContainerSymbol] * Convert only modifiers
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseModifierList * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseModifierList
*/ */
private fun convertModifierList(modifiers: LighterASTNode, isInClass: Boolean = false, skipAnnotations: Boolean = false): Modifier { private fun convertModifierList(modifiers: LighterASTNode, isInClass: Boolean = false): Modifier {
val modifier = Modifier() val modifier = Modifier()
modifiers.forEachChildren { modifiers.forEachChildren {
val tokenType = it.tokenType if (it.tokenType is KtModifierKeywordToken) {
when { modifier.addModifier(it, isInClass)
tokenType is KtModifierKeywordToken -> modifier.addModifier(it, isInClass)
skipAnnotations -> {}
tokenType == ANNOTATION -> modifier.annotations += convertAnnotation(it)
tokenType == ANNOTATION_ENTRY -> modifier.annotations += convertAnnotationEntry(it)
} }
} }
return modifier return modifier
} }
/**
* Convert only annotations
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseModifierList
*/
private fun convertAnnotationList(annotations: LighterASTNode): List<FirAnnotationCall> {
return annotations.forEachChildrenReturnList<FirAnnotationCall> { node, list ->
when (node.tokenType) {
ANNOTATION -> list += convertAnnotation(node)
ANNOTATION_ENTRY -> list += convertAnnotationEntry(node)
}
}
}
/** /**
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeModifierList * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeModifierList
*/ */
@@ -317,12 +327,7 @@ class LightTreeRawFirDeclarationBuilder(
source = fileAnnotationList.toFirSourceElement() source = fileAnnotationList.toFirSourceElement()
containingFileSymbol = fileSymbol containingFileSymbol = fileSymbol
withContainerSymbol(fileSymbol) { withContainerSymbol(fileSymbol) {
annotations += fileAnnotationList.forEachChildrenReturnList { node, container -> annotations += convertAnnotationList(fileAnnotationList)
when (node.tokenType) {
ANNOTATION -> container += convertAnnotation(node)
ANNOTATION_ENTRY -> container += convertAnnotationEntry(node)
}
}
} }
annotations.ifEmpty { annotations.ifEmpty {
@@ -435,12 +440,13 @@ class LightTreeRawFirDeclarationBuilder(
val firTypeParameters = mutableListOf<FirTypeParameter>() val firTypeParameters = mutableListOf<FirTypeParameter>()
var primaryConstructor: LighterASTNode? = null var primaryConstructor: LighterASTNode? = null
val typeConstraints = mutableListOf<TypeConstraint>() val typeConstraints = mutableListOf<TypeConstraint>()
val classAnnotations = mutableListOf<FirAnnotationCall>()
var classBody: LighterASTNode? = null var classBody: LighterASTNode? = null
var superTypeList: LighterASTNode? = null var superTypeList: LighterASTNode? = null
var typeParameterList: LighterASTNode? = null var typeParameterList: LighterASTNode? = null
classNode.forEachChildren { classNode.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it, isInClass = true, skipAnnotations = true) MODIFIER_LIST -> modifiers = convertModifierList(it, isInClass = true)
IDENTIFIER -> identifier = it.asText IDENTIFIER -> identifier = it.asText
} }
} }
@@ -457,7 +463,9 @@ class LightTreeRawFirDeclarationBuilder(
withContainerSymbol(classSymbol) { withContainerSymbol(classSymbol) {
classNode.forEachChildren { classNode.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it, isInClass = true) MODIFIER_LIST -> {
classAnnotations += convertAnnotationList(it)
}
CLASS_KEYWORD -> classKind = ClassKind.CLASS CLASS_KEYWORD -> classKind = ClassKind.CLASS
INTERFACE_KEYWORD -> classKind = ClassKind.INTERFACE INTERFACE_KEYWORD -> classKind = ClassKind.INTERFACE
OBJECT_KEYWORD -> classKind = ClassKind.OBJECT OBJECT_KEYWORD -> classKind = ClassKind.OBJECT
@@ -506,7 +514,7 @@ class LightTreeRawFirDeclarationBuilder(
this.classKind = classKind this.classKind = classKind
scopeProvider = baseScopeProvider scopeProvider = baseScopeProvider
symbol = classSymbol symbol = classSymbol
annotations += modifiers.annotations annotations += classAnnotations
typeParameters += firTypeParameters typeParameters += firTypeParameters
context.appendOuterTypeParameters(ignoreLastLevel = true, typeParameters) context.appendOuterTypeParameters(ignoreLastLevel = true, typeParameters)
@@ -606,7 +614,7 @@ class LightTreeRawFirDeclarationBuilder(
createParameterTypeRefWithSourceKind = { property, kind -> property.returnTypeRef.copyWithNewSourceKind(kind) }, createParameterTypeRefWithSourceKind = { property, kind -> property.returnTypeRef.copyWithNewSourceKind(kind) },
addValueParameterAnnotations = { valueParam -> addValueParameterAnnotations = { valueParam ->
valueParam.forEachChildren { valueParam.forEachChildren {
if (it.tokenType == MODIFIER_LIST) convertModifierList(it).annotations.filterTo(annotations) { if (it.tokenType == MODIFIER_LIST) convertAnnotationList(it).filterTo(annotations) {
it.useSiteTarget.appliesToPrimaryConstructorParameter() it.useSiteTarget.appliesToPrimaryConstructorParameter()
} }
} }
@@ -674,6 +682,7 @@ class LightTreeRawFirDeclarationBuilder(
registerSelfType(delegatedSelfType) registerSelfType(delegatedSelfType)
var modifiers = Modifier() var modifiers = Modifier()
val objectAnnotations = mutableListOf<FirAnnotationCall>()
var primaryConstructor: LighterASTNode? = null var primaryConstructor: LighterASTNode? = null
val superTypeRefs = mutableListOf<FirTypeRef>() val superTypeRefs = mutableListOf<FirTypeRef>()
var delegatedSuperTypeRef: FirTypeRef? = null var delegatedSuperTypeRef: FirTypeRef? = null
@@ -684,7 +693,10 @@ class LightTreeRawFirDeclarationBuilder(
objectDeclaration.forEachChildren { objectDeclaration.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
objectAnnotations += convertAnnotationList(it)
}
PRIMARY_CONSTRUCTOR -> primaryConstructor = it PRIMARY_CONSTRUCTOR -> primaryConstructor = it
SUPER_TYPE_LIST -> convertDelegationSpecifiers(it).let { specifiers -> SUPER_TYPE_LIST -> convertDelegationSpecifiers(it).let { specifiers ->
delegatedSuperTypeRef = specifiers.superTypeCalls.lastOrNull()?.delegatedSuperTypeRef delegatedSuperTypeRef = specifiers.superTypeCalls.lastOrNull()?.delegatedSuperTypeRef
@@ -704,7 +716,7 @@ class LightTreeRawFirDeclarationBuilder(
} }
val delegatedSuperType = delegatedSuperTypeRef ?: FirImplicitTypeRefImplWithoutSource val delegatedSuperType = delegatedSuperTypeRef ?: FirImplicitTypeRefImplWithoutSource
annotations += modifiers.annotations annotations += objectAnnotations
this.superTypeRefs += superTypeRefs this.superTypeRefs += superTypeRefs
val classWrapper = ClassWrapper( val classWrapper = ClassWrapper(
@@ -744,6 +756,7 @@ class LightTreeRawFirDeclarationBuilder(
*/ */
private fun convertEnumEntry(enumEntry: LighterASTNode, classWrapper: ClassWrapper): FirEnumEntry { private fun convertEnumEntry(enumEntry: LighterASTNode, classWrapper: ClassWrapper): FirEnumEntry {
var modifiers = Modifier() var modifiers = Modifier()
val entryAnnotations = mutableListOf<FirAnnotationCall>()
lateinit var identifier: String lateinit var identifier: String
val enumSuperTypeCallEntry = mutableListOf<FirExpression>() val enumSuperTypeCallEntry = mutableListOf<FirExpression>()
var classBodyNode: LighterASTNode? = null var classBodyNode: LighterASTNode? = null
@@ -759,7 +772,10 @@ class LightTreeRawFirDeclarationBuilder(
withContainerSymbol(symbol) { withContainerSymbol(symbol) {
enumEntry.forEachChildren { enumEntry.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
entryAnnotations += convertAnnotationList(it)
}
INITIALIZER_LIST -> { INITIALIZER_LIST -> {
enumSuperTypeCallEntry += convertInitializerList(it) enumSuperTypeCallEntry += convertInitializerList(it)
it.getChildNodeByType(SUPER_TYPE_CALL_ENTRY)?.let { superTypeCall -> it.getChildNodeByType(SUPER_TYPE_CALL_ENTRY)?.let { superTypeCall ->
@@ -780,11 +796,11 @@ class LightTreeRawFirDeclarationBuilder(
isExpect = containingClassIsExpectClass isExpect = containingClassIsExpectClass
} }
if (classWrapper.hasDefaultConstructor && enumEntry.getChildNodeByType(INITIALIZER_LIST) == null && if (classWrapper.hasDefaultConstructor && enumEntry.getChildNodeByType(INITIALIZER_LIST) == null &&
modifiers.annotations.isEmpty() && classBodyNode == null entryAnnotations.isEmpty() && classBodyNode == null
) { ) {
return@buildEnumEntry return@buildEnumEntry
} }
annotations += modifiers.annotations annotations += entryAnnotations
initializer = withChildClassName(enumEntryName, isExpect = false) { initializer = withChildClassName(enumEntryName, isExpect = false) {
buildAnonymousObjectExpression { buildAnonymousObjectExpression {
val entrySource = enumEntry.toFirSourceElement(KtFakeSourceElementKind.EnumInitializer) val entrySource = enumEntry.toFirSourceElement(KtFakeSourceElementKind.EnumInitializer)
@@ -894,7 +910,7 @@ class LightTreeRawFirDeclarationBuilder(
diagnostic = ConeDanglingModifierOnTopLevel diagnostic = ConeDanglingModifierOnTopLevel
symbol = FirDanglingModifierSymbol() symbol = FirDanglingModifierSymbol()
withContainerSymbol(symbol) { withContainerSymbol(symbol) {
annotations += convertModifierList(node).annotations annotations += convertAnnotationList(node)
} }
} }
@@ -925,11 +941,15 @@ class LightTreeRawFirDeclarationBuilder(
val constructorSymbol = FirConstructorSymbol(callableIdForClassConstructor()) val constructorSymbol = FirConstructorSymbol(callableIdForClassConstructor())
withContainerSymbol(constructorSymbol) { withContainerSymbol(constructorSymbol) {
var modifiersIfPresent: Modifier? = null var modifiersIfPresent: Modifier? = null
val constructorAnnotations = mutableListOf<FirAnnotationCall>()
val valueParameters = mutableListOf<ValueParameter>() val valueParameters = mutableListOf<ValueParameter>()
var hasConstructorKeyword = false var hasConstructorKeyword = false
primaryConstructor?.forEachChildren { primaryConstructor?.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiersIfPresent = convertModifierList(it) MODIFIER_LIST -> {
modifiersIfPresent = convertModifierList(it)
constructorAnnotations += convertAnnotationList(it)
}
CONSTRUCTOR_KEYWORD -> hasConstructorKeyword = true CONSTRUCTOR_KEYWORD -> hasConstructorKeyword = true
VALUE_PARAMETER_LIST -> valueParameters += convertValueParameters( VALUE_PARAMETER_LIST -> valueParameters += convertValueParameters(
it, it,
@@ -1012,7 +1032,7 @@ class LightTreeRawFirDeclarationBuilder(
dispatchReceiverType = classWrapper.obtainDispatchReceiverForConstructor() dispatchReceiverType = classWrapper.obtainDispatchReceiverForConstructor()
this.status = status this.status = status
symbol = constructorSymbol symbol = constructorSymbol
annotations += modifiers.annotations annotations += constructorAnnotations
typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters) typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters)
this.valueParameters += valueParameters.map { it.firValueParameter } this.valueParameters += valueParameters.map { it.firValueParameter }
delegatedConstructor = firDelegatedCall delegatedConstructor = firDelegatedCall
@@ -1037,10 +1057,10 @@ class LightTreeRawFirDeclarationBuilder(
val initializerSymbol = FirAnonymousInitializerSymbol() val initializerSymbol = FirAnonymousInitializerSymbol()
withContainerSymbol(initializerSymbol) { withContainerSymbol(initializerSymbol) {
var firBlock: FirBlock? = null var firBlock: FirBlock? = null
var modifiers = Modifier() val initializerAnnotations = mutableListOf<FirAnnotationCall>()
anonymousInitializer.forEachChildren { anonymousInitializer.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it, isInClass = true) MODIFIER_LIST -> initializerAnnotations += convertAnnotationList(it)
BLOCK -> withForcedLocalContext { BLOCK -> withForcedLocalContext {
firBlock = convertBlock(it) firBlock = convertBlock(it)
} }
@@ -1054,7 +1074,7 @@ class LightTreeRawFirDeclarationBuilder(
origin = FirDeclarationOrigin.Source origin = FirDeclarationOrigin.Source
body = firBlock ?: buildEmptyExpressionBlock() body = firBlock ?: buildEmptyExpressionBlock()
dispatchReceiverType = context.dispatchReceiverTypesStack.lastOrNull() dispatchReceiverType = context.dispatchReceiverTypesStack.lastOrNull()
annotations += modifiers.annotations annotations += initializerAnnotations
} }
} }
} }
@@ -1064,6 +1084,7 @@ class LightTreeRawFirDeclarationBuilder(
*/ */
private fun convertSecondaryConstructor(secondaryConstructor: LighterASTNode, classWrapper: ClassWrapper): FirConstructor { private fun convertSecondaryConstructor(secondaryConstructor: LighterASTNode, classWrapper: ClassWrapper): FirConstructor {
var modifiers = Modifier() var modifiers = Modifier()
val constructorAnnotations = mutableListOf<FirAnnotationCall>()
val firValueParameters = mutableListOf<ValueParameter>() val firValueParameters = mutableListOf<ValueParameter>()
var constructorDelegationCall: FirDelegatedConstructorCall? = null var constructorDelegationCall: FirDelegatedConstructorCall? = null
var block: LighterASTNode? = null var block: LighterASTNode? = null
@@ -1072,7 +1093,10 @@ class LightTreeRawFirDeclarationBuilder(
withContainerSymbol(constructorSymbol) { withContainerSymbol(constructorSymbol) {
secondaryConstructor.forEachChildren { secondaryConstructor.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
constructorAnnotations += convertAnnotationList(it)
}
VALUE_PARAMETER_LIST -> firValueParameters += convertValueParameters( VALUE_PARAMETER_LIST -> firValueParameters += convertValueParameters(
it, it,
constructorSymbol, constructorSymbol,
@@ -1106,7 +1130,7 @@ class LightTreeRawFirDeclarationBuilder(
delegatedConstructor = constructorDelegationCall delegatedConstructor = constructorDelegationCall
context.firFunctionTargets += target context.firFunctionTargets += target
annotations += modifiers.annotations annotations += constructorAnnotations
typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters) typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters)
valueParameters += firValueParameters.map { it.firValueParameter } valueParameters += firValueParameters.map { it.firValueParameter }
val (body, contractDescription) = withForcedLocalContext { val (body, contractDescription) = withForcedLocalContext {
@@ -1185,10 +1209,11 @@ class LightTreeRawFirDeclarationBuilder(
var modifiers = Modifier() var modifiers = Modifier()
var identifier: String? = null var identifier: String? = null
lateinit var firType: FirTypeRef lateinit var firType: FirTypeRef
val aliasAnnotations = mutableListOf<FirAnnotationCall>()
typeAlias.forEachChildren { typeAlias.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it, skipAnnotations = true) MODIFIER_LIST -> modifiers = convertModifierList(it)
IDENTIFIER -> identifier = it.asText IDENTIFIER -> identifier = it.asText
} }
} }
@@ -1200,7 +1225,9 @@ class LightTreeRawFirDeclarationBuilder(
withContainerSymbol(typeAliasSymbol) { withContainerSymbol(typeAliasSymbol) {
typeAlias.forEachChildren { typeAlias.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
aliasAnnotations += convertAnnotationList(it)
}
TYPE_REFERENCE -> firType = convertType(it) TYPE_REFERENCE -> firType = convertType(it)
} }
} }
@@ -1228,7 +1255,7 @@ class LightTreeRawFirDeclarationBuilder(
symbol = typeAliasSymbol symbol = typeAliasSymbol
expandedTypeRef = firType expandedTypeRef = firType
annotations += modifiers.annotations annotations += aliasAnnotations
typeParameters += firTypeParameters typeParameters += firTypeParameters
} }
} }
@@ -1240,6 +1267,7 @@ class LightTreeRawFirDeclarationBuilder(
*/ */
fun convertPropertyDeclaration(property: LighterASTNode, classWrapper: ClassWrapper? = null): FirDeclaration { fun convertPropertyDeclaration(property: LighterASTNode, classWrapper: ClassWrapper? = null): FirDeclaration {
var modifiers = Modifier() var modifiers = Modifier()
val propertyAnnotations = mutableListOf<FirAnnotationCall>()
var identifier: String? = null var identifier: String? = null
val firTypeParameters = mutableListOf<FirTypeParameter>() val firTypeParameters = mutableListOf<FirTypeParameter>()
var isReturnType = false var isReturnType = false
@@ -1269,7 +1297,10 @@ class LightTreeRawFirDeclarationBuilder(
val propertySource = property.toFirSourceElement() val propertySource = property.toFirSourceElement()
property.forEachChildren { property.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
propertyAnnotations += convertAnnotationList(it)
}
TYPE_PARAMETER_LIST -> typeParameterList = it TYPE_PARAMETER_LIST -> typeParameterList = it
COLON -> isReturnType = true COLON -> isReturnType = true
TYPE_REFERENCE -> if (isReturnType) returnType = convertType(it) else receiverType = convertType(it) TYPE_REFERENCE -> if (isReturnType) returnType = convertType(it) else receiverType = convertType(it)
@@ -1310,7 +1341,7 @@ class LightTreeRawFirDeclarationBuilder(
backingField = fieldDeclaration.convertBackingField( backingField = fieldDeclaration.convertBackingField(
symbol, modifiers, returnType, isVar, symbol, modifiers, returnType, isVar,
if (isLocal) emptyList() else modifiers.annotations.filter { if (isLocal) emptyList() else propertyAnnotations.filter {
it.useSiteTarget == FIELD || it.useSiteTarget == PROPERTY_DELEGATE_FIELD it.useSiteTarget == FIELD || it.useSiteTarget == PROPERTY_DELEGATE_FIELD
}, },
property, property,
@@ -1360,7 +1391,7 @@ class LightTreeRawFirDeclarationBuilder(
} }
val convertedAccessors = accessors.map { val convertedAccessors = accessors.map {
convertGetterOrSetter(it, returnType, propertyVisibility, symbol, modifiers) convertGetterOrSetter(it, returnType, propertyVisibility, symbol, modifiers, propertyAnnotations)
} }
this.getter = convertedAccessors.find { it.isGetter } this.getter = convertedAccessors.find { it.isGetter }
?: FirDefaultPropertyGetter( ?: FirDefaultPropertyGetter(
@@ -1372,7 +1403,7 @@ class LightTreeRawFirDeclarationBuilder(
symbol, symbol,
).also { ).also {
it.status = defaultAccessorStatus() it.status = defaultAccessorStatus()
it.replaceAnnotations(modifiers.annotations.filterUseSiteTarget(PROPERTY_GETTER)) it.replaceAnnotations(propertyAnnotations.filterUseSiteTarget(PROPERTY_GETTER))
it.initContainingClassAttr() it.initContainingClassAttr()
} }
// NOTE: We still need the setter even for a val property so we can report errors (e.g., VAL_WITH_SETTER). // NOTE: We still need the setter even for a val property so we can report errors (e.g., VAL_WITH_SETTER).
@@ -1385,10 +1416,10 @@ class LightTreeRawFirDeclarationBuilder(
returnType.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), returnType.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
propertyVisibility, propertyVisibility,
symbol, symbol,
parameterAnnotations = modifiers.annotations.filterUseSiteTarget(SETTER_PARAMETER) parameterAnnotations = propertyAnnotations.filterUseSiteTarget(SETTER_PARAMETER)
).also { ).also {
it.status = defaultAccessorStatus() it.status = defaultAccessorStatus()
it.replaceAnnotations(modifiers.annotations.filterUseSiteTarget(PROPERTY_SETTER)) it.replaceAnnotations(propertyAnnotations.filterUseSiteTarget(PROPERTY_SETTER))
it.initContainingClassAttr() it.initContainingClassAttr()
} }
} else null } else null
@@ -1411,7 +1442,7 @@ class LightTreeRawFirDeclarationBuilder(
) )
} }
} }
annotations += if (isLocal) modifiers.annotations else modifiers.annotations.filter { annotations += if (isLocal) propertyAnnotations else propertyAnnotations.filter {
it.useSiteTarget != FIELD && it.useSiteTarget != PROPERTY_DELEGATE_FIELD && it.useSiteTarget != PROPERTY_GETTER && it.useSiteTarget != FIELD && it.useSiteTarget != PROPERTY_DELEGATE_FIELD && it.useSiteTarget != PROPERTY_GETTER &&
(!isVar || it.useSiteTarget != SETTER_PARAMETER && it.useSiteTarget != PROPERTY_SETTER) (!isVar || it.useSiteTarget != SETTER_PARAMETER && it.useSiteTarget != PROPERTY_SETTER)
} }
@@ -1427,14 +1458,14 @@ class LightTreeRawFirDeclarationBuilder(
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitDestructuringDeclaration * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitDestructuringDeclaration
*/ */
internal fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration { internal fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration {
var modifiers = Modifier() val annotations = mutableListOf<FirAnnotationCall>()
var isVar = false var isVar = false
val entries = mutableListOf<DestructuringEntry>() val entries = mutableListOf<DestructuringEntry>()
val source = destructingDeclaration.toFirSourceElement() val source = destructingDeclaration.toFirSourceElement()
var firExpression: FirExpression? = null var firExpression: FirExpression? = null
destructingDeclaration.forEachChildren { destructingDeclaration.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> annotations += convertAnnotationList(it)
VAR_KEYWORD -> isVar = true VAR_KEYWORD -> isVar = true
DESTRUCTURING_DECLARATION_ENTRY -> entries += convertDestructingDeclarationEntry(it) DESTRUCTURING_DECLARATION_ENTRY -> entries += convertDestructingDeclarationEntry(it)
else -> if (it.isExpression()) firExpression = else -> if (it.isExpression()) firExpression =
@@ -1450,7 +1481,7 @@ class LightTreeRawFirDeclarationBuilder(
ConeSyntaxDiagnostic("Initializer required for destructuring declaration") ConeSyntaxDiagnostic("Initializer required for destructuring declaration")
), ),
source, source,
modifiers.annotations annotations
) )
} }
@@ -1458,12 +1489,12 @@ class LightTreeRawFirDeclarationBuilder(
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseMultiDeclarationName * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseMultiDeclarationName
*/ */
private fun convertDestructingDeclarationEntry(entry: LighterASTNode): DestructuringEntry { private fun convertDestructingDeclarationEntry(entry: LighterASTNode): DestructuringEntry {
var modifiers = Modifier() val annotations = mutableListOf<FirAnnotationCall>()
var identifier: String? = null var identifier: String? = null
var firType: FirTypeRef? = null var firType: FirTypeRef? = null
entry.forEachChildren { entry.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> annotations += convertAnnotationList(it)
IDENTIFIER -> identifier = it.asText IDENTIFIER -> identifier = it.asText
TYPE_REFERENCE -> firType = convertType(it) TYPE_REFERENCE -> firType = convertType(it)
} }
@@ -1479,7 +1510,7 @@ class LightTreeRawFirDeclarationBuilder(
source = entry.toFirSourceElement(), source = entry.toFirSourceElement(),
returnTypeRef = firType ?: implicitType, returnTypeRef = firType ?: implicitType,
name = name, name = name,
annotations = modifiers.annotations, annotations = annotations,
) )
} }
@@ -1492,8 +1523,10 @@ class LightTreeRawFirDeclarationBuilder(
propertyVisibility: Visibility, propertyVisibility: Visibility,
propertySymbol: FirPropertySymbol, propertySymbol: FirPropertySymbol,
propertyModifiers: Modifier, propertyModifiers: Modifier,
propertyAnnotations: List<FirAnnotationCall>,
): FirPropertyAccessor { ): FirPropertyAccessor {
var modifiers = Modifier() var modifiers = Modifier()
val accessorAnnotations = mutableListOf<FirAnnotationCall>()
var isGetter = true var isGetter = true
var returnType: FirTypeRef? = null var returnType: FirTypeRef? = null
val propertyTypeRefToUse = propertyTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef) val propertyTypeRefToUse = propertyTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
@@ -1514,10 +1547,13 @@ class LightTreeRawFirDeclarationBuilder(
if (it.asText == "set") isGetter = false if (it.asText == "set") isGetter = false
when (it.tokenType) { when (it.tokenType) {
SET_KEYWORD -> isGetter = false SET_KEYWORD -> isGetter = false
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
accessorAnnotations += convertAnnotationList(it)
}
TYPE_REFERENCE -> returnType = convertType(it) TYPE_REFERENCE -> returnType = convertType(it)
VALUE_PARAMETER_LIST -> firValueParameters = convertSetterParameter( VALUE_PARAMETER_LIST -> firValueParameters = convertSetterParameter(
it, accessorSymbol, propertyTypeRefToUse, propertyModifiers.annotations.filterUseSiteTarget(SETTER_PARAMETER) it, accessorSymbol, propertyTypeRefToUse, propertyAnnotations.filterUseSiteTarget(SETTER_PARAMETER)
) )
CONTRACT_EFFECT_LIST -> outerContractDescription = obtainContractDescription(it) CONTRACT_EFFECT_LIST -> outerContractDescription = obtainContractDescription(it)
BLOCK -> block = it BLOCK -> block = it
@@ -1536,7 +1572,7 @@ class LightTreeRawFirDeclarationBuilder(
isExternal = propertyModifiers.hasExternal() || modifiers.hasExternal() isExternal = propertyModifiers.hasExternal() || modifiers.hasExternal()
} }
val sourceElement = getterOrSetter.toFirSourceElement() val sourceElement = getterOrSetter.toFirSourceElement()
val accessorAdditionalAnnotations = propertyModifiers.annotations.filterUseSiteTarget( val accessorAdditionalAnnotations = propertyAnnotations.filterUseSiteTarget(
if (isGetter) PROPERTY_GETTER if (isGetter) PROPERTY_GETTER
else PROPERTY_SETTER else PROPERTY_SETTER
) )
@@ -1552,7 +1588,7 @@ class LightTreeRawFirDeclarationBuilder(
isGetter isGetter
) )
.also { accessor -> .also { accessor ->
accessor.replaceAnnotations(modifiers.annotations + accessorAdditionalAnnotations) accessor.replaceAnnotations(accessorAnnotations + accessorAdditionalAnnotations)
accessor.status = status accessor.status = status
accessor.initContainingClassAttr() accessor.initContainingClassAttr()
} }
@@ -1568,7 +1604,7 @@ class LightTreeRawFirDeclarationBuilder(
this.status = status this.status = status
context.firFunctionTargets += target context.firFunctionTargets += target
annotations += accessorAdditionalAnnotations annotations += accessorAdditionalAnnotations
annotations += modifiers.annotations annotations += accessorAnnotations
if (!isGetter) { if (!isGetter) {
valueParameters += firValueParameters valueParameters += firValueParameters
@@ -1602,11 +1638,15 @@ class LightTreeRawFirDeclarationBuilder(
property: LighterASTNode, property: LighterASTNode,
): FirBackingField { ): FirBackingField {
var modifiers = Modifier() var modifiers = Modifier()
val fieldAnnotations = mutableListOf<FirAnnotationCall>()
var returnType: FirTypeRef = implicitType var returnType: FirTypeRef = implicitType
var backingFieldInitializer: FirExpression? = null var backingFieldInitializer: FirExpression? = null
this?.forEachChildren { this?.forEachChildren {
when { when {
it.tokenType == MODIFIER_LIST -> modifiers = convertModifierList(it) it.tokenType == MODIFIER_LIST -> {
modifiers = convertModifierList(it)
fieldAnnotations += convertAnnotationList(it)
}
it.tokenType == TYPE_REFERENCE -> returnType = convertType(it) it.tokenType == TYPE_REFERENCE -> returnType = convertType(it)
it.isExpression() -> { it.isExpression() -> {
backingFieldInitializer = expressionConverter.getAsFirExpression(it, "Should have initializer") backingFieldInitializer = expressionConverter.getAsFirExpression(it, "Should have initializer")
@@ -1628,7 +1668,7 @@ class LightTreeRawFirDeclarationBuilder(
name = StandardNames.BACKING_FIELD name = StandardNames.BACKING_FIELD
symbol = FirBackingFieldSymbol(CallableId(name)) symbol = FirBackingFieldSymbol(CallableId(name))
this.status = status this.status = status
annotations += modifiers.annotations annotations += fieldAnnotations
annotations += annotationsFromProperty annotations += annotationsFromProperty
this.propertySymbol = propertySymbol this.propertySymbol = propertySymbol
this.initializer = backingFieldInitializer this.initializer = backingFieldInitializer
@@ -1731,6 +1771,7 @@ class LightTreeRawFirDeclarationBuilder(
*/ */
fun convertFunctionDeclaration(functionDeclaration: LighterASTNode): FirStatement { fun convertFunctionDeclaration(functionDeclaration: LighterASTNode): FirStatement {
var modifiers = Modifier() var modifiers = Modifier()
val functionAnnotations = mutableListOf<FirAnnotationCall>()
var identifier: String? = null var identifier: String? = null
var valueParametersList: LighterASTNode? = null var valueParametersList: LighterASTNode? = null
var isReturnType = false var isReturnType = false
@@ -1761,7 +1802,10 @@ class LightTreeRawFirDeclarationBuilder(
val target: FirFunctionTarget val target: FirFunctionTarget
functionDeclaration.forEachChildren { functionDeclaration.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
functionAnnotations += convertAnnotationList(it)
}
TYPE_PARAMETER_LIST -> typeParameterList = it TYPE_PARAMETER_LIST -> typeParameterList = it
VALUE_PARAMETER_LIST -> valueParametersList = it //must convert later, because it can contains "return" VALUE_PARAMETER_LIST -> valueParametersList = it //must convert later, because it can contains "return"
COLON -> isReturnType = true COLON -> isReturnType = true
@@ -1832,7 +1876,7 @@ class LightTreeRawFirDeclarationBuilder(
returnTypeRef = returnType!! returnTypeRef = returnType!!
context.firFunctionTargets += target context.firFunctionTargets += target
annotations += modifiers.annotations annotations += functionAnnotations
val actualTypeParameters = if (this is FirSimpleFunctionBuilder) { val actualTypeParameters = if (this is FirSimpleFunctionBuilder) {
typeParameters += firTypeParameters typeParameters += firTypeParameters
@@ -2439,6 +2483,7 @@ class LightTreeRawFirDeclarationBuilder(
additionalAnnotations: List<FirAnnotation> = emptyList() additionalAnnotations: List<FirAnnotation> = emptyList()
): ValueParameter { ): ValueParameter {
var modifiers = Modifier() var modifiers = Modifier()
val valueAnnotations = mutableListOf<FirAnnotationCall>()
var isVal = false var isVal = false
var isVar = false var isVar = false
var identifier: String? = null var identifier: String? = null
@@ -2447,7 +2492,10 @@ class LightTreeRawFirDeclarationBuilder(
var destructuringDeclaration: DestructuringDeclaration? = null var destructuringDeclaration: DestructuringDeclaration? = null
valueParameter.forEachChildren { valueParameter.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it) MODIFIER_LIST -> {
modifiers = convertModifierList(it)
valueAnnotations += convertAnnotationList(it)
}
VAL_KEYWORD -> isVal = true VAL_KEYWORD -> isVal = true
VAR_KEYWORD -> isVar = true VAR_KEYWORD -> isVar = true
IDENTIFIER -> identifier = it.asText IDENTIFIER -> identifier = it.asText
@@ -2464,6 +2512,7 @@ class LightTreeRawFirDeclarationBuilder(
isVal = isVal, isVal = isVal,
isVar = isVar, isVar = isVar,
modifiers = modifiers, modifiers = modifiers,
valueParameterAnnotations = valueAnnotations,
returnTypeRef = firType returnTypeRef = firType
?: when { ?: when {
valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef(valueParameterSource) valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef(valueParameterSource)
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.fromPrimaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.isFromVararg import org.jetbrains.kotlin.fir.declarations.utils.isFromVararg
import org.jetbrains.kotlin.fir.diagnostics.ConeSyntaxDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeSyntaxDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCallCopy import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCallCopy
import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression
@@ -51,6 +52,7 @@ class ValueParameter(
private val isVal: Boolean, private val isVal: Boolean,
private val isVar: Boolean, private val isVar: Boolean,
private val modifiers: Modifier, private val modifiers: Modifier,
private val valueParameterAnnotations: List<FirAnnotationCall>,
val returnTypeRef: FirTypeRef, val returnTypeRef: FirTypeRef,
val source: KtSourceElement, val source: KtSourceElement,
private val moduleData: FirModuleData, private val moduleData: FirModuleData,
@@ -68,9 +70,9 @@ class ValueParameter(
val annotations: List<FirAnnotation> by lazy(LazyThreadSafetyMode.NONE) { val annotations: List<FirAnnotation> by lazy(LazyThreadSafetyMode.NONE) {
buildList { buildList {
if (!isFromPrimaryConstructor) if (!isFromPrimaryConstructor)
addAll(modifiers.annotations) addAll(valueParameterAnnotations)
else else
modifiers.annotations.filterTo(this) { it.useSiteTarget.appliesToPrimaryConstructorParameter() } valueParameterAnnotations.filterTo(this) { it.useSiteTarget.appliesToPrimaryConstructorParameter() }
addAll(additionalAnnotations) addAll(additionalAnnotations)
} }
} }
@@ -132,7 +134,7 @@ class ValueParameter(
isVar = this@ValueParameter.isVar isVar = this@ValueParameter.isVar
val propertySymbol = FirPropertySymbol(callableId) val propertySymbol = FirPropertySymbol(callableId)
val remappedAnnotations = modifiers.annotations.map { val remappedAnnotations = valueParameterAnnotations.map {
buildAnnotationCallCopy(it) { buildAnnotationCallCopy(it) {
containingDeclarationSymbol = propertySymbol containingDeclarationSymbol = propertySymbol
} }