Simplify ExternalDependenciesGenerator

Remove unused parameters, inline inner class
This commit is contained in:
Alexander Udalov
2019-02-26 18:20:42 +01:00
parent 4b712bd14b
commit 9d94a54f03
7 changed files with 46 additions and 58 deletions
@@ -172,7 +172,7 @@ fun compile(
val context = if (compileMode.generateKlib) { val context = if (compileMode.generateKlib) {
deserializedModuleFragments.forEach { deserializedModuleFragments.forEach {
ExternalDependenciesGenerator(it.descriptor, symbolTable, irBuiltIns).generateUnboundSymbolsAsDependencies(it) ExternalDependenciesGenerator(it.descriptor, symbolTable, irBuiltIns).generateUnboundSymbolsAsDependencies()
} }
deserializedModuleFragments.forEach { it.patchDeclarationParents() } deserializedModuleFragments.forEach { it.patchDeclarationParents() }
serializeModuleIntoKlib( serializeModuleIntoKlib(
@@ -216,7 +216,7 @@ fun compile(
context.symbolTable, context.symbolTable,
context.irBuiltIns, context.irBuiltIns,
deserializer = deserializer deserializer = deserializer
).generateUnboundSymbolsAsDependencies(it) ).generateUnboundSymbolsAsDependencies()
} }
// TODO: check the order // TODO: check the order
@@ -229,10 +229,9 @@ fun compile(
moduleDescriptor = context.module, moduleDescriptor = context.module,
symbolTable = context.symbolTable, symbolTable = context.symbolTable,
irBuiltIns = context.irBuiltIns irBuiltIns = context.irBuiltIns
).generateUnboundSymbolsAsDependencies(moduleFragment) ).generateUnboundSymbolsAsDependencies()
moduleFragment.patchDeclarationParents() moduleFragment.patchDeclarationParents()
jsPhases.invokeToplevel(context.phaseConfig, context, moduleFragment) jsPhases.invokeToplevel(context.phaseConfig, context, moduleFragment)
moduleFragment.accept(IrModuleToJsTransformer(context), null) moduleFragment.accept(IrModuleToJsTransformer(context), null)
@@ -58,7 +58,7 @@ internal fun IrModuleFragment.replaceUnboundSymbols(context: JsIrBackendContext)
descriptor, descriptor,
symbolTable = context.symbolTable, symbolTable = context.symbolTable,
irBuiltIns = context.irBuiltIns irBuiltIns = context.irBuiltIns
).generateUnboundSymbolsAsDependencies(this) ).generateUnboundSymbolsAsDependencies()
} }
private class DeclarationSymbolCollector : IrElementVisitorVoid { private class DeclarationSymbolCollector : IrElementVisitorVoid {
@@ -23,13 +23,13 @@ object JvmBackendFacade {
} }
internal fun doGenerateFilesInternal( internal fun doGenerateFilesInternal(
state: GenerationState, state: GenerationState,
errorHandler: CompilationErrorHandler, errorHandler: CompilationErrorHandler,
irModuleFragment: IrModuleFragment, irModuleFragment: IrModuleFragment,
psi2irContext: GeneratorContext psi2irContext: GeneratorContext
) { ) {
val jvmBackendContext = JvmBackendContext( val jvmBackendContext = JvmBackendContext(
state, psi2irContext.sourceManager, psi2irContext.irBuiltIns, irModuleFragment, psi2irContext.symbolTable state, psi2irContext.sourceManager, psi2irContext.irBuiltIns, irModuleFragment, psi2irContext.symbolTable
) )
//TODO //TODO
ExternalDependenciesGenerator( ExternalDependenciesGenerator(
@@ -37,7 +37,7 @@ object JvmBackendFacade {
psi2irContext.symbolTable, psi2irContext.symbolTable,
psi2irContext.irBuiltIns, psi2irContext.irBuiltIns,
JvmGeneratorExtensions.externalDeclarationOrigin JvmGeneratorExtensions.externalDeclarationOrigin
).generateUnboundSymbolsAsDependencies(irModuleFragment) ).generateUnboundSymbolsAsDependencies()
val jvmBackend = JvmBackend(jvmBackendContext) val jvmBackend = JvmBackend(jvmBackendContext)
@@ -45,11 +45,9 @@ object JvmBackendFacade {
try { try {
jvmBackend.generateFile(irFile) jvmBackend.generateFile(irFile)
state.afterIndependentPart() state.afterIndependentPart()
} } catch (e: Throwable) {
catch (e: Throwable) {
errorHandler.reportException(e, null) // TODO ktFile.virtualFile.url errorHandler.reportException(e, null) // TODO ktFile.virtualFile.url
} }
} }
} }
} }
@@ -45,7 +45,7 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator {
fun generateUnboundSymbolsAsDependencies(irModule: IrModuleFragment, deserializer: IrDeserializer? = null) { fun generateUnboundSymbolsAsDependencies(irModule: IrModuleFragment, deserializer: IrDeserializer? = null) {
ExternalDependenciesGenerator( ExternalDependenciesGenerator(
irModule.descriptor, context.symbolTable, context.irBuiltIns, context.extensions.externalDeclarationOrigin, deserializer irModule.descriptor, context.symbolTable, context.irBuiltIns, context.extensions.externalDeclarationOrigin, deserializer
).generateUnboundSymbolsAsDependencies(irModule, context.bindingContext) ).generateUnboundSymbolsAsDependencies()
} }
private fun generateFiles(ktFiles: Collection<KtFile>): List<IrFile> { private fun generateFiles(ktFiles: Collection<KtFile>): List<IrFile> {
@@ -64,7 +64,7 @@ class IrLazyProperty(
override var backingField: IrField? by lazyVar { override var backingField: IrField? by lazyVar {
if (descriptor.hasBackingField(bindingContext)) { if (descriptor.hasBackingField(bindingContext)) {
stubGenerator.generateFieldStub(descriptor, bindingContext).apply { stubGenerator.generateFieldStub(descriptor).apply {
correspondingProperty = this@IrLazyProperty correspondingProperty = this@IrLazyProperty
} }
} else null } else null
@@ -94,4 +94,4 @@ class IrLazyProperty(
getter = getter?.run { transform(transformer, data) as IrSimpleFunction } getter = getter?.run { transform(transformer, data) as IrSimpleFunction }
setter = setter?.run { transform(transformer, data) as IrSimpleFunction } setter = setter?.run { transform(transformer, data) as IrSimpleFunction }
} }
} }
@@ -90,7 +90,7 @@ class DeclarationStubGenerator(
) )
} }
fun generateFieldStub(descriptor: PropertyDescriptor, bindingContext: BindingContext? = null): IrField { fun generateFieldStub(descriptor: PropertyDescriptor): IrField {
val referenced = symbolTable.referenceField(descriptor) val referenced = symbolTable.referenceField(descriptor)
if (referenced.isBound) { if (referenced.isBound) {
return referenced.owner return referenced.owner
@@ -19,58 +19,49 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.resolve.BindingContext
class ExternalDependenciesGenerator( class ExternalDependenciesGenerator(
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
val symbolTable: SymbolTable, val symbolTable: SymbolTable,
val irBuiltIns: IrBuiltIns, val irBuiltIns: IrBuiltIns,
externalDeclarationOrigin: ((DeclarationDescriptor) -> IrDeclarationOrigin)? = null, externalDeclarationOrigin: ((DeclarationDescriptor) -> IrDeclarationOrigin)? = null,
val deserializer: IrDeserializer? = null private val deserializer: IrDeserializer? = null
) { ) {
private val stubGenerator = DeclarationStubGenerator( private val stubGenerator = DeclarationStubGenerator(
moduleDescriptor, symbolTable, irBuiltIns.languageVersionSettings, externalDeclarationOrigin, deserializer moduleDescriptor, symbolTable, irBuiltIns.languageVersionSettings, externalDeclarationOrigin, deserializer
) )
fun generateUnboundSymbolsAsDependencies(irModule: IrModuleFragment, bindingContext: BindingContext? = null) { fun generateUnboundSymbolsAsDependencies() {
DependencyGenerationTask(irModule, bindingContext).run() stubGenerator.unboundSymbolGeneration = true
} ArrayList(symbolTable.unboundClasses).forEach {
stubGenerator.generateClassStub(it.descriptor)
private inner class DependencyGenerationTask(val irModule: IrModuleFragment, val bindingContext: BindingContext?) {
fun run() {
stubGenerator.unboundSymbolGeneration = true
ArrayList(symbolTable.unboundClasses).forEach {
stubGenerator.generateClassStub(it.descriptor)
}
ArrayList(symbolTable.unboundConstructors).forEach {
stubGenerator.generateConstructorStub(it.descriptor)
}
ArrayList(symbolTable.unboundEnumEntries).forEach {
stubGenerator.generateEnumEntryStub(it.descriptor)
}
ArrayList(symbolTable.unboundFields).forEach {
stubGenerator.generateFieldStub(it.descriptor, bindingContext)
}
ArrayList(symbolTable.unboundSimpleFunctions).forEach {
stubGenerator.generateFunctionStub(it.descriptor)
}
ArrayList(symbolTable.unboundTypeParameters).forEach {
stubGenerator.generateOrGetTypeParameterStub(it.descriptor)
}
deserializer?.declareForwardDeclarations()
if (deserializer != null) return
assert(symbolTable.unboundClasses.isEmpty())
assert(symbolTable.unboundConstructors.isEmpty())
assert(symbolTable.unboundEnumEntries.isEmpty())
assert(symbolTable.unboundFields.isEmpty())
assert(symbolTable.unboundSimpleFunctions.isEmpty())
assert(symbolTable.unboundTypeParameters.isEmpty())
} }
ArrayList(symbolTable.unboundConstructors).forEach {
stubGenerator.generateConstructorStub(it.descriptor)
}
ArrayList(symbolTable.unboundEnumEntries).forEach {
stubGenerator.generateEnumEntryStub(it.descriptor)
}
ArrayList(symbolTable.unboundFields).forEach {
stubGenerator.generateFieldStub(it.descriptor)
}
ArrayList(symbolTable.unboundSimpleFunctions).forEach {
stubGenerator.generateFunctionStub(it.descriptor)
}
ArrayList(symbolTable.unboundTypeParameters).forEach {
stubGenerator.generateOrGetTypeParameterStub(it.descriptor)
}
deserializer?.declareForwardDeclarations()
if (deserializer != null) return
assert(symbolTable.unboundClasses.isEmpty())
assert(symbolTable.unboundConstructors.isEmpty())
assert(symbolTable.unboundEnumEntries.isEmpty())
assert(symbolTable.unboundFields.isEmpty())
assert(symbolTable.unboundSimpleFunctions.isEmpty())
assert(symbolTable.unboundTypeParameters.isEmpty())
} }
} }