K2 scripting: add initial scripting support to K2 frontend

This commit is contained in:
Ilya Chernikov
2022-11-08 10:42:10 +01:00
committed by Space Team
parent 7ec6608e29
commit a3a1550933
27 changed files with 513 additions and 9 deletions
@@ -153,7 +153,7 @@ object FirOptInUsageBaseChecker {
fir.loadCallableSpecificExperimentalities(this, context, visited, fromSetter, dispatchReceiverType, result)
is FirClassLikeDeclaration ->
fir.loadClassLikeSpecificExperimentalities(this, context, visited, result)
is FirAnonymousInitializer, is FirFile, is FirTypeParameter -> {}
is FirAnonymousInitializer, is FirFile, is FirTypeParameter, is FirScript -> {}
}
fir.loadExperimentalitiesFromAnnotationTo(session, result, fromSupertype)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol
import org.jetbrains.kotlin.fir.types.ConeErrorType
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -221,6 +222,9 @@ sealed class ContextReceiverValue<S : FirBasedSymbol<*>>(
boundSymbol, type, useSiteSession, scopeSession, mutable, contextReceiverNumber,
) {
abstract override fun createSnapshot(): ContextReceiverValue<S>
override val isContextReceiver: Boolean
get() = true
}
class ContextReceiverValueForCallable(
@@ -236,9 +240,6 @@ class ContextReceiverValueForCallable(
) {
override fun createSnapshot(): ContextReceiverValue<FirCallableSymbol<*>> =
ContextReceiverValueForCallable(boundSymbol, type, labelName, useSiteSession, scopeSession, mutable = false, contextReceiverNumber)
override val isContextReceiver: Boolean
get() = true
}
class ContextReceiverValueForClass(
@@ -254,7 +255,20 @@ class ContextReceiverValueForClass(
) {
override fun createSnapshot(): ContextReceiverValue<FirClassSymbol<*>> =
ContextReceiverValueForClass(boundSymbol, type, labelName, useSiteSession, scopeSession, mutable = false, contextReceiverNumber)
override val isContextReceiver: Boolean
get() = true
}
class ImplicitReceiverValueForScript(
boundSymbol: FirScriptSymbol,
type: ConeKotlinType,
labelName: Name?,
useSiteSession: FirSession,
scopeSession: ScopeSession,
mutable: Boolean = true,
contextReceiverNumber: Int,
) : ContextReceiverValue<FirScriptSymbol>(
boundSymbol, type, labelName, useSiteSession, scopeSession, mutable, contextReceiverNumber
) {
override fun createSnapshot(): ContextReceiverValue<FirScriptSymbol> =
ImplicitReceiverValueForScript(boundSymbol, type, labelName, useSiteSession, scopeSession, mutable = false, contextReceiverNumber)
}
@@ -0,0 +1,84 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
class FirScriptDeclarationsScope(
val useSiteSession: FirSession,
val script: FirScript,
) : FirContainingNamesAwareScope() {
private val callablesIndex: Map<Name, List<FirCallableSymbol<*>>> = run {
val result = mutableMapOf<Name, MutableList<FirCallableSymbol<*>>>()
loop@ for (statement in script.statements) {
if (statement is FirCallableDeclaration) {
val name = when (statement) {
is FirVariable -> if (statement.isSynthetic) continue@loop else statement.name
is FirSimpleFunction -> statement.name
// TODO: destructuring decl
else -> continue@loop
}
result.getOrPut(name) { mutableListOf() } += statement.symbol
}
}
result
}
private val classIndex: Map<Name, FirRegularClassSymbol> = run {
val result = mutableMapOf<Name, FirRegularClassSymbol>()
for (declaration in script.statements) {
if (declaration is FirRegularClass) {
result[declaration.name] = declaration.symbol
}
}
result
}
override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
if (name == SpecialNames.INIT) return
processCallables(name, processor)
}
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
processCallables(name, processor)
}
private inline fun <reified D : FirCallableSymbol<*>> processCallables(
name: Name,
processor: (D) -> Unit
) {
val symbols = callablesIndex[name] ?: emptyList()
for (symbol in symbols) {
if (symbol is D) {
processor(symbol)
}
}
}
override fun getCallableNames(): Set<Name> {
return callablesIndex.keys
}
override fun processClassifiersByNameWithSubstitution(
name: Name,
processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit
) {
val matchedClass = classIndex[name] ?: return
val substitution = matchedClass.typeParameterSymbols.associateWith { it.toConeType() }
processor(matchedClass, ConeSubstitutorByMap(substitution, useSiteSession))
}
override fun getClassifierNames(): Set<Name> = classIndex.keys
}
@@ -992,8 +992,10 @@ open class RawFirBuilder(
}
for (declaration in file.declarations) {
declarations += when (declaration) {
// TODO: scripts aren't supported yet
is KtScript -> continue
is KtScript -> {
require(file.declarations.size == 1) { "Expect the script to be the only declaration in the file $name" }
convertScript(declaration, this)
}
is KtDestructuringDeclaration -> buildErrorTopLevelDestructuringDeclaration(declaration.toFirSourceElement())
else -> declaration.convert()
}
@@ -1001,6 +1003,30 @@ open class RawFirBuilder(
}
}
private fun convertScript(script: KtScript, containingFile: FirFileBuilder,): FirScript {
return buildScript {
source = script.toFirSourceElement()
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
name = Name.special("<script-${containingFile.name}>")
symbol = FirScriptSymbol(context.packageFqName.child(name))
for (declaration in script.declarations) {
when (declaration) {
is KtScriptInitializer -> {
declaration.body?.let { statements.add(it.toFirStatement()) }
}
else -> {
statements.add(declaration.toFirStatement())
}
}
}
}
}
override fun visitScript(script: KtScript, data: Unit?): FirElement {
error("should not be here")
}
protected fun KtEnumEntry.toFirEnumEntry(
delegatedEnumSelfTypeRef: FirResolvedTypeRef,
ownerClassHasDefaultConstructor: Boolean
@@ -2145,6 +2171,7 @@ open class RawFirBuilder(
return (parent.parent as? KtExpression)?.usedAsExpression ?: true
}
}
if (parent is KtScriptInitializer) return false
// Here we check that when used is a single statement of a loop
if (parent !is KtContainerNodeForControlStructureBody) return true
val type = parent.parent.elementType
@@ -308,6 +308,17 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
graphBuilder.exitAnonymousObjectExpression(anonymousObjectExpression).mergeIncomingFlow()
}
// ----------------------------------- Scripts ------------------------------------------
fun enterScript(script: FirScript) {
val res = graphBuilder.enterScript(script)
res.mergeIncomingFlow()
}
fun exitScript(script: FirScript) {
graphBuilder.exitScript(script)
}
// ----------------------------------- Value parameters (and it's defaults) -----------------------------------
fun enterValueParameter(valueParameter: FirValueParameter) {
@@ -515,6 +515,22 @@ class ControlFlowGraphBuilder {
}
}
fun enterScript(script: FirScript): ScriptEnterNode {
pushGraph(
ControlFlowGraph(null, "SCRIPT_GRAPH", ControlFlowGraph.Kind.Function),
mode = Mode.Body
)
val enterNode = createScriptEnterNode(script)
lastNodes.push(enterNode)
return enterNode
}
fun exitScript(script: FirScript): ScriptExitNode {
return createScriptExitNode(script).also {
addNewSimpleNodeIfPossible(it)
}
}
private fun visitLocalClassFunctions(klass: FirClass, node: CFGNodeWithSubgraphs<*>) {
klass.declarations.filterIsInstance<FirFunction>().forEach { function ->
val functionGraph = function.controlFlowGraphReference?.controlFlowGraph
@@ -235,6 +235,12 @@ fun ControlFlowGraphBuilder.createAnonymousObjectExitNode(fir: FirAnonymousObjec
fun ControlFlowGraphBuilder.createAnonymousObjectExpressionExitNode(fir: FirAnonymousObjectExpression): AnonymousObjectExpressionExitNode =
AnonymousObjectExpressionExitNode(currentGraph, fir, levelCounter, createId())
fun ControlFlowGraphBuilder.createScriptEnterNode(fir: FirScript): ScriptEnterNode =
ScriptEnterNode(currentGraph, fir, levelCounter, createId())
fun ControlFlowGraphBuilder.createScriptExitNode(fir: FirScript): ScriptExitNode =
ScriptExitNode(currentGraph, fir, levelCounter, createId())
fun ControlFlowGraphBuilder.createUnionFunctionCallArgumentsNode(fir: FirElement): UnionFunctionCallArgumentsNode =
UnionFunctionCallArgumentsNode(currentGraph, fir, levelCounter, createId())
@@ -492,6 +492,37 @@ class BodyResolveContext(
}
}
fun <T> withScopesForScript(
owner: FirScript,
holder: SessionHolder,
f: () -> T
): T {
val towerElementsForScript = holder.collectTowerDataElementsForScript(owner)
val base = towerDataContext.addNonLocalTowerDataElements(emptyList())
val statics = base
.addNonLocalScopeIfNotNull(towerElementsForScript.staticScope)
val forMembersResolution =
statics
.addContextReceiverGroup(towerElementsForScript.implicitReceivers)
val newContexts = FirRegularTowerDataContexts(
regular = forMembersResolution,
forClassHeaderAnnotations = base,
forNestedClasses = forMembersResolution,
forCompanionObject = statics,
forConstructorHeaders = null,
forEnumEntries = null,
primaryConstructorPureParametersScope = null,
primaryConstructorAllParametersScope = null
)
return withTowerDataContexts(newContexts) {
f()
}
}
@OptIn(PrivateForInline::class)
inline fun <T> withWhenSubjectType(
subjectType: ConeKotlinType?,
@@ -57,6 +57,10 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
}
}
override fun transformScript(script: FirScript, data: ResolutionMode): FirScript {
return declarationsTransformer.transformScript(script, data)
}
override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E {
@Suppress("UNCHECKED_CAST")
return (element.transformChildren(this, data) as E)
@@ -507,6 +507,18 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
}
}
override fun transformScript(script: FirScript, data: ResolutionMode): FirScript {
if (implicitTypeOnly) return script
dataFlowAnalyzer.enterScript(script)
val result = context.withScopesForScript(script, components) {
transformDeclarationContent(script, data) as FirScript
}
dataFlowAnalyzer.exitScript(script)
return result
}
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias {
if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) {
return typeAlias.runAllPhasesForLocalClass(
@@ -90,6 +90,10 @@ abstract class FirAbstractContractResolveTransformerDispatcher(
}
}
override fun transformScript(script: FirScript, data: ResolutionMode): FirScript {
return script
}
override fun transformProperty(property: FirProperty, data: ResolutionMode): FirProperty {
if (
property.getter?.hasContractToResolve != true && property.setter?.hasContractToResolve != true ||
@@ -132,6 +132,10 @@ private class FirDeclarationsResolveTransformerForArgumentAnnotations(
typeAlias.transformAnnotations(transformer, data)
return typeAlias
}
override fun transformScript(script: FirScript, data: ResolutionMode): FirScript {
return script
}
}
private class FirExpressionsResolveTransformerForSpecificAnnotations(
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.labelName
import org.jetbrains.kotlin.fir.resolve.SessionHolder
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValueForScript
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirScriptDeclarationsScope
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneType
class TowerElementsForScript(
val implicitReceivers: List<ImplicitReceiverValueForScript>,
val staticScope: FirScope?,
)
fun SessionHolder.collectTowerDataElementsForScript(owner: FirScript): TowerElementsForScript {
val contextReceivers = owner.contextReceivers.mapIndexed { index, receiver ->
ImplicitReceiverValueForScript(
owner.symbol, receiver.typeRef.coneType, receiver.labelName, session, scopeSession,
contextReceiverNumber = index,
)
}
return TowerElementsForScript(
contextReceivers,
FirScriptDeclarationsScope(session, owner),
)
}
@@ -303,6 +303,20 @@ class AnonymousObjectExpressionExitNode(owner: ControlFlowGraph, override val fi
}
}
// ----------------------------------- Scripts ------------------------------------------
class ScriptEnterNode(owner: ControlFlowGraph, override val fir: FirScript, level: Int, id: Int) : CFGNode<FirScript>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitScriptEnterNode(this, data)
}
}
class ScriptExitNode(owner: ControlFlowGraph, override val fir: FirScript, level: Int, id: Int) : CFGNode<FirScript>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitScriptExitNode(this, data)
}
}
// ----------------------------------- Initialization -----------------------------------
class PartOfClassInitializationNode(owner: ControlFlowGraph, override val fir: FirControlFlowGraphOwner, level: Int, id: Int) : CFGNodeWithCfgOwner<FirControlFlowGraphOwner>(owner, level, id) {
@@ -112,6 +112,9 @@ fun CFGNode<*>.render(): String =
is AnonymousObjectExitNode -> "Exit anonymous object"
is AnonymousObjectExpressionExitNode -> "Exit anonymous object expression"
is ScriptEnterNode -> "Enter class ${fir.name}"
is ScriptExitNode -> "Exit class ${fir.name}"
is ContractDescriptionEnterNode -> "Enter contract description"
is EnterDefaultArgumentsNode -> "Enter default value of ${fir.name}"
@@ -80,6 +80,16 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
return visitNode(node, data)
}
// ----------------------------------- Scripts ------------------------------------------
open fun visitScriptEnterNode(node: ScriptEnterNode, data: D): R {
return visitNode(node, data)
}
open fun visitScriptExitNode(node: ScriptExitNode, data: D): R {
return visitNode(node, data)
}
// ----------------------------------- Initialization -----------------------------------
open fun visitPartOfClassInitializationNode(node: PartOfClassInitializationNode, data: D): R {
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirScript : FirDeclaration() {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract val name: Name
abstract val statements: List<FirStatement>
abstract override val symbol: FirScriptSymbol
abstract val contextReceivers: List<FirContextReceiver>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitScript(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformScript(this, data) as E
abstract override fun replaceResolvePhase(newResolvePhase: FirResolvePhase)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirScript
abstract fun <D> transformStatements(transformer: FirTransformer<D>, data: D): FirScript
}
@@ -0,0 +1,68 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.declarations.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.declarations.impl.FirScriptImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol
import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.Name
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirScriptBuilder : FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var moduleData: FirModuleData
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
lateinit var origin: FirDeclarationOrigin
var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
lateinit var name: Name
val statements: MutableList<FirStatement> = mutableListOf()
lateinit var symbol: FirScriptSymbol
val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
override fun build(): FirScript {
return FirScriptImpl(
source,
annotations,
moduleData,
resolvePhase,
origin,
attributes,
name,
statements,
symbol,
contextReceivers,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildScript(init: FirScriptBuilder.() -> Unit): FirScript {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirScriptBuilder().apply(init).build()
}
@@ -0,0 +1,71 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
internal class FirScriptImpl(
override val source: KtSourceElement?,
override val annotations: MutableList<FirAnnotation>,
override val moduleData: FirModuleData,
@Volatile
override var resolvePhase: FirResolvePhase,
override val origin: FirDeclarationOrigin,
override val attributes: FirDeclarationAttributes,
override val name: Name,
override val statements: MutableList<FirStatement>,
override val symbol: FirScriptSymbol,
override val contextReceivers: MutableList<FirContextReceiver>,
) : FirScript() {
init {
symbol.bind(this)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }
statements.forEach { it.accept(visitor, data) }
contextReceivers.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirScriptImpl {
transformAnnotations(transformer, data)
transformStatements(transformer, data)
contextReceivers.transformInplace(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirScriptImpl {
annotations.transformInplace(transformer, data)
return this
}
override fun <D> transformStatements(transformer: FirTransformer<D>, data: D): FirScriptImpl {
statements.transformInplace(transformer, data)
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
}
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirBackingField
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
@@ -170,6 +171,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitFile(file: FirFile, data: D): R = visitDeclaration(file, data)
override fun visitScript(script: FirScript, data: D): R = visitDeclaration(script, data)
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression, data: D): R = visitExpression(anonymousFunctionExpression, data)
override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression, data: D): R = visitExpression(anonymousObjectExpression, data)
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirBackingField
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
@@ -170,6 +171,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitFile(file: FirFile) = visitDeclaration(file)
override fun visitScript(script: FirScript) = visitDeclaration(script)
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) = visitExpression(anonymousFunctionExpression)
override fun visitAnonymousObjectExpression(anonymousObjectExpression: FirAnonymousObjectExpression) = visitExpression(anonymousObjectExpression)
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirBackingField
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
@@ -305,6 +306,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(file, data)
}
open fun transformScript(script: FirScript, data: D): FirScript {
return transformElement(script, data)
}
open fun transformPackageDirective(packageDirective: FirPackageDirective, data: D): FirPackageDirective {
return transformElement(packageDirective, data)
}
@@ -857,6 +862,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformFile(file, data)
}
final override fun visitScript(script: FirScript, data: D): FirScript {
return transformScript(script, data)
}
final override fun visitPackageDirective(packageDirective: FirPackageDirective, data: D): FirPackageDirective {
return transformPackageDirective(packageDirective, data)
}
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirBackingField
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
@@ -228,6 +229,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitFile(file: FirFile, data: D): R = visitElement(file, data)
open fun visitScript(script: FirScript, data: D): R = visitElement(script, data)
open fun visitPackageDirective(packageDirective: FirPackageDirective, data: D): R = visitElement(packageDirective, data)
open fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): R = visitElement(anonymousFunction, data)
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirBackingField
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
@@ -304,6 +305,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(file)
}
open fun visitScript(script: FirScript) {
visitElement(script)
}
open fun visitPackageDirective(packageDirective: FirPackageDirective) {
visitElement(packageDirective)
}
@@ -856,6 +861,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitFile(file)
}
final override fun visitScript(script: FirScript, data: Nothing?) {
visitScript(script)
}
final override fun visitPackageDirective(packageDirective: FirPackageDirective, data: Nothing?) {
visitPackageDirective(packageDirective)
}
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.name.FqName
class FirScriptSymbol(val fqName: FqName) : FirBasedSymbol<FirScript>()
@@ -60,6 +60,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val backingField by element(Declaration, variable, typeParametersOwner, statement)
val constructor by element(Declaration, function, typeParameterRefsOwner)
val file by element(Declaration, declaration)
val script by element(Declaration, declaration)
val packageDirective by element(Other)
val anonymousFunction by element(Declaration, function, typeParametersOwner)
@@ -451,6 +451,13 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+symbol("FirFileSymbol")
}
script.configure {
+name
+fieldList(statement).withTransform()
+symbol("FirScriptSymbol")
+fieldList(contextReceiver)
}
packageDirective.configure {
+field("packageFqName", fqNameType)
}