Psi2Ir: somewhat simplify Psi2IrTranslator API

Inline some methods only used once, deduplicate usages, rearrange
parameters, etc.
This commit is contained in:
Alexander Udalov
2020-07-13 18:24:20 +02:00
parent 241f82c70f
commit d3a34a8898
7 changed files with 56 additions and 106 deletions
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.linkage.IrProvider
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
@@ -35,21 +36,21 @@ object JvmBackendFacade {
fun doGenerateFiles(files: Collection<KtFile>, state: GenerationState, phaseConfig: PhaseConfig) {
val extensions = JvmGeneratorExtensions()
val mangler = JvmManglerDesc(MainFunctionDetector(state.bindingContext, state.languageVersionSettings))
val signaturer = JvmIdSignatureDescriptor(mangler)
val psi2ir = Psi2IrTranslator(state.languageVersionSettings, signaturer = signaturer)
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, JvmNameProvider, extensions = extensions)
val psi2ir = Psi2IrTranslator(state.languageVersionSettings, Psi2IrConfiguration())
val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), JvmNameProvider)
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, symbolTable, extensions)
val pluginExtensions = IrGenerationExtension.getInstances(state.project)
val functionFactory = IrFunctionFactory(psi2irContext.irBuiltIns, psi2irContext.symbolTable)
val functionFactory = IrFunctionFactory(psi2irContext.irBuiltIns, symbolTable)
psi2irContext.irBuiltIns.functionFactory = functionFactory
val stubGenerator = DeclarationStubGenerator(
psi2irContext.moduleDescriptor, psi2irContext.symbolTable, psi2irContext.irBuiltIns.languageVersionSettings, extensions
psi2irContext.moduleDescriptor, symbolTable, psi2irContext.irBuiltIns.languageVersionSettings, extensions
)
val irLinker = JvmIrLinker(
psi2irContext.moduleDescriptor,
EmptyLoggingContext,
psi2irContext.irBuiltIns,
psi2irContext.symbolTable,
symbolTable,
functionFactory,
stubGenerator,
mangler
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.linkage.IrProvider
import org.jetbrains.kotlin.ir.symbols.IrSymbol
@@ -37,8 +38,7 @@ typealias Psi2IrPostprocessingStep = (IrModuleFragment) -> Unit
class Psi2IrTranslator(
val languageVersionSettings: LanguageVersionSettings,
val configuration: Psi2IrConfiguration = Psi2IrConfiguration(),
val signaturer: IdSignatureComposer
val configuration: Psi2IrConfiguration,
) {
private val postprocessingSteps = SmartList<Psi2IrPostprocessingStep>()
@@ -46,31 +46,28 @@ class Psi2IrTranslator(
postprocessingSteps.add(step)
}
// NOTE: used only for test purpose
fun generateModule(
moduleDescriptor: ModuleDescriptor,
ktFiles: Collection<KtFile>,
bindingContext: BindingContext,
generatorExtensions: GeneratorExtensions,
nameProvider: NameProvider = NameProvider.DEFAULT
): IrModuleFragment {
val context = createGeneratorContext(moduleDescriptor, bindingContext, nameProvider, extensions = generatorExtensions)
val irProviders = generateTypicalIrProviderList(
moduleDescriptor, context.irBuiltIns, context.symbolTable, extensions = generatorExtensions
)
return generateModuleFragment(context, ktFiles, irProviders, emptyList())
}
fun createGeneratorContext(
moduleDescriptor: ModuleDescriptor,
bindingContext: BindingContext,
nameProvider: NameProvider = NameProvider.DEFAULT,
symbolTable: SymbolTable = SymbolTable(signaturer, nameProvider),
symbolTable: SymbolTable,
extensions: GeneratorExtensions = GeneratorExtensions()
): GeneratorContext =
createGeneratorContext(
configuration, moduleDescriptor, bindingContext, languageVersionSettings, symbolTable, extensions
): GeneratorContext {
val typeTranslator = TypeTranslator(symbolTable, languageVersionSettings, moduleDescriptor.builtIns, extensions = extensions)
val constantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable)
typeTranslator.constantValueGenerator = constantValueGenerator
constantValueGenerator.typeTranslator = typeTranslator
return GeneratorContext(
configuration,
moduleDescriptor,
bindingContext,
languageVersionSettings,
symbolTable,
extensions,
typeTranslator,
constantValueGenerator,
IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable),
)
}
fun generateModuleFragment(
context: GeneratorContext,
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.expressions.IrDeclarationReference
import org.jetbrains.kotlin.ir.util.ConstantValueGenerator
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
@@ -22,33 +21,6 @@ import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.storage.LockBasedStorageManager
fun createGeneratorContext(
configuration: Psi2IrConfiguration,
moduleDescriptor: ModuleDescriptor,
bindingContext: BindingContext,
languageVersionSettings: LanguageVersionSettings,
symbolTable: SymbolTable,
extensions: GeneratorExtensions
): GeneratorContext {
val typeTranslator = TypeTranslator(
symbolTable, languageVersionSettings, builtIns = moduleDescriptor.builtIns, extensions = extensions
)
val constantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable)
typeTranslator.constantValueGenerator = constantValueGenerator
constantValueGenerator.typeTranslator = typeTranslator
return GeneratorContext(
configuration,
moduleDescriptor,
bindingContext,
languageVersionSettings,
symbolTable,
extensions,
typeTranslator,
constantValueGenerator,
IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable)
)
}
class GeneratorContext(
val configuration: Psi2IrConfiguration,
val moduleDescriptor: ModuleDescriptor,
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideChecker
import org.jetbrains.kotlin.backend.common.serialization.DeserializationStrategy
@@ -57,8 +56,6 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
import org.jetbrains.kotlin.psi2ir.generators.createGeneratorContext
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingContextUtils
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -288,18 +285,10 @@ fun loadIr(
}
private fun runAnalysisAndPreparePsi2Ir(depsDescriptors: ModulesStructure): GeneratorContext {
val analysisResult = depsDescriptors.runAnalysis()
val mangler = JsManglerDesc
val signaturer = IdSignatureDescriptor(mangler)
return createGeneratorContext(
Psi2IrConfiguration(),
analysisResult.moduleDescriptor,
analysisResult.bindingContext,
depsDescriptors.compilerConfiguration.languageVersionSettings,
SymbolTable(signaturer),
GeneratorExtensions()
)
val (bindingContext, moduleDescriptor) = depsDescriptors.runAnalysis()
val psi2Ir = Psi2IrTranslator(depsDescriptors.compilerConfiguration.languageVersionSettings, Psi2IrConfiguration())
val symbolTable = SymbolTable(IdSignatureDescriptor(JsManglerDesc))
return psi2Ir.createGeneratorContext(moduleDescriptor, bindingContext, symbolTable)
}
fun GeneratorContext.generateModuleFragmentWithPlugins(
@@ -308,8 +297,7 @@ fun GeneratorContext.generateModuleFragmentWithPlugins(
irLinker: IrDeserializer,
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>? = null
): IrModuleFragment {
val signaturer = IdSignatureDescriptor(JsManglerDesc)
val psi2Ir = Psi2IrTranslator(languageVersionSettings, configuration, signaturer)
val psi2Ir = Psi2IrTranslator(languageVersionSettings, configuration)
val extensions = IrGenerationExtension.getInstances(project)
@@ -26,6 +26,9 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.NameProvider
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
@@ -85,11 +88,8 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
protected open fun generateIrModule(ignoreErrors: Boolean = false): IrModuleFragment {
assert(myFiles != null) { "myFiles not initialized" }
assert(myEnvironment != null) { "myEnvironment not initialized" }
val mangler = JsManglerDesc
val signaturer = IdSignatureDescriptor(mangler)
return doGenerateIrModule(Psi2IrTranslator(myEnvironment.configuration.languageVersionSettings,
Psi2IrConfiguration(ignoreErrors),
signaturer))
val psi2Ir = Psi2IrTranslator(myEnvironment.configuration.languageVersionSettings, Psi2IrConfiguration(ignoreErrors))
return doGenerateIrModule(psi2Ir)
}
protected open fun doGenerateIrModule(psi2IrTranslator: Psi2IrTranslator): IrModuleFragment =
@@ -133,13 +133,21 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
ktFilesToAnalyze: List<KtFile>,
generatorExtensions: GeneratorExtensions
): IrModuleFragment {
val (bindingContext, moduleDescriptor) = analysisResult
if (!psi2ir.configuration.ignoreErrors) {
analysisResult.throwIfError()
AnalyzingUtils.throwExceptionOnErrors(analysisResult.bindingContext)
AnalyzingUtils.throwExceptionOnErrors(bindingContext)
}
return psi2ir.generateModule(
analysisResult.moduleDescriptor, ktFilesToAnalyze, analysisResult.bindingContext, generatorExtensions
val context = psi2ir.createGeneratorContext(
moduleDescriptor,
bindingContext,
SymbolTable(IdSignatureDescriptor(JsManglerDesc), NameProvider.DEFAULT),
generatorExtensions
)
val irProviders = generateTypicalIrProviderList(
moduleDescriptor, context.irBuiltIns, context.symbolTable, extensions = generatorExtensions
)
return psi2ir.generateModuleFragment(context, ktFilesToAnalyze, irProviders, emptyList())
}
}
}
@@ -42,9 +42,9 @@ import org.jetbrains.kotlin.ir.descriptors.IrFunctionFactory
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.library.KotlinLibraryVersioning
import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.KotlinLibraryVersioning
import org.jetbrains.kotlin.library.SerializedIrModule
import org.jetbrains.kotlin.library.impl.BuiltInsPlatform
import org.jetbrains.kotlin.library.impl.KotlinLibraryOnlyIrWriter
@@ -53,8 +53,6 @@ import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStat
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
import org.jetbrains.kotlin.psi2ir.generators.createGeneratorContext
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.multiplatform.isCommonSource
import org.jetbrains.kotlin.serialization.js.ModuleKind
@@ -448,19 +446,9 @@ class GenerateIrRuntime {
}
private fun doPsi2Ir(files: List<KtFile>, analysisResult: AnalysisResult): IrModuleFragment {
val psi2IrConfiguration = Psi2IrConfiguration()
val mangler = JsManglerDesc
val signaturer = IdSignatureDescriptor(mangler)
val symbolTable = SymbolTable(signaturer)
val generatorExtensions = GeneratorExtensions()
val psi2IrContext = createGeneratorContext(
psi2IrConfiguration,
analysisResult.moduleDescriptor,
analysisResult.bindingContext,
languageVersionSettings,
symbolTable,
generatorExtensions
)
val psi2Ir = Psi2IrTranslator(languageVersionSettings, Psi2IrConfiguration())
val symbolTable = SymbolTable(IdSignatureDescriptor(JsManglerDesc))
val psi2IrContext = psi2Ir.createGeneratorContext(analysisResult.moduleDescriptor, analysisResult.bindingContext, symbolTable)
val irBuiltIns = psi2IrContext.irBuiltIns
val functionFactory = IrFunctionFactory(irBuiltIns, psi2IrContext.symbolTable)
@@ -477,7 +465,7 @@ class GenerateIrRuntime {
val irProviders = listOf(irLinker)
val psi2IrTranslator = Psi2IrTranslator(languageVersionSettings, psi2IrContext.configuration, signaturer)
val psi2IrTranslator = Psi2IrTranslator(languageVersionSettings, psi2IrContext.configuration)
return psi2IrTranslator.generateModuleFragment(psi2IrContext, files, irProviders, emptyList(), null)
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.scripting.repl.js
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
@@ -18,12 +17,12 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.generateJsCode
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.utils.NameTables
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzerBase
import org.jetbrains.kotlin.serialization.js.ModuleKind
@@ -58,12 +57,9 @@ class JsCoreScriptingCompiler(
}
val files = listOf(snippetKtFile)
val module = analysisResult.moduleDescriptor
val bindingContext = analysisResult.bindingContext
val mangler = JsManglerDesc
val signaturer = IdSignatureDescriptor(mangler)
val psi2ir = Psi2IrTranslator(environment.configuration.languageVersionSettings, signaturer = signaturer)
val psi2irContext = psi2ir.createGeneratorContext(module, bindingContext, symbolTable = symbolTable)
val (bindingContext, module) = analysisResult
val psi2ir = Psi2IrTranslator(environment.configuration.languageVersionSettings, Psi2IrConfiguration())
val psi2irContext = psi2ir.createGeneratorContext(module, bindingContext, symbolTable)
val providers = generateTypicalIrProviderList(module, psi2irContext.irBuiltIns, psi2irContext.symbolTable)
val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, providers, emptyList(), null) // TODO: deserializer