From b9e3d848a64155efbba0c3e4857000751add04a2 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Tue, 10 Oct 2023 13:17:40 +0200 Subject: [PATCH] [AA] Add `KotlinPackageProviderMerger` - In parallel to Kotlin declaration provider merging, we need a proper merging strategy for package providers as well, because resolve extensions may define additional package providers. - Additionally, other non-scope-based package providers may be added in the future, and the merger preserves these out of the box. ^KT-61791 --- .../analysis/api/fir/KtFirAnalysisSession.kt | 2 +- .../AnalysisApiBaseTestServiceRegistrar.kt | 1 + .../providers/KotlinPackageProvider.kt | 23 ++++++++++++++- .../impl/KotlinPackageProviderBase.kt | 6 ++-- .../impl/KotlinStaticPackageProvider.kt | 19 ++++++++++-- .../CompositeKotlinPackageProvider.kt | 27 +++++++++-------- .../EmptyKotlinPackageProvider.kt | 29 ++++++------------- .../StandaloneAnalysisAPISessionBuilder.kt | 1 + .../providers/LLFirKotlinSymbolProvider.kt | 3 ++ .../level/api/fir/providers/LLFirProvider.kt | 3 ++ .../api/fir/providers/LLFirProviderHelper.kt | 4 +-- .../StubBasedFirDeserializedSymbolProvider.kt | 2 +- 12 files changed, 75 insertions(+), 45 deletions(-) rename analysis/{low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure => analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders}/CompositeKotlinPackageProvider.kt (69%) rename analysis/{low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure => analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders}/EmptyKotlinPackageProvider.kt (68%) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index 8966f4189b7..2c037ab2ed7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir -import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.CompositeKotlinPackageProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.LLFirResolveExtensionTool import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.llResolveExtensionTool import org.jetbrains.kotlin.analysis.project.structure.KtModule @@ -29,6 +28,7 @@ import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.analysis.providers.impl.declarationProviders.CompositeKotlinDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.impl.packageProviders.CompositeKotlinPackageProvider import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.resolve.ScopeSession diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt index 6d57966d9e7..7079697c758 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt @@ -99,6 +99,7 @@ object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() { KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(project, allSourceKtFiles + ktFilesForBinaries) ) + registerService(KotlinPackageProviderMerger::class.java, KotlinStaticPackageProviderMerger(project)) registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java) } } diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinPackageProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinPackageProvider.kt index c22428f307c..61c46d00cce 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinPackageProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinPackageProvider.kt @@ -76,6 +76,27 @@ public abstract class KotlinPackageProviderFactory { public abstract fun createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider } +/** + * [KotlinPackageProviderMerger] allows merging multiple [KotlinPackageProvider]s into a more efficient package provider. + * + * Package providers should not be naively merged by combining scopes and calling [createPackageProvider], because there may be additional + * package providers which do not operate based on scopes (e.g. resolve extension package providers). + */ +public abstract class KotlinPackageProviderMerger { + /** + * Merges [packageProviders] if possible, creating a combined package provider that should be more efficient compared to invoking + * separate package providers. + */ + public abstract fun mergePackageProviders(packageProviders: List): KotlinPackageProvider + + public companion object { + public fun getInstance(project: Project): KotlinPackageProviderMerger = project.getService(KotlinPackageProviderMerger::class.java) + } +} + public fun Project.createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider = this.getService(KotlinPackageProviderFactory::class.java) - .createPackageProvider(searchScope) \ No newline at end of file + .createPackageProvider(searchScope) + +public fun Project.mergePackageProviders(packageProviders: List): KotlinPackageProvider = + KotlinPackageProviderMerger.getInstance(this).mergePackageProviders(packageProviders) diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinPackageProviderBase.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinPackageProviderBase.kt index f0eceea816b..ddf2e46436d 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinPackageProviderBase.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinPackageProviderBase.kt @@ -13,11 +13,9 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.jvm.isJvm - public abstract class KotlinPackageProviderBase( - protected val - project: Project, - protected val searchScope: GlobalSearchScope + protected val project: Project, + public val searchScope: GlobalSearchScope, ) : KotlinPackageProvider() { override fun doesPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt index e0a7dafc9ed..275bb6abdc2 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPackageProvider.kt @@ -9,13 +9,16 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory +import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderMerger +import org.jetbrains.kotlin.analysis.providers.createPackageProvider +import org.jetbrains.kotlin.analysis.providers.impl.packageProviders.CompositeKotlinPackageProvider import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile public class KotlinStaticPackageProvider( project: Project, - scope: GlobalSearchScope, + internal val scope: GlobalSearchScope, files: Collection ) : KotlinPackageProviderBase(project, scope) { private val kotlinPackageToSubPackages: Map> = run { @@ -48,4 +51,16 @@ public class KotlinStaticPackageProviderFactory( override fun createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider { return KotlinStaticPackageProvider(project, searchScope, files) } -} \ No newline at end of file +} + +public class KotlinStaticPackageProviderMerger(private val project: Project) : KotlinPackageProviderMerger() { + override fun mergePackageProviders(packageProviders: List): KotlinPackageProvider = + packageProviders.mergeSpecificProviders<_, KotlinStaticPackageProvider>(CompositeKotlinPackageProvider.factory) { providers -> + val combinedScope = GlobalSearchScope.union(providers.map { it.scope }) + project.createPackageProvider(combinedScope).apply { + check(this is KotlinStaticPackageProvider) { + "`${KotlinStaticPackageProvider::class.simpleName}` can only be merged into a combined package provider of the same type." + } + } + } +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/CompositeKotlinPackageProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders/CompositeKotlinPackageProvider.kt similarity index 69% rename from analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/CompositeKotlinPackageProvider.kt rename to analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders/CompositeKotlinPackageProvider.kt index b1a1bcd43d4..ea511ee506d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/CompositeKotlinPackageProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders/CompositeKotlinPackageProvider.kt @@ -3,18 +3,18 @@ * 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.analysis.low.level.api.fir.project.structure +package org.jetbrains.kotlin.analysis.providers.impl.packageProviders import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider +import org.jetbrains.kotlin.analysis.providers.impl.KotlinCompositeProvider +import org.jetbrains.kotlin.analysis.providers.impl.KotlinCompositeProviderFactory import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform -class CompositeKotlinPackageProvider -private constructor( - private val providers: List -) : KotlinPackageProvider() { - +public class CompositeKotlinPackageProvider private constructor( + override val providers: List, +) : KotlinPackageProvider(), KotlinCompositeProvider { override fun doesPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { return providers.any { it.doesPackageExist(packageFqName, platform) } } @@ -43,13 +43,12 @@ private constructor( return providers.flatMapTo(mutableSetOf()) { it.getPlatformSpecificSubPackagesFqNames(packageFqName, platform, nameFilter) } } - companion object { - fun create(providers: List): KotlinPackageProvider { - return when (providers.size) { - 0 -> EmptyKotlinPackageProvider - 1 -> providers.single() - else -> CompositeKotlinPackageProvider(providers) - } - } + public companion object { + public val factory: KotlinCompositeProviderFactory = KotlinCompositeProviderFactory( + EmptyKotlinPackageProvider, + ::CompositeKotlinPackageProvider, + ) + + public fun create(providers: List): KotlinPackageProvider = factory.create(providers) } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/EmptyKotlinPackageProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders/EmptyKotlinPackageProvider.kt similarity index 68% rename from analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/EmptyKotlinPackageProvider.kt rename to analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders/EmptyKotlinPackageProvider.kt index 3ec08a25b23..a1a8fdb0239 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/EmptyKotlinPackageProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/packageProviders/EmptyKotlinPackageProvider.kt @@ -3,7 +3,7 @@ * 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.analysis.low.level.api.fir.project.structure +package org.jetbrains.kotlin.analysis.providers.impl.packageProviders import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.name.FqName @@ -11,31 +11,20 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform internal object EmptyKotlinPackageProvider : KotlinPackageProvider() { - override fun doesPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { - return false - } + override fun doesPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean = false - override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean { - return false - } + override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean = false - override fun doesPlatformSpecificPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean { - return false - } + override fun doesPlatformSpecificPackageExist(packageFqName: FqName, platform: TargetPlatform): Boolean = false - override fun getSubPackageFqNames(packageFqName: FqName, platform: TargetPlatform, nameFilter: (Name) -> Boolean): Set { - return emptySet() - } + override fun getSubPackageFqNames(packageFqName: FqName, platform: TargetPlatform, nameFilter: (Name) -> Boolean): Set = + emptySet() - override fun getKotlinOnlySubPackagesFqNames(packageFqName: FqName, nameFilter: (Name) -> Boolean): Set { - return emptySet() - } + override fun getKotlinOnlySubPackagesFqNames(packageFqName: FqName, nameFilter: (Name) -> Boolean): Set = emptySet() override fun getPlatformSpecificSubPackagesFqNames( packageFqName: FqName, platform: TargetPlatform, - nameFilter: (Name) -> Boolean - ): Set { - return emptySet() - } + nameFilter: (Name) -> Boolean, + ): Set = emptySet() } diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt index bf45c6f365f..7a7d361798f 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt @@ -144,6 +144,7 @@ public class StandaloneAnalysisAPISessionBuilder( KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(project, sourceKtFiles + declarationProviderFactory.getAdditionalCreatedKtFiles()) ) + registerService(KotlinPackageProviderMerger::class.java, KotlinStaticPackageProviderMerger(this)) registerService( FirSealedClassInheritorsProcessorFactory::class.java, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt index d06af14c736..5380f77a4a5 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals @@ -28,6 +29,8 @@ import org.jetbrains.kotlin.psi.KtProperty internal abstract class LLFirKotlinSymbolProvider(session: FirSession) : FirSymbolProvider(session) { abstract val declarationProvider: KotlinDeclarationProvider + abstract val packageProvider: KotlinPackageProvider + /** * Whether the [LLFirKotlinSymbolProvider] should be able to find symbols defined in `kotlin` packages. This is usually not the case for * source sessions, unless the `allowKotlinPackage` flag is enabled in the session's `languageVersionSettings`. diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt index d36a336bcd0..b48840c57a2 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveCompone import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.SyntheticFirClassProvider import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.fir.NoMutableState import org.jetbrains.kotlin.fir.ThreadSafeMutableState import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration @@ -106,6 +107,8 @@ internal class LLFirProvider( internal inner class SymbolProvider : LLFirKotlinSymbolProvider(session) { override val declarationProvider: KotlinDeclarationProvider get() = providerHelper.declarationProvider + override val packageProvider: KotlinPackageProvider get() = providerHelper.packageProvider + override val symbolNamesProvider: FirSymbolNamesProvider get() = providerHelper.symbolNameCache override val allowKotlinPackage get() = providerHelper.allowKotlinPackage diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt index 1a754c717bb..a354b53fc7e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.getNotNullValueForNotNullContext import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirFileBuilder -import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.CompositeKotlinPackageProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.LLFirResolveExtensionTool import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.llResolveExtensionTool import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession @@ -17,6 +16,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNam import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.analysis.providers.impl.declarationProviders.CompositeKotlinDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.impl.packageProviders.CompositeKotlinPackageProvider import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.fir.caches.firCachesFactory @@ -63,7 +63,7 @@ internal class LLFirProviderHelper( ) ) - private val packageProvider = CompositeKotlinPackageProvider.create( + val packageProvider = CompositeKotlinPackageProvider.create( listOfNotNull( firSession.project.createPackageProvider(searchScope), extensionTool?.packageProvider, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt index 05da9ea9931..abd92020054 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt @@ -78,7 +78,7 @@ internal open class StubBasedFirDeserializedSymbolProvider( private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId) private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId) - private val packageProvider = project.createPackageProvider(scope) + final override val packageProvider = project.createPackageProvider(scope) private fun findAndDeserializeTypeAlias( classId: ClassId,