[K/JS] Add miss LazyIr into klib Ir generation process
This commit is contained in:
@@ -14,6 +14,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.backend.common.lower.ExpectDeclarationRemover
|
import org.jetbrains.kotlin.backend.common.lower.ExpectDeclarationRemover
|
||||||
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideChecker
|
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideChecker
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinderImpl
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.ICData
|
import org.jetbrains.kotlin.backend.common.serialization.ICData
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.linkerissues.checkNoUnboundSymbols
|
import org.jetbrains.kotlin.backend.common.serialization.linkerissues.checkNoUnboundSymbols
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.ManglerChecker
|
import org.jetbrains.kotlin.backend.common.serialization.mangle.ManglerChecker
|
||||||
@@ -41,6 +42,7 @@ import org.jetbrains.kotlin.library.KotlinLibrary
|
|||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
||||||
|
import org.jetbrains.kotlin.psi2ir.generators.DeclarationStubGeneratorImpl
|
||||||
|
|
||||||
fun generateIrForKlibSerialization(
|
fun generateIrForKlibSerialization(
|
||||||
project: Project,
|
project: Project,
|
||||||
@@ -69,6 +71,12 @@ fun generateIrForKlibSerialization(
|
|||||||
val feContext = psi2IrContext.run {
|
val feContext = psi2IrContext.run {
|
||||||
JsIrLinker.JsFePluginContext(moduleDescriptor, symbolTable, typeTranslator, irBuiltIns)
|
JsIrLinker.JsFePluginContext(moduleDescriptor, symbolTable, typeTranslator, irBuiltIns)
|
||||||
}
|
}
|
||||||
|
val stubGenerator = DeclarationStubGeneratorImpl(
|
||||||
|
psi2IrContext.moduleDescriptor,
|
||||||
|
symbolTable,
|
||||||
|
irBuiltIns,
|
||||||
|
DescriptorByIdSignatureFinderImpl(psi2IrContext.moduleDescriptor, JsManglerDesc),
|
||||||
|
)
|
||||||
val irLinker = JsIrLinker(
|
val irLinker = JsIrLinker(
|
||||||
psi2IrContext.moduleDescriptor,
|
psi2IrContext.moduleDescriptor,
|
||||||
messageLogger,
|
messageLogger,
|
||||||
@@ -76,12 +84,20 @@ fun generateIrForKlibSerialization(
|
|||||||
psi2IrContext.symbolTable,
|
psi2IrContext.symbolTable,
|
||||||
partialLinkageEnabled = configuration[JSConfigurationKeys.PARTIAL_LINKAGE] ?: false,
|
partialLinkageEnabled = configuration[JSConfigurationKeys.PARTIAL_LINKAGE] ?: false,
|
||||||
feContext,
|
feContext,
|
||||||
ICData(icData.map { it.irData }, errorPolicy.allowErrors)
|
ICData(icData.map { it.irData }, errorPolicy.allowErrors),
|
||||||
|
stubGenerator = stubGenerator
|
||||||
)
|
)
|
||||||
|
|
||||||
sortedDependencies.map { irLinker.deserializeOnlyHeaderModule(getDescriptorByLibrary(it), it) }
|
sortedDependencies.map { irLinker.deserializeOnlyHeaderModule(getDescriptorByLibrary(it), it) }
|
||||||
|
|
||||||
val moduleFragment = psi2IrContext.generateModuleFragmentWithPlugins(project, files, irLinker, messageLogger, expectDescriptorToSymbol)
|
val moduleFragment = psi2IrContext.generateModuleFragmentWithPlugins(
|
||||||
|
project,
|
||||||
|
files,
|
||||||
|
irLinker,
|
||||||
|
messageLogger,
|
||||||
|
expectDescriptorToSymbol,
|
||||||
|
stubGenerator
|
||||||
|
)
|
||||||
|
|
||||||
if (verifySignatures) {
|
if (verifySignatures) {
|
||||||
moduleFragment.acceptVoid(ManglerChecker(JsManglerIr, Ir2DescriptorManglerAdapter(JsManglerDesc)))
|
moduleFragment.acceptVoid(ManglerChecker(JsManglerIr, Ir2DescriptorManglerAdapter(JsManglerDesc)))
|
||||||
|
|||||||
@@ -110,104 +110,6 @@ val CompilerConfiguration.resolverLogger: Logger
|
|||||||
|
|
||||||
class KotlinFileSerializedData(val metadata: ByteArray, val irData: SerializedIrFile)
|
class KotlinFileSerializedData(val metadata: ByteArray, val irData: SerializedIrFile)
|
||||||
|
|
||||||
fun generateIrForKlibSerialization(
|
|
||||||
project: Project,
|
|
||||||
files: List<KtFile>,
|
|
||||||
configuration: CompilerConfiguration,
|
|
||||||
analysisResult: AnalysisResult,
|
|
||||||
sortedDependencies: Collection<KotlinLibrary>,
|
|
||||||
icData: MutableList<KotlinFileSerializedData>,
|
|
||||||
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
|
||||||
irFactory: IrFactory,
|
|
||||||
verifySignatures: Boolean = true,
|
|
||||||
getDescriptorByLibrary: (KotlinLibrary) -> ModuleDescriptor,
|
|
||||||
): IrModuleFragment {
|
|
||||||
val incrementalDataProvider = configuration.get(JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER)
|
|
||||||
val errorPolicy = configuration.get(JSConfigurationKeys.ERROR_TOLERANCE_POLICY) ?: ErrorTolerancePolicy.DEFAULT
|
|
||||||
val messageLogger = configuration.irMessageLogger
|
|
||||||
val partialLinkageEnabled = configuration[JSConfigurationKeys.PARTIAL_LINKAGE] ?: false
|
|
||||||
|
|
||||||
val serializedIrFiles = mutableListOf<SerializedIrFile>()
|
|
||||||
|
|
||||||
if (incrementalDataProvider != null) {
|
|
||||||
val nonCompiledSources = files.map { VfsUtilCore.virtualToIoFile(it.virtualFile) to it }.toMap()
|
|
||||||
val compiledIrFiles = incrementalDataProvider.serializedIrFiles
|
|
||||||
val compiledMetaFiles = incrementalDataProvider.compiledPackageParts
|
|
||||||
|
|
||||||
assert(compiledIrFiles.size == compiledMetaFiles.size)
|
|
||||||
|
|
||||||
val storage = mutableListOf<KotlinFileSerializedData>()
|
|
||||||
|
|
||||||
for (f in compiledIrFiles.keys) {
|
|
||||||
if (f in nonCompiledSources) continue
|
|
||||||
|
|
||||||
val irData = compiledIrFiles[f] ?: error("No Ir Data found for file $f")
|
|
||||||
val metaFile = compiledMetaFiles[f] ?: error("No Meta Data found for file $f")
|
|
||||||
val irFile = with(irData) {
|
|
||||||
SerializedIrFile(fileData, String(fqn), f.path.replace('\\', '/'), types, signatures, strings, bodies, declarations, debugInfo)
|
|
||||||
}
|
|
||||||
storage.add(KotlinFileSerializedData(metaFile.metadata, irFile))
|
|
||||||
}
|
|
||||||
|
|
||||||
icData.addAll(storage)
|
|
||||||
serializedIrFiles.addAll(storage.map { it.irData })
|
|
||||||
}
|
|
||||||
|
|
||||||
val symbolTable = SymbolTable(IdSignatureDescriptor(JsManglerDesc), irFactory)
|
|
||||||
val psi2Ir = Psi2IrTranslator(
|
|
||||||
configuration.languageVersionSettings,
|
|
||||||
Psi2IrConfiguration(errorPolicy.allowErrors, partialLinkageEnabled),
|
|
||||||
messageLogger::checkNoUnboundSymbols
|
|
||||||
)
|
|
||||||
val psi2IrContext = psi2Ir.createGeneratorContext(analysisResult.moduleDescriptor, analysisResult.bindingContext, symbolTable)
|
|
||||||
val irBuiltIns = psi2IrContext.irBuiltIns
|
|
||||||
|
|
||||||
val feContext = psi2IrContext.run {
|
|
||||||
JsIrLinker.JsFePluginContext(moduleDescriptor, symbolTable, typeTranslator, irBuiltIns)
|
|
||||||
}
|
|
||||||
val stubGenerator = DeclarationStubGeneratorImpl(
|
|
||||||
psi2IrContext.moduleDescriptor,
|
|
||||||
symbolTable,
|
|
||||||
irBuiltIns,
|
|
||||||
DescriptorByIdSignatureFinderImpl(psi2IrContext.moduleDescriptor, JsManglerDesc),
|
|
||||||
)
|
|
||||||
val irLinker = JsIrLinker(
|
|
||||||
psi2IrContext.moduleDescriptor,
|
|
||||||
messageLogger,
|
|
||||||
psi2IrContext.irBuiltIns,
|
|
||||||
psi2IrContext.symbolTable,
|
|
||||||
partialLinkageEnabled = partialLinkageEnabled,
|
|
||||||
feContext,
|
|
||||||
ICData(serializedIrFiles, errorPolicy.allowErrors),
|
|
||||||
stubGenerator = stubGenerator
|
|
||||||
)
|
|
||||||
|
|
||||||
sortedDependencies.map { irLinker.deserializeOnlyHeaderModule(getDescriptorByLibrary(it), it) }
|
|
||||||
|
|
||||||
val moduleFragment = psi2IrContext.generateModuleFragmentWithPlugins(
|
|
||||||
project,
|
|
||||||
files,
|
|
||||||
irLinker,
|
|
||||||
messageLogger,
|
|
||||||
expectDescriptorToSymbol,
|
|
||||||
stubGenerator
|
|
||||||
)
|
|
||||||
|
|
||||||
if (verifySignatures) {
|
|
||||||
moduleFragment.acceptVoid(ManglerChecker(JsManglerIr, Ir2DescriptorManglerAdapter(JsManglerDesc)))
|
|
||||||
}
|
|
||||||
if (configuration.getBoolean(JSConfigurationKeys.FAKE_OVERRIDE_VALIDATOR)) {
|
|
||||||
val fakeOverrideChecker = FakeOverrideChecker(JsManglerIr, JsManglerDesc)
|
|
||||||
irLinker.modules.forEach { fakeOverrideChecker.check(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!configuration.expectActualLinker) {
|
|
||||||
moduleFragment.transform(ExpectDeclarationRemover(psi2IrContext.symbolTable, false), null)
|
|
||||||
}
|
|
||||||
|
|
||||||
return moduleFragment
|
|
||||||
}
|
|
||||||
|
|
||||||
fun generateKLib(
|
fun generateKLib(
|
||||||
depsDescriptors: ModulesStructure,
|
depsDescriptors: ModulesStructure,
|
||||||
outputKlibPath: String,
|
outputKlibPath: String,
|
||||||
|
|||||||
Reference in New Issue
Block a user