1
1
package com.sourcegraph.semanticdb_kotlinc
2
2
3
+ import java.io.PrintWriter
4
+ import java.io.Writer
3
5
import java.nio.file.Files
4
6
import java.nio.file.Path
5
7
import java.nio.file.Paths
6
8
import kotlin.contracts.ExperimentalContracts
7
9
import org.jetbrains.kotlin.analyzer.AnalysisResult
10
+ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
11
+ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
12
+ import org.jetbrains.kotlin.cli.common.messages.MessageCollector
13
+ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
14
+ import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
8
15
import org.jetbrains.kotlin.com.intellij.openapi.project.Project
16
+ import org.jetbrains.kotlin.config.CompilerConfiguration
9
17
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
10
18
import org.jetbrains.kotlin.psi.*
11
19
import org.jetbrains.kotlin.resolve.BindingTrace
12
20
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
21
+ import org.jetbrains.kotlin.utils.rethrow
22
+ import java.io.StringWriter
13
23
14
24
@ExperimentalContracts
15
25
class Analyzer (
@@ -19,24 +29,37 @@ class Analyzer(
19
29
) : AnalysisHandlerExtension {
20
30
private val globals = GlobalSymbolsCache ()
21
31
32
+ private val messageCollector =
33
+ CompilerConfiguration ()
34
+ .get(CLIConfigurationKeys .MESSAGE_COLLECTOR_KEY , PrintingMessageCollector (System .err, MessageRenderer .PLAIN_FULL_PATHS , false ))
35
+
22
36
override fun analysisCompleted (
23
37
project : Project ,
24
38
module : ModuleDescriptor ,
25
39
bindingTrace : BindingTrace ,
26
40
files : Collection <KtFile >
27
- ): AnalysisResult ? {
28
- val resolver = DescriptorResolver (bindingTrace).also { globals.resolver = it }
29
- for (file in files) {
30
- val lineMap = LineMap (project, file)
31
- val document = SemanticdbVisitor (sourceroot, resolver, file, lineMap, globals).build()
32
- semanticdbOutPathForFile(file)?.apply {
33
- Files .write(this , TextDocuments { addDocuments(document) }.toByteArray())
41
+ ): AnalysisResult ? =
42
+ try {
43
+ val resolver = DescriptorResolver (bindingTrace).also { globals.resolver = it }
44
+ for (file in files) {
45
+ try {
46
+ val lineMap = LineMap (project, file)
47
+ val document =
48
+ SemanticdbVisitor (sourceroot, resolver, file, lineMap, globals).build()
49
+ semanticdbOutPathForFile(file)?.apply {
50
+ Files .write(this , TextDocuments { addDocuments(document) }.toByteArray())
51
+ }
52
+ callback(document)
53
+ } catch (e: Exception ) {
54
+ handleException(e)
55
+ }
34
56
}
35
- callback(document)
36
- }
37
57
38
- return super .analysisCompleted(project, module, bindingTrace, files)
39
- }
58
+ super .analysisCompleted(project, module, bindingTrace, files)
59
+ } catch (e: Exception ) {
60
+ handleException(e)
61
+ super .analysisCompleted(project, module, bindingTrace, files)
62
+ }
40
63
41
64
private fun semanticdbOutPathForFile (file : KtFile ): Path ? {
42
65
val normalizedPath = Paths .get(file.virtualFilePath).normalize()
@@ -57,4 +80,25 @@ class Analyzer(
57
80
" given file is not under the sourceroot.\n\t Sourceroot: $sourceroot \n\t File path: ${file.virtualFilePath} \n\t Normalized file path: $normalizedPath " )
58
81
return null
59
82
}
83
+
84
+ private fun handleException (e : Exception ) {
85
+ val writer =
86
+ PrintWriter (
87
+ object : Writer () {
88
+ val buf = StringBuffer ()
89
+ override fun close () =
90
+ messageCollector.report(
91
+ CompilerMessageSeverity .EXCEPTION , buf.toString())
92
+ override fun flush () = Unit
93
+ override fun write (data : CharArray , offset : Int , len : Int ) {
94
+ buf.append(data, offset, len)
95
+ }
96
+ },
97
+ false )
98
+ writer.println (" Exception in semanticdb-kotlin compiler plugin:" )
99
+ e.printStackTrace(writer)
100
+ writer.println (
101
+ " Please report a bug to https://github.com/sourcegraph/lsif-kotlin with the stack trace above." )
102
+ writer.close()
103
+ }
60
104
}
0 commit comments