FIR: replace receiver in anon initializer with containing decl

This way the abstraction represents the intended use better and
doesn't stay on the way of using FirAnonymousInitializer in scripts
This commit is contained in:
Ilya Chernikov
2023-11-30 17:49:51 +01:00
committed by Space Team
parent 12da3d2b9f
commit ff4f30ddc1
13 changed files with 59 additions and 46 deletions
@@ -54,6 +54,7 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.util.getChildren
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.runUnless
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
class LightTreeRawFirDeclarationBuilder(
session: FirSession,
@@ -136,7 +137,7 @@ class LightTreeRawFirDeclarationBuilder(
KtNodeTypes.PROPERTY -> container += convertPropertyDeclaration(node) as FirStatement
DESTRUCTURING_DECLARATION -> container += convertDestructingDeclaration(node).toFirDestructingDeclaration(baseModuleData)
TYPEALIAS -> container += convertTypeAlias(node) as FirStatement
CLASS_INITIALIZER -> container += convertAnonymousInitializer(node) as FirStatement
CLASS_INITIALIZER -> shouldNotBeCalled("CLASS_INITIALIZER expected to be processed during class body conversion")
else -> if (node.isExpression()) container += expressionConverter.getAsFirStatement(node)
}
}
@@ -891,7 +892,7 @@ class LightTreeRawFirDeclarationBuilder(
KtNodeTypes.PROPERTY -> container += convertPropertyDeclaration(node, classWrapper)
TYPEALIAS -> container += convertTypeAlias(node)
OBJECT_DECLARATION -> container += convertClass(node)
CLASS_INITIALIZER -> container += convertAnonymousInitializer(node) //anonymousInitializer
CLASS_INITIALIZER -> container += convertAnonymousInitializer(node, classWrapper) //anonymousInitializer
SECONDARY_CONSTRUCTOR -> container += convertSecondaryConstructor(node, classWrapper)
MODIFIER_LIST -> modifierLists += node
DESTRUCTURING_DECLARATION -> container += buildErrorTopLevelDestructuringDeclaration(node.toFirSourceElement())
@@ -1053,7 +1054,10 @@ class LightTreeRawFirDeclarationBuilder(
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseMemberDeclarationRest
* at INIT keyword
*/
private fun convertAnonymousInitializer(anonymousInitializer: LighterASTNode): FirDeclaration {
private fun convertAnonymousInitializer(
anonymousInitializer: LighterASTNode,
classWrapper: ClassWrapper
): FirDeclaration {
val initializerSymbol = FirAnonymousInitializerSymbol()
withContainerSymbol(initializerSymbol) {
var firBlock: FirBlock? = null
@@ -1073,7 +1077,7 @@ class LightTreeRawFirDeclarationBuilder(
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
body = firBlock ?: buildEmptyExpressionBlock()
dispatchReceiverType = context.dispatchReceiverTypesStack.lastOrNull()
containingDeclarationSymbol = classWrapper.classBuilder.ownerRegularOrAnonymousObjectSymbol
annotations += initializerAnnotations
}
}