From 67f0d49ea1794f43371da492983fe89a43d44b4c Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Wed, 13 Feb 2019 20:35:47 +0300 Subject: [PATCH] [JS IR BE] Fix rebase --- .../kotlin/ir/backend/js/compiler.kt | 43 ++++++++----------- .../serialization/ir/IrModuleDeserializer.kt | 33 +------------- .../generators/tests/GenerateIrRuntime.kt | 11 +++-- 3 files changed, 27 insertions(+), 60 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index 64dc1a81b21..b995327de04 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -7,28 +7,27 @@ package org.jetbrains.kotlin.ir.backend.js import com.intellij.openapi.project.Project import org.jetbrains.kotlin.backend.common.LoggingContext +import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.functions.functionInterfacePackageFragmentProvider import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel -import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.ir.backend.js.lower.inline.replaceUnboundSymbols import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.* -import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.* -import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.CoroutineIntrinsicLowering +import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.JsKlibMetadataModuleDescriptor +import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.JsKlibMetadataSerializationUtil +import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.JsKlibMetadataVersion +import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.createJsKlibMetadataPackageFragmentProvider import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.util.ConstantValueGenerator import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.TypeTranslator -import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -37,10 +36,9 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.storage.LockBasedStorageManager -import java.io.File import org.jetbrains.kotlin.utils.DFS +import java.io.File -data class Result(val moduleDescriptor: ModuleDescriptor, val generatedCode: String, val moduleFragment: IrModuleFragment?) enum class ModuleType { TEST_RUNTIME, SECONDARY, @@ -83,25 +81,16 @@ fun compile( TopDownAnalyzerFacadeForJS.checkForErrors(files, analysisResult.bindingContext) + val irDependencies = dependencies.mapNotNull { it.moduleFragment } + val symbolTable = SymbolTable() - if (!isKlibCompilation) irDependencyModules.forEach { symbolTable.loadModule(it) } + if (!isKlibCompilation) irDependencies.forEach { symbolTable.loadModule(it) } val psi2IrTranslator = Psi2IrTranslator(configuration.languageVersionSettings) val psi2IrContext = psi2IrTranslator.createGeneratorContext(analysisResult.moduleDescriptor, analysisResult.bindingContext, symbolTable) val moduleFragment = psi2IrTranslator.generateModuleFragment(psi2IrContext, files) - val context = JsIrBackendContext( - analysisResult.moduleDescriptor, - psi2IrContext.irBuiltIns, - psi2IrContext.symbolTable, - moduleFragment, - configuration, - dependencies, - moduleType - ) - - if (isKlibCompilation) { val logggg = object : LoggingContext { override var inVerbosePhase: Boolean @@ -120,7 +109,7 @@ fun compile( val metadataVersion = configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsKlibMetadataVersion ?: JsKlibMetadataVersion.INSTANCE val moduleDescription = - JsKlibMetadataModuleDescriptor(moduleName, dependencies.map { it.name.asString() }, moduleFragment.descriptor) + JsKlibMetadataModuleDescriptor(moduleName, irDependencies.map { it.name.asString() }, moduleFragment.descriptor) val serializedData = serializer.serializeMetadata( psi2IrContext.bindingContext, moduleDescription, @@ -196,13 +185,15 @@ fun compile( ) val deserializedModuleFragment = deserializer.deserializeIrModule(md, moduleFile.readBytes(), true) - val context = JsIrBackendContext(md, irBuiltIns, st, deserializedModuleFragment, configuration, irDependencyModules) + val context = JsIrBackendContext(md, irBuiltIns, st, deserializedModuleFragment, configuration, dependencies, moduleType) deserializedModuleFragment.replaceUnboundSymbols(context) jsPhases.invokeToplevel(context.phaseConfig, context, deserializedModuleFragment) - return Result(md, context.jsProgram.toString(), null) + val jsProgram = deserializedModuleFragment.accept(IrModuleToJsTransformer(context), null) + + return CompiledModule(moduleName, jsProgram.toString(), null, moduleType, emptyList()) } else { // TODO: Split compilation into two steps: kt -> ir, ir -> js @@ -225,7 +216,6 @@ fun compile( ModuleType.TEST_RUNTIME -> { } } - } val context = JsIrBackendContext( analysisResult.moduleDescriptor, @@ -233,9 +223,12 @@ fun compile( psi2IrContext.symbolTable, moduleFragment, configuration, - irDependencyModules + dependencies, + moduleType ) + jsPhases.invokeToplevel(context.phaseConfig, context, moduleFragment) + val jsProgram = moduleFragment.accept(IrModuleToJsTransformer(context), null) return CompiledModule(moduleName, jsProgram.toString(), context.moduleFragmentCopy, moduleType, dependencies) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrModuleDeserializer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrModuleDeserializer.kt index 6363ff39495..9e5a680d6f1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrModuleDeserializer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrModuleDeserializer.kt @@ -1027,16 +1027,7 @@ abstract class IrModuleDeserializer( ) symbolTable.referenceProperty(descriptor, { property }) -/* - backingField?.descriptor?.let { - symbolTable.declareField(UNDEFINED_OFFSET, - UNDEFINED_OFFSET, - irrelevantOrigin, - it, - builtIns.unitType, - { symbol -> backingField }) - } -*/ + property.backingField = backingField property.getter = getter property.setter = setter @@ -1045,28 +1036,6 @@ abstract class IrModuleDeserializer( getter?.let { it.correspondingProperty = property } setter?.let { it.correspondingProperty = property } -// property.getter = -// if (proto.hasGetter()) deserializeIrFunction(proto.getter, start, end, origin, property) else null -// property.setter = -// if (proto.hasSetter()) deserializeIrFunction(proto.setter, start, end, origin, property) else null -// -//// property.getter?.let { (it.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(it) } -//// property.setter?.let { (it.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(it) } -// -// property.getter?.let { -// val descriptor = it.descriptor -// if (descriptor is WrappedSimpleFunctionDescriptor) descriptor.bind(it) -// symbolTable.declareSimpleFunction(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irrelevantOrigin, -// descriptor, { symbol -> it }) -// -// } -// property.setter?.let { -// val descriptor = it.descriptor -// if (descriptor is WrappedSimpleFunctionDescriptor) descriptor.bind(it) -// symbolTable.declareSimpleFunction(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irrelevantOrigin, -// descriptor, { symbol -> it }) -// } - return property } diff --git a/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateIrRuntime.kt b/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateIrRuntime.kt index 1805cc69a6a..5917c2b9086 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateIrRuntime.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/generators/tests/GenerateIrRuntime.kt @@ -12,15 +12,19 @@ import com.intellij.psi.PsiManager import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.ir.backend.js.ModuleType import org.jetbrains.kotlin.ir.backend.js.compile +import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.test.JsIrTestRuntime import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File fun buildConfiguration(environment: KotlinCoreEnvironment): CompilerConfiguration { val runtimeConfiguration = environment.configuration.copy() runtimeConfiguration.put(CommonConfigurationKeys.MODULE_NAME, "JS_IR_RUNTIME") + runtimeConfiguration.put(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN) runtimeConfiguration.languageVersionSettings = LanguageVersionSettingsImpl( LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE, @@ -58,13 +62,14 @@ fun main() { environment.project, (JsIrTestRuntime.FULL.sources).map(::createPsiFile), buildConfiguration(environment), - null, + emptyList(), true, emptyList(), - emptyList() + null, + ModuleType.TEST_RUNTIME ) - File(resultJs).writeText(result.generatedCode) + File(resultJs).writeText(result.generatedCode!!) // TODO("Write library into $stdKlibFile") } \ No newline at end of file