[FIR] Drop using of JavaSymbolProvider and OptionalAnnotationClassesProvider in FirCommonSessionFactory

Drop using of all Java stuff inside FirCommonSessionFactory

^KT-56063
This commit is contained in:
Ivan Kochurkin
2023-02-23 16:43:05 +01:00
committed by Space Team
parent 4be359ba02
commit d829f8b684
17 changed files with 83 additions and 62 deletions
@@ -219,14 +219,12 @@ fun <F> prepareCommonSessions(
FirCommonSessionFactory.createModuleBasedSession( FirCommonSessionFactory.createModuleBasedSession(
moduleData, moduleData,
sessionProvider, sessionProvider,
librariesScope,
projectEnvironment, projectEnvironment,
incrementalCompilationContext = createProviderAndScopeForIncrementalCompilation(moduleFiles), incrementalCompilationContext = createProviderAndScopeForIncrementalCompilation(moduleFiles),
extensionRegistrars, extensionRegistrars,
configuration.languageVersionSettings, configuration.languageVersionSettings,
lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER), lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
enumWhenTracker = configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER), enumWhenTracker = configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER),
needRegisterJavaElementFinder = true,
registerExtraComponents = {}, registerExtraComponents = {},
init = sessionConfigurator init = sessionConfigurator
) )
@@ -15,11 +15,13 @@ import org.jetbrains.kotlin.name.StandardClassIds
fun <D> FirBasedSymbol<out D>.isCompiledToJvmDefault( fun <D> FirBasedSymbol<out D>.isCompiledToJvmDefault(
session: FirSession, session: FirSession,
jvmDefaultMode: JvmDefaultMode jvmDefaultMode: JvmDefaultMode?
): Boolean where D : FirAnnotationContainer, D : FirDeclaration { ): Boolean where D : FirAnnotationContainer, D : FirDeclaration {
// TODO: Fix support for all cases // TODO: Fix support for all cases
if (getAnnotationByClassId(StandardClassIds.Annotations.JvmDefault, session) != null) return true if (getAnnotationByClassId(StandardClassIds.Annotations.JvmDefault, session) != null) return true
return jvmDefaultMode.forAllMethodsWithBody // jvmDefaultMode is null only on common metadata compilation
// TODO: it's unclear what should be returned here if jvmDefaultMode is null, KT-57079
return jvmDefaultMode?.forAllMethodsWithBody ?: true
} }
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.java.javaSymbolProvider
object FirJvmConflictsChecker : FirRegularClassChecker() { object FirJvmConflictsChecker : FirRegularClassChecker() {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
val javaSymbol = context.session.javaSymbolProvider.getClassLikeSymbolByClassId(declaration.classId) ?: return val javaSymbol = context.session.javaSymbolProvider?.getClassLikeSymbolByClassId(declaration.classId) ?: return
reporter.reportOn( reporter.reportOn(
declaration.source, FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION, listOf(declaration.symbol, javaSymbol), context declaration.source, FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION, listOf(declaration.symbol, javaSymbol), context
) )
@@ -47,7 +47,7 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
reporter.reportOn(source, FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET, "JvmDefault", context) reporter.reportOn(source, FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET, "JvmDefault", context)
return return
} }
!jvmDefaultMode.isEnabled -> { jvmDefaultMode?.isEnabled != true -> {
reporter.reportOn(source, FirJvmErrors.JVM_DEFAULT_IN_DECLARATION, "JvmDefault", context) reporter.reportOn(source, FirJvmErrors.JVM_DEFAULT_IN_DECLARATION, "JvmDefault", context)
return return
} }
@@ -66,7 +66,7 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
) )
return return
} }
!jvmDefaultMode.isEnabled -> { jvmDefaultMode?.isEnabled != true -> {
reporter.reportOn( reporter.reportOn(
source, source,
FirJvmErrors.JVM_DEFAULT_IN_DECLARATION, FirJvmErrors.JVM_DEFAULT_IN_DECLARATION,
@@ -107,12 +107,12 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
private fun checkNonJvmDefaultOverridesJavaDefault( private fun checkNonJvmDefaultOverridesJavaDefault(
defaultAnnotation: FirAnnotation?, defaultAnnotation: FirAnnotation?,
jvmDefaultMode: JvmDefaultMode, jvmDefaultMode: JvmDefaultMode?,
declaration: FirDeclaration, declaration: FirDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
if (defaultAnnotation != null || jvmDefaultMode.forAllMethodsWithBody) return if (defaultAnnotation != null || jvmDefaultMode?.forAllMethodsWithBody == true) return
val member = declaration as? FirSimpleFunction ?: return val member = declaration as? FirSimpleFunction ?: return
val containingDeclaration = context.findClosest<FirClassLikeDeclaration>() val containingDeclaration = context.findClosest<FirClassLikeDeclaration>()
@@ -123,7 +123,7 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
if (overriddenFunctions.any { it.getAnnotationByClassId(JVM_DEFAULT_CLASS_ID, context.session) != null }) { if (overriddenFunctions.any { it.getAnnotationByClassId(JVM_DEFAULT_CLASS_ID, context.session) != null }) {
reporter.reportOn(declaration.source, FirJvmErrors.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, context) reporter.reportOn(declaration.source, FirJvmErrors.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, context)
} else if (jvmDefaultMode.isEnabled) { } else if (jvmDefaultMode?.isEnabled != false) {
for (overriddenFunction in overriddenFunctions) { for (overriddenFunction in overriddenFunctions) {
val overriddenDeclarations = overriddenFunction.getOverriddenDeclarations() val overriddenDeclarations = overriddenFunction.getOverriddenDeclarations()
for (overriddenDeclaration in overriddenDeclarations) { for (overriddenDeclaration in overriddenDeclarations) {
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.jvm.ConeEquivalentCallConflictReso
import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
object NativeCallConflictResolverFactory : ConeCallConflictResolverFactory() { object DefaultCallConflictResolverFactory : ConeCallConflictResolverFactory() {
override fun create( override fun create(
typeSpecificityComparator: TypeSpecificityComparator, typeSpecificityComparator: TypeSpecificityComparator,
components: InferenceComponents, components: InferenceComponents,
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.fir.checkers.registerJsCheckers import org.jetbrains.kotlin.fir.checkers.registerJsCheckers
import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers
import org.jetbrains.kotlin.fir.checkers.registerNativeCheckers import org.jetbrains.kotlin.fir.checkers.registerNativeCheckers
@@ -18,11 +17,10 @@ import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.session.FirSessionFactoryHelper.registerDefaultExtraComponentsForModuleBased
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
@@ -48,7 +46,6 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
moduleDataProvider, moduleDataProvider,
languageVersionSettings, languageVersionSettings,
registerExtraComponents = { registerExtraComponents = {
it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver())
registerExtraComponents(it) registerExtraComponents(it)
}, },
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } },
@@ -63,24 +60,20 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
), ),
FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
OptionalAnnotationClassesProvider(session, moduleDataProvider, kotlinScopeProvider, packageAndMetadataPartProvider)
) )
} }
) )
} }
@OptIn(SessionConfiguration::class)
fun createModuleBasedSession( fun createModuleBasedSession(
moduleData: FirModuleData, moduleData: FirModuleData,
sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
javaSourcesScope: AbstractProjectFileSearchScope,
projectEnvironment: AbstractProjectEnvironment, projectEnvironment: AbstractProjectEnvironment,
incrementalCompilationContext: IncrementalCompilationContext?, incrementalCompilationContext: IncrementalCompilationContext?,
extensionRegistrars: List<FirExtensionRegistrar>, extensionRegistrars: List<FirExtensionRegistrar>,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null, lookupTracker: LookupTracker? = null,
enumWhenTracker: EnumWhenTracker? = null, enumWhenTracker: EnumWhenTracker? = null,
needRegisterJavaElementFinder: Boolean,
registerExtraComponents: ((FirSession) -> Unit) = {}, registerExtraComponents: ((FirSession) -> Unit) = {},
init: FirSessionConfigurator.() -> Unit = {} init: FirSessionConfigurator.() -> Unit = {}
): FirSession { ): FirSession {
@@ -93,8 +86,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
enumWhenTracker, enumWhenTracker,
init, init,
registerExtraComponents = { registerExtraComponents = {
it.registerCommonJavaComponents(projectEnvironment.getJavaModuleResolver()) it.registerDefaultExtraComponentsForModuleBased()
it.registerJavaSpecificResolveComponents()
registerExtraComponents(it) registerExtraComponents(it)
}, },
registerExtraCheckers = { registerExtraCheckers = {
@@ -105,7 +97,6 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } },
createProviders = { session, kotlinScopeProvider, symbolProvider, syntheticFunctionalInterfaceProvider, generatedSymbolsProvider, dependencies -> createProviders = { session, kotlinScopeProvider, symbolProvider, syntheticFunctionalInterfaceProvider, generatedSymbolsProvider, dependencies ->
var symbolProviderForBinariesFromIncrementalCompilation: MetadataSymbolProvider? = null var symbolProviderForBinariesFromIncrementalCompilation: MetadataSymbolProvider? = null
var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null
incrementalCompilationContext?.let { incrementalCompilationContext?.let {
val precompiledBinariesPackagePartProvider = it.precompiledBinariesPackagePartProvider val precompiledBinariesPackagePartProvider = it.precompiledBinariesPackagePartProvider
if (precompiledBinariesPackagePartProvider != null && it.precompiledBinariesFileScope != null) { if (precompiledBinariesPackagePartProvider != null && it.precompiledBinariesFileScope != null) {
@@ -119,36 +110,18 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
projectEnvironment.getKotlinClassFinder(it.precompiledBinariesFileScope) as KotlinMetadataFinder, projectEnvironment.getKotlinClassFinder(it.precompiledBinariesFileScope) as KotlinMetadataFinder,
defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled
) )
optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation =
OptionalAnnotationClassesProvider(
session,
moduleDataProvider,
kotlinScopeProvider,
precompiledBinariesPackagePartProvider,
defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled
)
} }
} }
val javaSymbolProvider =
JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope))
session.register(JavaSymbolProvider::class, javaSymbolProvider)
listOfNotNull( listOfNotNull(
symbolProvider, symbolProvider,
*(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()), *(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()),
symbolProviderForBinariesFromIncrementalCompilation, symbolProviderForBinariesFromIncrementalCompilation,
generatedSymbolsProvider, generatedSymbolsProvider,
syntheticFunctionalInterfaceProvider, syntheticFunctionalInterfaceProvider,
javaSymbolProvider,
*dependencies.toTypedArray(), *dependencies.toTypedArray(),
optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
) )
} }
).also { )
if (needRegisterJavaElementFinder) {
projectEnvironment.registerAsJavaElementFinder(it)
}
}
} }
} }
@@ -6,19 +6,18 @@
package org.jetbrains.kotlin.fir.session package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.BinaryModuleData
import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.checkers.registerNativeCheckers import org.jetbrains.kotlin.fir.checkers.registerNativeCheckers
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper import org.jetbrains.kotlin.fir.session.FirSessionFactoryHelper.registerDefaultExtraComponentsForModuleBased
import org.jetbrains.kotlin.fir.scopes.impl.FirEnumEntriesSupport
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -73,7 +72,7 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
null, null,
init, init,
registerExtraComponents = { session -> registerExtraComponents = { session ->
session.registerExtraComponentsForModuleBased() session.registerDefaultExtraComponentsForModuleBased()
registerExtraComponents(session) registerExtraComponents(session)
}, },
registerExtraCheckers = { it.registerNativeCheckers() }, registerExtraCheckers = { it.registerNativeCheckers() },
@@ -88,13 +87,4 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
} }
) )
} }
@OptIn(SessionConfiguration::class)
fun FirSession.registerExtraComponentsForModuleBased() {
register(FirVisibilityChecker::class, FirVisibilityChecker.Default)
register(ConeCallConflictResolverFactory::class, NativeCallConflictResolverFactory)
register(FirPlatformClassMapper::class, FirPlatformClassMapper.Default)
register(FirOverridesBackwardCompatibilityHelper::class, FirOverridesBackwardCompatibilityHelper.Default())
register(FirEnumEntriesSupport::class, FirEnumEntriesSupport(this))
}
} }
@@ -8,8 +8,12 @@ package org.jetbrains.kotlin.fir.session
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
import org.jetbrains.kotlin.fir.scopes.impl.FirEnumEntriesSupport
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.EnumWhenTracker
@@ -116,4 +120,13 @@ object FirSessionFactoryHelper {
)) ))
} }
} }
@OptIn(SessionConfiguration::class)
fun FirSession.registerDefaultExtraComponentsForModuleBased() {
register(FirVisibilityChecker::class, FirVisibilityChecker.Default)
register(ConeCallConflictResolverFactory::class, DefaultCallConflictResolverFactory)
register(FirPlatformClassMapper::class, FirPlatformClassMapper.Default)
register(FirOverridesBackwardCompatibilityHelper::class, FirOverridesBackwardCompatibilityHelper.Default())
register(FirEnumEntriesSupport::class, FirEnumEntriesSupport(this))
}
} }
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ThreadSafeMutableState import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.caches.createCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.deserialization.* import org.jetbrains.kotlin.fir.deserialization.*
import org.jetbrains.kotlin.fir.java.deserialization.KotlinBuiltins import org.jetbrains.kotlin.fir.java.deserialization.KotlinBuiltins
@@ -20,6 +23,7 @@ import org.jetbrains.kotlin.serialization.deserialization.KotlinMetadataFinder
import org.jetbrains.kotlin.serialization.deserialization.MetadataClassDataFinder import org.jetbrains.kotlin.serialization.deserialization.MetadataClassDataFinder
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.serialization.deserialization.readProto import org.jetbrains.kotlin.serialization.deserialization.readProto
import org.jetbrains.kotlin.utils.addToStdlib.runIf
@ThreadSafeMutableState @ThreadSafeMutableState
class MetadataSymbolProvider( class MetadataSymbolProvider(
@@ -38,6 +42,8 @@ class MetadataSymbolProvider(
private val constDeserializer = FirConstDeserializer(session, BuiltInSerializerProtocol) private val constDeserializer = FirConstDeserializer(session, BuiltInSerializerProtocol)
private val metadataTopLevelClassesInPackageCache = session.firCachesFactory.createCache(::findMetadataTopLevelClassesInPackage)
override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> { override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> {
return packageAndMetadataPartProvider.findMetadataPackageParts(packageFqName.asString()).mapNotNull { partName -> return packageAndMetadataPartProvider.findMetadataPackageParts(packageFqName.asString()).mapNotNull { partName ->
if (partName in KotlinBuiltins) return@mapNotNull null if (partName in KotlinBuiltins) return@mapNotNull null
@@ -62,7 +68,7 @@ class MetadataSymbolProvider(
override fun computePackageSetWithNonClassDeclarations() = packageAndMetadataPartProvider.computePackageSetWithNonClassDeclarations() override fun computePackageSetWithNonClassDeclarations() = packageAndMetadataPartProvider.computePackageSetWithNonClassDeclarations()
override fun knownTopLevelClassesInPackage(packageFqName: FqName) = kotlinClassFinder.findMetadataTopLevelClassesInPackage(packageFqName) override fun knownTopLevelClassesInPackage(packageFqName: FqName) = metadataTopLevelClassesInPackageCache.getValue(packageFqName)
override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? { override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? {
val classData = classDataFinder.findClassData(classId) ?: return null val classData = classDataFinder.findClassData(classId) ?: return null
@@ -78,5 +84,9 @@ class MetadataSymbolProvider(
override fun isNewPlaceForBodyGeneration(classProto: ProtoBuf.Class) = false override fun isNewPlaceForBodyGeneration(classProto: ProtoBuf.Class) = false
override fun getPackage(fqName: FqName) = null override fun getPackage(fqName: FqName) =
runIf(metadataTopLevelClassesInPackageCache.getValue(fqName)?.isNotEmpty() == true) { fqName }
private fun findMetadataTopLevelClassesInPackage(packageFqName: FqName) =
kotlinClassFinder.findMetadataTopLevelClassesInPackage(packageFqName)
} }
@@ -64,5 +64,5 @@ class JavaSymbolProvider(
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {} override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {}
} }
val FirSession.javaSymbolProvider: JavaSymbolProvider by FirSession.sessionComponentAccessor() val FirSession.javaSymbolProvider: JavaSymbolProvider? by FirSession.nullableSessionComponentAccessor()
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirSessionComponent
class FirJvmDefaultModeComponent(val jvmDefaultMode: JvmDefaultMode) : FirSessionComponent class FirJvmDefaultModeComponent(val jvmDefaultMode: JvmDefaultMode) : FirSessionComponent
private val FirSession.jvmDefaultModeComponent: FirJvmDefaultModeComponent by FirSession.sessionComponentAccessor() private val FirSession.jvmDefaultModeComponent: FirJvmDefaultModeComponent? by FirSession.nullableSessionComponentAccessor()
val FirSession.jvmDefaultModeState: JvmDefaultMode val FirSession.jvmDefaultModeState: JvmDefaultMode?
get() = jvmDefaultModeComponent.jvmDefaultMode get() = jvmDefaultModeComponent?.jvmDefaultMode
@@ -0,0 +1,5 @@
$TESTDATA_DIR$/optionalAnnotationsFromMetadata.kt
-d
$TEMP_DIR$
-cp
$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar
@@ -0,0 +1,10 @@
import kotlin.math.*
import kotlin.js.*
import kotlin.Result.Companion.success
fun f(x: Int) = abs(x)
@JsName("test")
public class C
fun g() = success(true)
@@ -0,0 +1 @@
OK
@@ -0,0 +1,7 @@
$TESTDATA_DIR$/optionalAnnotationsFromMetadata.kt
-d
$TEMP_DIR$
-cp
$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar
-language-version
2.0
@@ -0,0 +1,2 @@
warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features
OK
@@ -1629,6 +1629,16 @@ public class CliTestGenerated extends AbstractCliTest {
runTest("compiler/testData/cli/metadata/moduleNameWithFir.args"); runTest("compiler/testData/cli/metadata/moduleNameWithFir.args");
} }
@TestMetadata("optionalAnnotationsFromMetadata.args")
public void testOptionalAnnotationsFromMetadata() throws Exception {
runTest("compiler/testData/cli/metadata/optionalAnnotationsFromMetadata.args");
}
@TestMetadata("optionalAnnotationsFromMetadataWithFir.args")
public void testOptionalAnnotationsFromMetadataWithFir() throws Exception {
runTest("compiler/testData/cli/metadata/optionalAnnotationsFromMetadataWithFir.args");
}
@TestMetadata("optionalExpectationUsage.args") @TestMetadata("optionalExpectationUsage.args")
public void testOptionalExpectationUsage() throws Exception { public void testOptionalExpectationUsage() throws Exception {
runTest("compiler/testData/cli/metadata/optionalExpectationUsage.args"); runTest("compiler/testData/cli/metadata/optionalExpectationUsage.args");