-
Notifications
You must be signed in to change notification settings - Fork 391
/
AnalysisContext.kt
102 lines (90 loc) · 4 KB
/
AnalysisContext.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
* Copyright 2014-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package org.jetbrains.dokka.analysis.kotlin.descriptors.compiler.configuration
import com.intellij.openapi.project.Project
import org.jetbrains.dokka.DokkaConfiguration
import org.jetbrains.dokka.InternalDokkaApi
import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.analysis.kotlin.descriptors.compiler.AnalysisContextCreator
import org.jetbrains.dokka.analysis.kotlin.descriptors.compiler.CompilerDescriptorAnalysisPlugin
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
import org.jetbrains.dokka.plugability.plugin
import org.jetbrains.dokka.plugability.querySingle
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import java.io.Closeable
import java.io.File
@OptIn(DokkaPluginApiPreview::class)
internal fun createAnalysisContext(
context: DokkaContext,
sourceSets: List<DokkaConfiguration.DokkaSourceSet>,
sourceSet: DokkaConfiguration.DokkaSourceSet,
analysisConfiguration: DokkaAnalysisConfiguration
): 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 createAnalysisContext(
context = context,
classpath = classpath,
sourceRoots = sources,
sourceSet = sourceSet,
analysisConfiguration = analysisConfiguration
)
}
@OptIn(DokkaPluginApiPreview::class)
internal fun createAnalysisContext(
context: DokkaContext,
classpath: List<File>,
sourceRoots: Set<File>,
sourceSet: DokkaConfiguration.DokkaSourceSet,
analysisConfiguration: DokkaAnalysisConfiguration
): AnalysisContext {
val analysisEnvironment = AnalysisEnvironment(
DokkaMessageCollector(context.logger),
sourceSet.analysisPlatform,
context.plugin<CompilerDescriptorAnalysisPlugin>().querySingle { mockApplicationHack },
context.plugin<CompilerDescriptorAnalysisPlugin>().querySingle { klibService },
).apply {
if (analysisPlatform == Platform.jvm) {
configureJdkClasspathRoots()
}
addClasspath(classpath)
addSources(sourceRoots)
loadLanguageVersionSettings(sourceSet.languageVersion, sourceSet.apiVersion)
}
val environment = analysisEnvironment.createCoreEnvironment()
return analysisEnvironment.createResolutionFacade(
environment,
context.plugin<CompilerDescriptorAnalysisPlugin>().querySingle<CompilerDescriptorAnalysisPlugin, AnalysisContextCreator> { analysisContextCreator },
analysisConfiguration.ignoreCommonBuiltIns
)
}
internal class DokkaMessageCollector(private val logger: DokkaLogger) : MessageCollector {
override fun clear() {
seenErrors = false
}
private var seenErrors = false
override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) {
if (severity == CompilerMessageSeverity.ERROR) {
seenErrors = true
}
logger.debug(MessageRenderer.PLAIN_FULL_PATHS.render(severity, message, location))
}
override fun hasErrors() = seenErrors
}
@InternalDokkaApi
public interface AnalysisContext : Closeable {
public val environment: KotlinCoreEnvironment
public val resolveSession: ResolveSession
public val moduleDescriptor: ModuleDescriptor
public val project: Project
}