K2: Add FirBinaryLibrarySymbolProvider to support binary lib symbol search Since all symbols of binary libraries are already resolved, theoretically we can access them. FirBinaryLibrarySymbolProvider is ian API to support the binary library symbol search without the module dependency.
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt index 5c860c2..b988948 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt
@@ -8,11 +8,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.ProjectScope -import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinCompositeDeclarationProvider -import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider -import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinFileBasedDeclarationProvider -import org.jetbrains.kotlin.analysis.api.platform.declarations.createAnnotationResolver -import org.jetbrains.kotlin.analysis.api.platform.declarations.createDeclarationProvider +import org.jetbrains.kotlin.analysis.api.platform.declarations.* import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinAnchorModuleProvider import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinProjectStructureProvider import org.jetbrains.kotlin.analysis.api.platform.utils.mergeInto @@ -22,13 +18,16 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirLazyDeclarationResolver import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.* -import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.* +import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirFirClassByPsiClassProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirIdeRegisteredPluginAnnotations +import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirLibrarySessionProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLDanglingFileDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLFirJavaSymbolProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLFirSwitchableExtensionDeclarationsSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLKotlinSourceSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.combined.LLCombinedJavaSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.combined.LLCombinedKotlinSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.combined.LLCombinedSyntheticFunctionSymbolProvider @@ -60,6 +59,8 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.session.* import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.psi.KtCodeFragment @@ -82,7 +83,10 @@ abstract fun createSourcesSession(module: KaSourceModule): LLFirSourcesSession abstract fun createLibrarySession(module: KaModule): LLFirLibraryOrLibrarySourceResolvableModuleSession - abstract fun createBinaryLibrarySession(module: KaLibraryModule): LLFirLibrarySession + abstract fun createBinaryLibrarySession( + module: KaLibraryModule, + findBinarySymbol: (ClassId) -> FirClassLikeSymbol<*>?, + ): LLFirLibrarySession private fun createLibraryProvidersForScope( session: LLFirSession,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt index 5dd4d46..51be031 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule -import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.moduleData import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.backend.jvm.FirJvmTypeMapper import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider @@ -22,6 +22,8 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.platform.has import org.jetbrains.kotlin.platform.jvm.JvmPlatform import org.jetbrains.kotlin.utils.addIfNotNull @@ -64,7 +66,10 @@ } } - override fun createBinaryLibrarySession(module: KaLibraryModule): LLFirLibrarySession { + override fun createBinaryLibrarySession( + module: KaLibraryModule, + findBinarySymbol: (ClassId) -> FirClassLikeSymbol<*>?, + ): LLFirLibrarySession { return doCreateBinaryLibrarySession(module) { registerPlatformSpecificComponentsIfAny(module) }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt index d1d1a86..78a686b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt
@@ -11,12 +11,14 @@ import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule -import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.session.FirJsSessionFactory.registerJsComponents +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId @OptIn(SessionConfiguration::class) internal class LLFirJsSessionFactory(project: Project) : LLFirAbstractSessionFactory(project) { @@ -56,7 +58,10 @@ } } - override fun createBinaryLibrarySession(module: KaLibraryModule): LLFirLibrarySession { + override fun createBinaryLibrarySession( + module: KaLibraryModule, + findBinarySymbol: (ClassId) -> FirClassLikeSymbol<*>?, + ): LLFirLibrarySession { return doCreateBinaryLibrarySession(module) { registerJsComponents(moduleKind = null) }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt index 595d9ed..c5b2442 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt
@@ -12,23 +12,26 @@ import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule -import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.moduleData +import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.nullableJavaSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLFirJavaSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.nullableJavaSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.backend.jvm.FirJvmTypeMapper import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider +import org.jetbrains.kotlin.fir.resolve.FirBinaryLibrarySymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider import org.jetbrains.kotlin.fir.session.registerJavaComponents +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.load.java.createJavaClassFinder +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.utils.addIfNotNull @@ -78,10 +81,14 @@ } } - override fun createBinaryLibrarySession(module: KaLibraryModule): LLFirLibrarySession { + override fun createBinaryLibrarySession( + module: KaLibraryModule, + findBinarySymbol: (ClassId) -> FirClassLikeSymbol<*>?, + ): LLFirLibrarySession { return doCreateBinaryLibrarySession(module) { registerJavaComponents(JavaModuleResolver.getInstance(project)) register(FirJvmTypeMapper::class, FirJvmTypeMapper(this)) + register(FirBinaryLibrarySymbolProvider::class, FirBinaryLibrarySymbolProvider(findBinarySymbol)) } }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt index aef325d..a39a6b2 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule -import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.moduleData import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider @@ -24,6 +24,8 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider import org.jetbrains.kotlin.fir.session.FirNativeSessionFactory.registerNativeComponents +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.utils.addIfNotNull @OptIn(SessionConfiguration::class) @@ -66,7 +68,10 @@ } } - override fun createBinaryLibrarySession(module: KaLibraryModule): LLFirLibrarySession { + override fun createBinaryLibrarySession( + module: KaLibraryModule, + findBinarySymbol: (ClassId) -> FirClassLikeSymbol<*>?, + ): LLFirLibrarySession { return doCreateBinaryLibrarySession(module) { registerNativeComponents() }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt index c2d8e66..aa0ebef 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionCache.kt
@@ -16,10 +16,13 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.cleanable.CleanableWeakValueReferenceCache import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.LLFirBuiltinsSessionFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled -import org.jetbrains.kotlin.fir.FirSourceModuleData import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSourceModuleData import org.jetbrains.kotlin.fir.PrivateSessionConstructor +import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.session.registerModuleData +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.JsPlatform import org.jetbrains.kotlin.platform.WasmPlatform @@ -65,7 +68,7 @@ if (module is KaLibraryModule && (preferBinary || module.isSdk)) { return getCachedSession(module, binaryCache) { - createPlatformAwareSessionFactory(module).createBinaryLibrarySession(module) + createPlatformAwareSessionFactory(module).createBinaryLibrarySession(module, ::findBinarySymbol) } } @@ -217,6 +220,13 @@ private val KaModule.supportsIsolatedSessionCreation: Boolean get() = this !is KaDanglingFileModule + private fun findBinarySymbol(classId: ClassId): FirClassLikeSymbol<*>? { + for (module in binaryCache.keys) { + binaryCache[module]?.symbolProvider?.getClassLikeSymbolByClassId(classId)?.let { return it } + } + return null + } + private fun createSession(module: KaModule): LLFirSession { val sessionFactory = createPlatformAwareSessionFactory(module) return when (module) { @@ -224,7 +234,7 @@ is KaBuiltinsModule -> sessionFactory.createLibrarySession(module) is KaLibraryModule -> { if (module.isSdk) { - sessionFactory.createBinaryLibrarySession(module) + sessionFactory.createBinaryLibrarySession(module, ::findBinarySymbol) } else { sessionFactory.createLibrarySession(module) }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirWasmSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirWasmSessionFactory.kt index 7177537..3fd081f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirWasmSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirWasmSessionFactory.kt
@@ -11,13 +11,15 @@ import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule -import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.LLModuleWithDependenciesSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.symbolProviders.factories.LLLibrarySymbolProviderFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getWasmTarget import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.session.FirWasmSessionFactory.registerWasmComponents +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId @OptIn(SessionConfiguration::class) internal class LLFirWasmSessionFactory(project: Project) : LLFirAbstractSessionFactory(project) { @@ -57,7 +59,10 @@ } } - override fun createBinaryLibrarySession(module: KaLibraryModule): LLFirLibrarySession { + override fun createBinaryLibrarySession( + module: KaLibraryModule, + findBinarySymbol: (ClassId) -> FirClassLikeSymbol<*>?, + ): LLFirLibrarySession { return doCreateBinaryLibrarySession(module) { registerWasmComponents() }
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt index 49b66f9..b4c6b79 100644 --- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt +++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.java.declarations.buildJavaExternalAnnotation import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter import org.jetbrains.kotlin.fir.java.enhancement.FirLazyJavaAnnotationList +import org.jetbrains.kotlin.fir.resolve.binaryLibrarySymbolProvider import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl @@ -283,7 +284,8 @@ ) { if (annotationArguments.isEmpty()) return - val annotationClassSymbol = lookupTag.toSymbol(session) + val annotationClassSymbol = + lookupTag.toSymbol(session) ?: session.binaryLibrarySymbolProvider?.getClassLikeSymbolByClassId(lookupTag.classId) val annotationConstructor = (annotationClassSymbol?.fir as FirRegularClass?) ?.declarations ?.firstIsInstanceOrNull<FirConstructor>()
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirBinaryLibrarySymbolProvider.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirBinaryLibrarySymbolProvider.kt new file mode 100644 index 0000000..d655f06 --- /dev/null +++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirBinaryLibrarySymbolProvider.kt
@@ -0,0 +1,21 @@ +/* + * Copyright 2010-2025 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.fir.resolve + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.name.ClassId + +/** + * Since all symbols of binary libraries are already resolved, theoretically we can access them. + * This is an API to support the binary library symbol search without the module dependencies. + */ +class FirBinaryLibrarySymbolProvider(private val findSymbol: (ClassId) -> FirClassLikeSymbol<*>?) : FirSessionComponent { + fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? = findSymbol(classId) +} + +val FirSession.binaryLibrarySymbolProvider: FirBinaryLibrarySymbolProvider? by FirSession.nullableSessionComponentAccessor() \ No newline at end of file