-
-
Notifications
You must be signed in to change notification settings - Fork 755
/
BindingContext.kt
67 lines (59 loc) · 2.52 KB
/
BindingContext.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
package io.gitlab.arturbosch.detekt.core
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
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.PlainTextMessageRenderer
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
internal fun generateBindingContext(
environment: KotlinCoreEnvironment,
classpath: List<String>,
files: List<KtFile>,
debugPrinter: (() -> String) -> Unit,
): BindingContext {
if (classpath.isEmpty()) {
return BindingContext.EMPTY
}
val messageCollector = DetektMessageCollector(
minSeverity = CompilerMessageSeverity.ERROR,
debugPrinter = debugPrinter,
)
val analyzer = AnalyzerWithCompilerReport(
messageCollector,
environment.configuration.languageVersionSettings,
false,
)
analyzer.analyzeAndReport(files) {
TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
environment.project,
files,
NoScopeRecordCliBindingTrace(),
environment.configuration,
environment::createPackagePartProvider,
::FileBasedDeclarationProviderFactory
)
}
return analyzer.analysisResult.bindingContext
}
internal class DetektMessageCollector(
private val minSeverity: CompilerMessageSeverity,
private val debugPrinter: (() -> String) -> Unit,
) : MessageCollector by MessageCollector.NONE {
private var messages = 0
override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) {
if (severity.ordinal <= minSeverity.ordinal) {
debugPrinter { DetektMessageRenderer.render(severity, message, location) }
messages++
}
}
}
private object DetektMessageRenderer : PlainTextMessageRenderer() {
override fun getName() = "detekt message renderer"
override fun getPath(location: CompilerMessageSourceLocation) = location.path
}