Save incremental data with KLIB compiler
This commit is contained in:
@@ -83,6 +83,8 @@ fun generateKLib(
|
||||
|
||||
val psi2IrContext = runAnalysisAndPreparePsi2Ir(depsDescriptors)
|
||||
|
||||
trySaveIncrementalData(psi2IrContext, configuration, files)
|
||||
|
||||
val moduleFragment = psi2IrContext.generateModuleFragment(files)
|
||||
|
||||
val moduleName = configuration[CommonConfigurationKeys.MODULE_NAME]!!
|
||||
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright 2010-2019 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.ir.backend.js
|
||||
|
||||
import com.intellij.openapi.vfs.VfsUtilCore
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys.INCREMENTAL_RESULTS_CONSUMER
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.BindingContextUtils
|
||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
|
||||
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
||||
|
||||
// todo: think if possible to unify with org.jetbrains.kotlin.js.facade.K2JSTranslator.trySaveIncrementalData
|
||||
internal fun trySaveIncrementalData(context: GeneratorContext, config: CompilerConfiguration, files: List<KtFile>) {
|
||||
val incrementalResults = config.get(INCREMENTAL_RESULTS_CONSUMER) ?: return
|
||||
|
||||
val bindingContext = context.bindingContext
|
||||
val moduleDescriptor = context.moduleDescriptor
|
||||
|
||||
val emptyByteArray = emptyArray<Byte>().toByteArray()
|
||||
|
||||
for (file in files) {
|
||||
val memberScope = file.declarations.map { getDescriptorForElement(bindingContext, it) }
|
||||
val packagePart = serializeScope(bindingContext, moduleDescriptor, file.packageFqName, memberScope, config)
|
||||
val ioFile = VfsUtilCore.virtualToIoFile(file.virtualFile)
|
||||
incrementalResults.processPackagePart(ioFile, packagePart.toByteArray(), binaryAst = emptyByteArray, inlineData = emptyByteArray)
|
||||
}
|
||||
|
||||
val settings = config.languageVersionSettings
|
||||
incrementalResults.processHeader(KotlinJavascriptSerializationUtil.serializeHeader(moduleDescriptor, null, settings).toByteArray())
|
||||
}
|
||||
|
||||
// copied from org.jetbrains.kotlin.js.translate.utils.BindingUtils.getDescriptorForElement
|
||||
fun getDescriptorForElement(
|
||||
context: BindingContext,
|
||||
element: PsiElement
|
||||
): DeclarationDescriptor = BindingContextUtils.getNotNull(context, BindingContext.DECLARATION_TO_DESCRIPTOR, element)
|
||||
|
||||
// copied from org.jetbrains.kotlin.js.facade.K2JSTranslator.serializeScope
|
||||
private fun serializeScope(
|
||||
bindingContext: BindingContext,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
packageName: FqName,
|
||||
scope: Collection<DeclarationDescriptor>,
|
||||
configuration: CompilerConfiguration
|
||||
): ProtoBuf.PackageFragment =
|
||||
KotlinJavascriptSerializationUtil.serializeDescriptors(
|
||||
bindingContext,
|
||||
moduleDescriptor,
|
||||
scope,
|
||||
packageName,
|
||||
configuration.languageVersionSettings,
|
||||
configuration.get(CommonConfigurationKeys.METADATA_VERSION) ?: JsMetadataVersion.INSTANCE
|
||||
)
|
||||
Reference in New Issue
Block a user