[LL FIR] make dependency from library on builtins invisible from outside

^KTIJ-23421

hide explicit builtins to reveal target platform dependencies.
Otherwise, `expect` class from builtin of e.g. JDK
would be found instead of actual dependency from Kotlin Runtime
This commit is contained in:
Anna Kozlova
2022-11-22 22:19:43 +01:00
committed by Space Team
parent 28ff475dd6
commit 43bd05f470
9 changed files with 91 additions and 18 deletions
@@ -76,6 +76,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated extend
runTest("analysis/analysis-api/testData/symbols/symbolByFqName/iterator.kt");
}
@Test
@TestMetadata("kclass.kt")
public void testKclass() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByFqName/kclass.kt");
}
@Test
@TestMetadata("listOf.kt")
public void testListOf() throws Exception {
@@ -76,6 +76,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated extends
runTest("analysis/analysis-api/testData/symbols/symbolByFqName/iterator.kt");
}
@Test
@TestMetadata("kclass.kt")
public void testKclass() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByFqName/kclass.kt");
}
@Test
@TestMetadata("listOf.kt")
public void testListOf() throws Exception {
@@ -76,6 +76,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByFqNameTestGenerated
runTest("analysis/analysis-api/testData/symbols/symbolByFqName/iterator.kt");
}
@Test
@TestMetadata("kclass.kt")
public void testKclass() throws Exception {
runTest("analysis/analysis-api/testData/symbols/symbolByFqName/kclass.kt");
}
@Test
@TestMetadata("listOf.kt")
public void testListOf() throws Exception {
@@ -0,0 +1,27 @@
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: kotlin/reflect/KClass
classKind: INTERFACE
companionObject: null
contextReceivers: []
isData: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: ABSTRACT
name: KClass
origin: LIBRARY
superTypes: [
kotlin/reflect/KDeclarationContainer
kotlin/reflect/KAnnotatedElement
kotlin/reflect/KClassifier
]
symbolKind: TOP_LEVEL
typeParameters: [
KtTypeParameterSymbol(T)
]
visibility: Public
getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol
deprecationStatus: null
@@ -0,0 +1 @@
class: kotlin/reflect/KClass
@@ -0,0 +1 @@
interface KClass<T : kotlin.Any> : kotlin.reflect.KDeclarationContainer, kotlin.reflect.KAnnotatedElement, kotlin.reflect.KClassifier
@@ -0,0 +1,26 @@
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: kotlin/reflect/KClass
classKind: INTERFACE
companionObject: null
contextReceivers: []
isData: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: ABSTRACT
name: KClass
origin: LIBRARY
superTypes: [
kotlin/reflect/KDeclarationContainer
kotlin/reflect/KAnnotatedElement
kotlin/reflect/KClassifier
]
symbolKind: TOP_LEVEL
typeParameters: [
KtTypeParameterSymbol(T)
]
visibility: Public
getContainingModule: KtLibraryModule "Library kotlin-stdlib"
deprecationStatus: null
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirDependentModuleProvidersByProviders
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirJavaFacadeForBinaries
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
@@ -21,19 +23,21 @@ import org.jetbrains.kotlin.load.java.createJavaClassFinder
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
internal object LLFirLibraryProviderFactory {
fun createLibraryProvidersForSingleBinaryModule(
fun createLibraryProvidersForScope(
session: LLFirSession,
moduleData: LLFirModuleData,
module: KtBinaryModule,
kotlinScopeProvider: FirKotlinScopeProvider,
project: Project,
builtinTypes: BuiltinTypes,
): List<FirSymbolProvider> {
scope: GlobalSearchScope,
builtinSymbolProvider: FirSymbolProvider,
): LLFirModuleWithDependenciesSymbolProvider {
val moduleDataProvider = SingleModuleDataProvider(moduleData)
val scope = module.contentScope
val packagePartProvider = project.createPackagePartProvider(scope)
return buildList {
add(
return LLFirModuleWithDependenciesSymbolProvider(
session,
LLFirDependentModuleProvidersByProviders(session, listOf(builtinSymbolProvider)),
providers = listOf(
JvmClassFileBasedSymbolProvider(
session,
moduleDataProvider,
@@ -41,10 +45,10 @@ internal object LLFirLibraryProviderFactory {
packagePartProvider,
VirtualFileFinderFactory.getInstance(project).create(scope),
LLFirJavaFacadeForBinaries(session, builtinTypes, project.createJavaClassFinder(scope), moduleDataProvider)
)
)
add(OptionalAnnotationClassesProvider(session, moduleDataProvider, kotlinScopeProvider, packagePartProvider))
}
),
OptionalAnnotationClassesProvider(session, moduleDataProvider, kotlinScopeProvider, packagePartProvider),
),
)
}
fun createLibraryProvidersForAllProjectLibraries(
@@ -59,20 +59,16 @@ class LLFirLibrarySessionFactory(
val kotlinScopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped)
register(FirKotlinScopeProvider::class, kotlinScopeProvider)
val providers = LLFirLibraryProviderFactory.createLibraryProvidersForSingleBinaryModule(
val symbolProvider = LLFirLibraryProviderFactory.createLibraryProvidersForScope(
this,
moduleData,
ktLibraryModule,
kotlinScopeProvider,
project,
builtinTypes
builtinTypes,
ktLibraryModule.contentScope,
builtinsSession.symbolProvider
)
val symbolProvider = createCompositeSymbolProvider(this) {
addAll(providers)
add(builtinsSession.symbolProvider)
}
register(LLFirFirClassByPsiClassProvider::class, LLFirFirClassByPsiClassProvider(this))
register(FirProvider::class, LLFirLibrarySessionProvider(symbolProvider))
register(FirSymbolProvider::class, symbolProvider)