[Interop] Support cache generation for CEnums

Force IR generation for all CEnums in case of cache generation
This commit is contained in:
Sergey Bogolepov
2020-01-30 17:11:51 +07:00
committed by Sergey Bogolepov
parent 44552393ad
commit 76ce5ebee3
2 changed files with 15 additions and 0 deletions
@@ -7,6 +7,7 @@ import org.jetbrains.kotlin.backend.common.phaser.*
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer
import org.jetbrains.kotlin.backend.konan.descriptors.isForwardDeclarationModule
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForInteropStubs
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
@@ -231,6 +232,9 @@ internal val psiToIrPhase = konanUnitPhase(
if (this.stdlibModule in modulesWithoutDCE) {
functionIrClassFactory.buildAllClasses()
}
modulesWithoutDCE
.filter(ModuleDescriptor::isFromInteropLibrary)
.forEach(irProviderForCEnums::buildAllEnumsFrom)
irModule = module
irModules = deserializer.modules.filterValues { llvmModuleSpecification.containsModule(it) }
@@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.konan.ir.interop
import org.jetbrains.kotlin.backend.konan.InteropBuiltIns
import org.jetbrains.kotlin.backend.konan.descriptors.findPackage
import org.jetbrains.kotlin.backend.konan.descriptors.getPackageFragments
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumByValueFunctionGenerator
@@ -13,6 +14,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumClassGenerator
import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumCompanionGenerator
import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumVarClassGenerator
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer
@@ -23,6 +25,7 @@ import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
/**
* For the most of descriptors that come from metadata-based interop libraries
@@ -70,6 +73,14 @@ internal class IrProviderForCEnumStubs(
return symbol.findCEnumDescriptor(interopBuiltIns) != null
}
fun buildAllEnumsFrom(interopModule: ModuleDescriptor) {
interopModule.getPackageFragments()
.flatMap { it.getMemberScope().getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) }
.filterIsInstance<ClassDescriptor>()
.filter { it.implementsCEnum(interopBuiltIns) }
.forEach { cEnumClassGenerator.findOrGenerateCEnum(it, irParentFor(it)) }
}
override fun getDeclaration(symbol: IrSymbol): IrDeclaration? {
if (symbol.isBound) return symbol.owner as IrDeclaration
if (!canHandleSymbol(symbol)) return null