[FIR] PsiRawFirBuilder: add missing script configurator
PsiRawFirBuilder#visitScript didn't work because it didn't have a configurator Now FirScriptConfiguratorExtension split into two parts: * File * Script ^KT-60728
This commit is contained in:
committed by
Space Team
parent
32e3b67416
commit
35b0cd65e9
+26
-17
@@ -1127,19 +1127,23 @@ open class PsiRawFirBuilder(
|
||||
for (declaration in file.declarations) {
|
||||
declarations += when (declaration) {
|
||||
is KtScript -> {
|
||||
requireWithAttachment(file.declarations.size == 1, message = { "Expect the script to be the only declaration in the file" }) {
|
||||
withEntry("fileName", file.name)
|
||||
}
|
||||
convertScript(declaration, this.name) {
|
||||
for (configurator in baseSession.extensionService.scriptConfigurators) {
|
||||
with(configurator) { configure(this@buildFile) }
|
||||
requireWithAttachment(
|
||||
file.declarations.size == 1,
|
||||
message = { "Expect the script to be the only declaration in the file" },
|
||||
) {
|
||||
withEntry("fileName", file.name)
|
||||
}
|
||||
|
||||
convertScript(declaration, name, sourceFile) {
|
||||
for (configurator in baseSession.extensionService.scriptConfigurators) {
|
||||
with(configurator) { configureContainingFile(this@buildFile) }
|
||||
}
|
||||
}
|
||||
}
|
||||
is KtDestructuringDeclaration -> buildErrorTopLevelDestructuringDeclaration(declaration.toFirSourceElement())
|
||||
else -> declaration.convert()
|
||||
}
|
||||
is KtDestructuringDeclaration -> buildErrorTopLevelDestructuringDeclaration(declaration.toFirSourceElement())
|
||||
else -> declaration.convert()
|
||||
}
|
||||
}
|
||||
|
||||
for (danglingModifierList in file.danglingModifierLists) {
|
||||
declarations += buildErrorTopLevelDeclarationForDanglingModifierList(danglingModifierList)
|
||||
@@ -1148,7 +1152,12 @@ open class PsiRawFirBuilder(
|
||||
}
|
||||
}
|
||||
|
||||
private fun convertScript(script: KtScript, fileName: String, setup: FirScriptBuilder.() -> Unit = {}): FirScript {
|
||||
private fun convertScript(
|
||||
script: KtScript,
|
||||
fileName: String,
|
||||
sourceFile: KtSourceFile?,
|
||||
setup: FirScriptBuilder.() -> Unit = {},
|
||||
): FirScript {
|
||||
return buildScript {
|
||||
source = script.toFirSourceElement()
|
||||
moduleData = baseModuleData
|
||||
@@ -1193,6 +1202,11 @@ open class PsiRawFirBuilder(
|
||||
}
|
||||
}
|
||||
setup()
|
||||
if (sourceFile != null) {
|
||||
for (configurator in baseSession.extensionService.scriptConfigurators) {
|
||||
with(configurator) { configure(sourceFile) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1212,16 +1226,11 @@ open class PsiRawFirBuilder(
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: if no original FirScript is passed here, the invalid script could be constructed, consider throwing an error
|
||||
override fun visitScript(script: KtScript, data: FirElement?): FirElement {
|
||||
val ktFile = script.containingKtFile
|
||||
val fileName = ktFile.name
|
||||
return convertScript(script, fileName) {
|
||||
(data as? FirScript)?.let {
|
||||
contextReceivers.addAll(it.contextReceivers)
|
||||
parameters.addAll(it.parameters)
|
||||
}
|
||||
}
|
||||
val fileForSource = (data as? FirScript)?.psi?.containingFile as? KtFile ?: ktFile
|
||||
return convertScript(script, fileName, KtPsiSourceFile(fileForSource))
|
||||
}
|
||||
|
||||
protected fun KtEnumEntry.toFirEnumEntry(
|
||||
|
||||
+4
-2
@@ -1,10 +1,11 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 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.builder
|
||||
|
||||
import org.jetbrains.kotlin.KtSourceFile
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirFileBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirScriptBuilder
|
||||
@@ -27,7 +28,8 @@ abstract class FirScriptConfiguratorExtension(
|
||||
|
||||
fun interface Factory : FirExtension.Factory<FirScriptConfiguratorExtension>
|
||||
|
||||
abstract fun FirScriptBuilder.configure(fileBuilder: FirFileBuilder)
|
||||
abstract fun FirScriptBuilder.configureContainingFile(fileBuilder: FirFileBuilder)
|
||||
abstract fun FirScriptBuilder.configure(sourceFile: KtSourceFile)
|
||||
}
|
||||
|
||||
val FirExtensionService.scriptConfigurators: List<FirScriptConfiguratorExtension> by FirExtensionService.registeredExtensions()
|
||||
|
||||
Reference in New Issue
Block a user