[FIR2IR] Don't use SymbolTable for storing IR package fragments
This is needed for getting rid of usages of descriptors API from symbol table in K2
This commit is contained in:
committed by
Space Team
parent
a45fe2d8a8
commit
36de30a694
+30
-14
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.fir.backend
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAMES
|
import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAMES
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||||
@@ -44,6 +41,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
|||||||
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrScriptImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrScriptImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.SCRIPT_K2_ORIGIN
|
import org.jetbrains.kotlin.ir.declarations.impl.SCRIPT_K2_ORIGIN
|
||||||
@@ -74,7 +72,12 @@ class Fir2IrDeclarationStorage(
|
|||||||
|
|
||||||
private val firProvider = session.firProvider
|
private val firProvider = session.firProvider
|
||||||
|
|
||||||
private val fragmentCache: ConcurrentHashMap<FqName, IrExternalPackageFragment> = ConcurrentHashMap()
|
private val fragmentCache: ConcurrentHashMap<FqName, ExternalPackageFragments> = ConcurrentHashMap()
|
||||||
|
|
||||||
|
private class ExternalPackageFragments(
|
||||||
|
val fragmentForDependencies: IrExternalPackageFragment,
|
||||||
|
val fragmentForPrecompiledBinaries: IrExternalPackageFragment
|
||||||
|
)
|
||||||
|
|
||||||
private val builtInsFragmentCache: ConcurrentHashMap<FqName, IrExternalPackageFragment> = ConcurrentHashMap()
|
private val builtInsFragmentCache: ConcurrentHashMap<FqName, IrExternalPackageFragment> = ConcurrentHashMap()
|
||||||
|
|
||||||
@@ -252,7 +255,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
|
|
||||||
private fun getIrBuiltInsPackageFragment(fqName: FqName): IrExternalPackageFragment {
|
private fun getIrBuiltInsPackageFragment(fqName: FqName): IrExternalPackageFragment {
|
||||||
return builtInsFragmentCache.getOrPut(fqName) {
|
return builtInsFragmentCache.getOrPut(fqName) {
|
||||||
symbolTable.declareExternalPackageFragment(FirBuiltInsPackageFragment(fqName, moduleDescriptor))
|
createExternalPackageFragment(FirBuiltInsPackageFragment(fqName, moduleDescriptor))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,15 +263,28 @@ class Fir2IrDeclarationStorage(
|
|||||||
fqName: FqName,
|
fqName: FqName,
|
||||||
firOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library
|
firOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library
|
||||||
): IrExternalPackageFragment {
|
): IrExternalPackageFragment {
|
||||||
return fragmentCache.getOrPut(fqName) {
|
val fragments = fragmentCache.getOrPut(fqName) {
|
||||||
// Make sure that external package fragments have a different module descriptor. The module descriptors are compared
|
ExternalPackageFragments(
|
||||||
// to determine if objects need regeneration because they are from different modules.
|
fragmentForDependencies = createExternalPackageFragment(fqName, FirModuleDescriptor(session, moduleDescriptor.builtIns)),
|
||||||
// But keep original module descriptor for the fragments coming from parts compiled on the previous incremental step
|
fragmentForPrecompiledBinaries = createExternalPackageFragment(fqName, moduleDescriptor)
|
||||||
val externalFragmentModuleDescriptor =
|
)
|
||||||
if (firOrigin == FirDeclarationOrigin.Precompiled) moduleDescriptor
|
|
||||||
else FirModuleDescriptor(session, moduleDescriptor.builtIns)
|
|
||||||
symbolTable.declareExternalPackageFragment(FirPackageFragmentDescriptor(fqName, externalFragmentModuleDescriptor))
|
|
||||||
}
|
}
|
||||||
|
// Make sure that external package fragments have a different module descriptor. The module descriptors are compared
|
||||||
|
// to determine if objects need regeneration because they are from different modules.
|
||||||
|
// But keep original module descriptor for the fragments coming from parts compiled on the previous incremental step
|
||||||
|
return when (firOrigin) {
|
||||||
|
FirDeclarationOrigin.Precompiled -> fragments.fragmentForPrecompiledBinaries
|
||||||
|
else -> fragments.fragmentForDependencies
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createExternalPackageFragment(fqName: FqName, moduleDescriptor: FirModuleDescriptor): IrExternalPackageFragment {
|
||||||
|
return createExternalPackageFragment(FirPackageFragmentDescriptor(fqName, moduleDescriptor))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createExternalPackageFragment(packageFragmentDescriptor: PackageFragmentDescriptor): IrExternalPackageFragment {
|
||||||
|
val symbol = IrExternalPackageFragmentSymbolImpl(packageFragmentDescriptor)
|
||||||
|
return IrExternalPackageFragmentImpl(symbol, packageFragmentDescriptor.fqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun findIrParent(
|
internal fun findIrParent(
|
||||||
|
|||||||
Reference in New Issue
Block a user