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