From f58fe9bd72c9fdc00c4bf0ba076b8c6e731b7116 Mon Sep 17 00:00:00 2001 From: vmishenev Date: Mon, 9 Jan 2023 15:15:47 +0200 Subject: [PATCH] Refactor --- ...ronmentAndFacade.kt => AnalysisContext.kt} | 35 +++++++++------- .../dokka/analysis/KotlinAnalysis.kt | 42 ++++++++++++------- plugins/base/api/base.api | 1 - plugins/base/src/main/kotlin/DokkaBase.kt | 2 +- .../pages/samples/SamplesTransformer.kt | 8 ++-- 5 files changed, 53 insertions(+), 35 deletions(-) rename kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/{EnvironmentAndFacade.kt => AnalysisContext.kt} (76%) diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/EnvironmentAndFacade.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisContext.kt similarity index 76% rename from kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/EnvironmentAndFacade.kt rename to kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisContext.kt index 92bde8e8a8..ca83d02948 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/EnvironmentAndFacade.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/AnalysisContext.kt @@ -11,17 +11,17 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import java.io.Closeable import java.io.File -internal fun createEnvironmentAndFacade( +internal fun createAnalysisContext( logger: DokkaLogger, sourceSets: List, sourceSet: DokkaConfiguration.DokkaSourceSet, analysisConfiguration: DokkaAnalysisConfiguration -): EnvironmentAndFacade { +): AnalysisContext { val parentSourceSets = sourceSets.filter { it.sourceSetID in sourceSet.dependentSourceSets } val classpath = sourceSet.classpath + parentSourceSets.flatMap { it.classpath } val sources = sourceSet.sourceRoots + parentSourceSets.flatMap { it.sourceRoots } - return createEnvironmentAndFacade( + return createAnalysisContext( logger = logger, classpath = classpath, sourceRoots = sources, @@ -30,25 +30,30 @@ internal fun createEnvironmentAndFacade( ) } -internal fun createEnvironmentAndFacade( +internal fun createAnalysisContext( logger: DokkaLogger, classpath: List, sourceRoots: Set, sourceSet: DokkaConfiguration.DokkaSourceSet, analysisConfiguration: DokkaAnalysisConfiguration -) = AnalysisEnvironment(DokkaMessageCollector(logger), sourceSet.analysisPlatform).run { - if (analysisPlatform == Platform.jvm) { - configureJdkClasspathRoots() - } - addClasspath(classpath) - addSources(sourceRoots) +): AnalysisContext { + val analysisEnvironment = AnalysisEnvironment(DokkaMessageCollector(logger), sourceSet.analysisPlatform).apply { + if (analysisPlatform == Platform.jvm) { + configureJdkClasspathRoots() + } + addClasspath(classpath) + addSources(sourceRoots) - loadLanguageVersionSettings(sourceSet.languageVersion, sourceSet.apiVersion) + loadLanguageVersionSettings(sourceSet.languageVersion, sourceSet.apiVersion) + } - val environment = createCoreEnvironment() + val environment = analysisEnvironment.createCoreEnvironment() + val (facade, _) = analysisEnvironment.createResolutionFacade( + environment, + analysisConfiguration.ignoreCommonBuiltIns + ) - val (facade, _) = createResolutionFacade(environment, analysisConfiguration.ignoreCommonBuiltIns) - EnvironmentAndFacade(environment, facade, this) + return AnalysisContext(environment, facade, analysisEnvironment) } class DokkaMessageCollector(private val logger: DokkaLogger) : MessageCollector { @@ -69,7 +74,7 @@ class DokkaMessageCollector(private val logger: DokkaLogger) : MessageCollector } // It is not data class due to ill-defined equals -class EnvironmentAndFacade( +class AnalysisContext( environment: KotlinCoreEnvironment, facade: DokkaResolutionFacade, private val analysisEnvironment: AnalysisEnvironment diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/KotlinAnalysis.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/KotlinAnalysis.kt index d9fffc4d5f..6ce5c0e3ad 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/KotlinAnalysis.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/KotlinAnalysis.kt @@ -15,26 +15,29 @@ fun KotlinAnalysis( analysisConfiguration: DokkaAnalysisConfiguration = DokkaAnalysisConfiguration() ): KotlinAnalysis { val environments = sourceSets.associateWith { sourceSet -> - createEnvironmentAndFacade( + createAnalysisContext( logger = logger, sourceSets = sourceSets, sourceSet = sourceSet, analysisConfiguration = analysisConfiguration ) } - return KotlinAnalysisImpl(environments) + return ProjectKotlinAnalysis(environments) } -fun KotlinAnalysisForSamples( +/** + * [projectKotlinAnalysis] needs to be closed separately + */ +fun SamplesKotlinAnalysis( sourceSets: List, logger: DokkaLogger, - defaultKotlinAnalysis: KotlinAnalysis, + projectKotlinAnalysis: KotlinAnalysis, analysisConfiguration: DokkaAnalysisConfiguration = DokkaAnalysisConfiguration() ): KotlinAnalysis { val environments = sourceSets .filter { it.samples.isNotEmpty() } .associateWith { sourceSet -> - createEnvironmentAndFacade( + createAnalysisContext( logger = logger, classpath = sourceSet.classpath, sourceRoots = sourceSet.samples, @@ -43,7 +46,7 @@ fun KotlinAnalysisForSamples( ) } - return KotlinAnalysisImpl(environments, defaultKotlinAnalysis) + return SamplesKotlinAnalysis(environments, projectKotlinAnalysis) } class DokkaAnalysisConfiguration( @@ -59,30 +62,39 @@ class DokkaAnalysisConfiguration( ) fun KotlinAnalysis(context: DokkaContext): KotlinAnalysis = KotlinAnalysis(context.configuration.sourceSets, context.logger) -interface KotlinAnalysis : SourceSetDependent, Closeable { - override fun get(key: DokkaSourceSet): EnvironmentAndFacade - operator fun get(sourceSetID: DokkaSourceSetID): EnvironmentAndFacade +interface KotlinAnalysis : SourceSetDependent, Closeable { + override fun get(key: DokkaSourceSet): AnalysisContext + operator fun get(sourceSetID: DokkaSourceSetID): AnalysisContext } +internal class ProjectKotlinAnalysis( + environments: SourceSetDependent +) : KotlinAnalysisImpl(environments) + +internal class SamplesKotlinAnalysis( + sampleEnvironments: SourceSetDependent, + projectKotlinAnalysis: KotlinAnalysis +) : KotlinAnalysisImpl(sampleEnvironments, projectKotlinAnalysis) + /** * It does not close [defaultKotlinAnalysis]. */ -internal class KotlinAnalysisImpl( - private val environments: SourceSetDependent, +internal open class KotlinAnalysisImpl( + private val environments: SourceSetDependent, private val defaultKotlinAnalysis: KotlinAnalysis? = null -) : KotlinAnalysis, SourceSetDependent by environments { +) : KotlinAnalysis, SourceSetDependent by environments { - override fun get(key: DokkaSourceSet): EnvironmentAndFacade { + override fun get(key: DokkaSourceSet): AnalysisContext { return environments[key] ?: defaultKotlinAnalysis?.get(key) ?: throw IllegalStateException("Missing EnvironmentAndFacade for sourceSet $key") } - override fun get(sourceSetID: DokkaSourceSetID): EnvironmentAndFacade { + override fun get(sourceSetID: DokkaSourceSetID): AnalysisContext { return environments.entries.firstOrNull { (sourceSet, _) -> sourceSet.sourceSetID == sourceSetID }?.value ?: defaultKotlinAnalysis?.get(sourceSetID) ?: throw IllegalStateException("Missing EnvironmentAndFacade for sourceSetID $sourceSetID") } override fun close() { - environments.values.forEach(EnvironmentAndFacade::close) + environments.values.forEach(AnalysisContext::close) } } \ No newline at end of file diff --git a/plugins/base/api/base.api b/plugins/base/api/base.api index d55aa2bcf5..5ba421016b 100644 --- a/plugins/base/api/base.api +++ b/plugins/base/api/base.api @@ -13,7 +13,6 @@ public final class org/jetbrains/dokka/base/DokkaBase : org/jetbrains/dokka/plug public final fun getDefaultTabSortingStrategy ()Lorg/jetbrains/dokka/plugability/Extension; public final fun getDeprecatedDocumentableFilter ()Lorg/jetbrains/dokka/plugability/Extension; public final fun getDescriptorToDocumentableTranslator ()Lorg/jetbrains/dokka/plugability/Extension; - public final fun getDisposeKotlinAnalysisPostAction ()Lorg/jetbrains/dokka/plugability/Extension; public final fun getDocTagToContentConverter ()Lorg/jetbrains/dokka/plugability/Extension; public final fun getDocumentableMerger ()Lorg/jetbrains/dokka/plugability/Extension; public final fun getDocumentableToPageTranslator ()Lorg/jetbrains/dokka/plugability/Extension; diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt index f247ce67a6..206a9c4a01 100644 --- a/plugins/base/src/main/kotlin/DokkaBase.kt +++ b/plugins/base/src/main/kotlin/DokkaBase.kt @@ -283,7 +283,7 @@ class DokkaBase : DokkaPlugin() { externalClasslikesTranslator providing ::DefaultDescriptorToDocumentableTranslator } - val disposeKotlinAnalysisPostAction by extending { + internal val disposeKotlinAnalysisPostAction by extending { CoreExtensions.postActions with PostAction { this@DokkaBase.querySingle { kotlinAnalysis }.close() } } diff --git a/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt index cc252b45f3..f59624b825 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt @@ -34,9 +34,11 @@ abstract class SamplesTransformer(val context: DokkaContext) : PageTransformer { * Currently, all `ThreadLocal`s are in a compiler/IDE codebase. */ runBlocking(Dispatchers.Default) { - val analysis = KotlinAnalysisForSamples(sourceSets = context.configuration.sourceSets, + val analysis = SamplesKotlinAnalysis( + sourceSets = context.configuration.sourceSets, logger = context.logger, - defaultKotlinAnalysis = context.plugin().querySingle { kotlinAnalysis }) + projectKotlinAnalysis = context.plugin().querySingle { kotlinAnalysis } + ) analysis.use { input.transformContentPagesTree { page -> val samples = (page as? WithDocumentables)?.documentables?.flatMap { @@ -59,7 +61,7 @@ abstract class SamplesTransformer(val context: DokkaContext) : PageTransformer { contentPage: ContentPage, sourceSet: DokkaSourceSet, fqName: String, - analysis: Map + analysis: Map ): ContentNode { val facade = analysis[sourceSet]?.facade ?: return this.also { context.logger.warn("Cannot resolve facade for platform ${sourceSet.sourceSetID}") }