diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisEnvironment.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisEnvironment.kt index 2c4e2db45b..95a5067254 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisEnvironment.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisEnvironment.kt @@ -20,6 +20,7 @@ import org.jetbrains.dokka.Platform import org.jetbrains.dokka.analysis.resolve.* import org.jetbrains.kotlin.analyzer.* import org.jetbrains.kotlin.analyzer.common.CommonAnalysisParameters +import org.jetbrains.kotlin.analyzer.common.CommonDependenciesContainer import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory import org.jetbrains.kotlin.builtins.DefaultBuiltIns @@ -50,6 +51,7 @@ import org.jetbrains.kotlin.idea.klib.getCompatibilityInfo import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION +import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy import org.jetbrains.kotlin.library.resolveSingleFileKlib import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl @@ -184,7 +186,15 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl Platform.jvm -> JvmPlatforms.defaultJvmPlatform } - val nativeLibraries: Map = loadNativeLibraries() + val kotlinLibraries: Map = resolveKotlinLibraries() + + val commonDependencyContainer = if (analysisPlatform == Platform.common) DokkaKlibMetadataCommonDependencyContainer( + kotlinLibraries.values.toList(), + environment.configuration, + projectContext.storageManager + ) else null + + val extraModuleDependencies = kotlinLibraries.values.registerLibraries() + commonDependencyContainer?.moduleInfos.orEmpty() val library = object : LibraryModuleInfo { override val analyzerServices: PlatformDependentAnalyzerServices = @@ -194,7 +204,7 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl override fun dependencies(): List = listOf(this) override fun getLibraryRoots(): Collection = classpath .map { libraryFile -> libraryFile.absolutePath } - .filter { path -> path !in nativeLibraries } + .filter { path -> path !in kotlinLibraries } } val module = object : ModuleInfo { @@ -202,7 +212,8 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl analysisPlatform.analyzerServices() override val name: Name = Name.special("") override val platform: TargetPlatform = targetPlatform - override fun dependencies(): List = listOf(this, library) + nativeLibraries.values + override fun dependencies(): List = + listOf(this, library) + extraModuleDependencies } val sourcesScope = createSourceModuleSearchScope(environment.project, sourceFiles) @@ -211,10 +222,11 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl library -> ModuleContent(it, emptyList(), GlobalSearchScope.notScope(sourcesScope)) module -> ModuleContent(it, emptyList(), GlobalSearchScope.allScope(environment.project)) is DokkaKlibLibraryInfo -> { - if (it.libraryRoot in nativeLibraries) + if (it.libraryRoot in kotlinLibraries) ModuleContent(it, emptyList(), GlobalSearchScope.notScope(sourcesScope)) else null } + is CommonKlibModuleInfo -> ModuleContent(it, emptyList(), GlobalSearchScope.notScope(sourcesScope)) else -> null } ?: throw IllegalArgumentException("Unexpected module info") } @@ -240,7 +252,8 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl projectContext, module, modulesContent, - environment + environment, + commonDependencyContainer ) Platform.js -> createJsResolverForProject(projectContext, module, modulesContent) Platform.native -> createNativeResolverForProject(projectContext, module, modulesContent) @@ -282,13 +295,23 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl Platform.jvm -> JvmPlatformAnalyzerServices } - @OptIn(ExperimentalStdlibApi::class) - private fun loadNativeLibraries(): Map { - if (analysisPlatform != Platform.native && analysisPlatform != Platform.js) return emptyMap() - + fun Collection.registerLibraries(): List { + if (analysisPlatform != Platform.native && analysisPlatform != Platform.js) return emptyList() val dependencyResolver = DokkaKlibLibraryDependencyResolver() val analyzerServices = analysisPlatform.analyzerServices() + return map { kotlinLibrary -> + if (analysisPlatform == org.jetbrains.dokka.Platform.native) DokkaNativeKlibLibraryInfo( + kotlinLibrary, + analyzerServices, + dependencyResolver + ) + else DokkaJsKlibLibraryInfo(kotlinLibrary, analyzerServices, dependencyResolver) + } + } + + @OptIn(ExperimentalStdlibApi::class) + private fun resolveKotlinLibraries(): Map { return buildMap { classpath .filter { it.isDirectory || (it.extension == "jar" || it.extension == KLIB_FILE_EXTENSION) } @@ -303,12 +326,7 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl // exists, is KLIB, has compatible format put( libraryFile.absolutePath, - if (analysisPlatform == Platform.native) DokkaNativeKlibLibraryInfo( - kotlinLibrary, - analyzerServices, - dependencyResolver - ) - else DokkaJsKlibLibraryInfo(kotlinLibrary, analyzerServices, dependencyResolver) + kotlinLibrary ) } } catch (e: Throwable) { @@ -323,21 +341,14 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl projectContext: ProjectContext, module: ModuleInfo, modulesContent: (ModuleInfo) -> ModuleContent, - environment: KotlinCoreEnvironment + environment: KotlinCoreEnvironment, + dependencyContainer: CommonDependenciesContainer? ): ResolverForProject { return object : AbstractResolverForProject( "Dokka", projectContext, modules = module.dependencies() ) { - val dependencyContainer by lazy { - DokkaKlibMetadataDependencyContainer( - classpath.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }, - environment.configuration, - projectContext.storageManager - ) - } - override fun modulesContent(module: ModuleInfo): ModuleContent = modulesContent(module) override fun builtInsForModule(module: ModuleInfo): KotlinBuiltIns = DefaultBuiltIns.Instance diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/CommonKlibModuleInfo.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/CommonKlibModuleInfo.kt new file mode 100644 index 0000000000..22c86dd774 --- /dev/null +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/CommonKlibModuleInfo.kt @@ -0,0 +1,25 @@ +package org.jetbrains.dokka.analysis.resolve + +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices +import org.jetbrains.kotlin.library.KotlinLibrary +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.CommonPlatforms +import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices + +internal class CommonKlibModuleInfo( + override val name: Name, + val kotlinLibrary: KotlinLibrary, + private val dependOnModules: List +) : ModuleInfo { + override fun dependencies(): List = dependOnModules + + override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns = ModuleInfo.DependencyOnBuiltIns.LAST + + override val platform: TargetPlatform + get() = CommonPlatforms.defaultCommonPlatform + + override val analyzerServices: PlatformDependentAnalyzerServices + get() = CommonPlatformAnalyzerServices +} \ No newline at end of file diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/DokkaKlibMetadataDependencyContainer.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/DokkaKlibMetadataCommonDependencyContainer.kt similarity index 79% rename from kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/DokkaKlibMetadataDependencyContainer.kt rename to kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/DokkaKlibMetadataCommonDependencyContainer.kt index 5000098821..1a987a1f7c 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/DokkaKlibMetadataDependencyContainer.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/resolve/DokkaKlibMetadataCommonDependencyContainer.kt @@ -2,7 +2,6 @@ package org.jetbrains.dokka.analysis.resolve import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.common.CommonDependenciesContainer -import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.languageVersionSettings @@ -11,18 +10,13 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer import org.jetbrains.kotlin.library.metadata.parseModuleHeader -import org.jetbrains.kotlin.library.resolveSingleFileKlib import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.platform.CommonPlatforms -import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration -import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager @@ -31,35 +25,15 @@ import org.jetbrains.kotlin.utils.keysToMap /** * Adapted from org.jetbrains.kotlin.cli.metadata.KlibMetadataDependencyContainer */ -class DokkaKlibMetadataDependencyContainer( - private val klibFiles: List, +class DokkaKlibMetadataCommonDependencyContainer( + kotlinLibraries: List, private val configuration: CompilerConfiguration, private val storageManager: StorageManager ) : CommonDependenciesContainer { - private val kotlinLibraries = run { - klibFiles.map { resolveSingleFileKlib(File(it.absolutePath)) } - } - private val builtIns get() = DefaultBuiltIns.Instance - private class KlibModuleInfo( - override val name: Name, - val kotlinLibrary: KotlinLibrary, - private val dependOnModules: List - ) : ModuleInfo { - override fun dependencies(): List = dependOnModules - - override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns = ModuleInfo.DependencyOnBuiltIns.LAST - - override val platform: TargetPlatform - get() = CommonPlatforms.defaultCommonPlatform - - override val analyzerServices: PlatformDependentAnalyzerServices - get() = CommonPlatformAnalyzerServices - } - private val mutableDependenciesForAllModuleDescriptors = mutableListOf().apply { add(builtIns.builtInsModule) } @@ -82,10 +56,10 @@ class DokkaKlibMetadataDependencyContainer( mutableDependenciesForAllModuleDescriptors.addAll(resultValues) } - private val moduleInfosImpl: List = mutableListOf().apply { + private val moduleInfosImpl: List = mutableListOf().apply { addAll( moduleDescriptorsForKotlinLibraries.map { (kotlinLibrary, moduleDescriptor) -> - KlibModuleInfo(moduleDescriptor.name, kotlinLibrary, mutableDependenciesForAllModules) + CommonKlibModuleInfo(moduleDescriptor.name, kotlinLibrary, mutableDependenciesForAllModules) } ) mutableDependenciesForAllModules.addAll(this@apply) @@ -107,7 +81,7 @@ class DokkaKlibMetadataDependencyContainer( // initialized with the package fragment provider: packageFragmentProviderForModuleInfo(moduleInfo) - return moduleDescriptorsForKotlinLibraries.getValue((moduleInfo as KlibModuleInfo).kotlinLibrary) + return moduleDescriptorsForKotlinLibraries.getValue((moduleInfo as CommonKlibModuleInfo).kotlinLibrary) } override fun registerDependencyForAllModules( @@ -123,7 +97,7 @@ class DokkaKlibMetadataDependencyContainer( ): PackageFragmentProvider? { if (moduleInfo !in moduleInfos) return null - return packageFragmentProviderForKotlinLibrary((moduleInfo as KlibModuleInfo).kotlinLibrary) + return packageFragmentProviderForKotlinLibrary((moduleInfo as CommonKlibModuleInfo).kotlinLibrary) } private val klibMetadataModuleDescriptorFactory by lazy { @@ -156,7 +130,6 @@ class DokkaKlibMetadataDependencyContainer( libraryModuleDescriptor.initialize(it) } } - } private val MetadataFactories =