@@ -64,19 +64,43 @@ class ExtractSemanticDB private (phaseMode: ExtractSemanticDB.PhaseMode) extends
64
64
override def isCheckable : Boolean = false
65
65
66
66
override def runOn (units : List [CompilationUnit ])(using ctx : Context ): List [CompilationUnit ] = {
67
+ val sourceRoot = ctx.settings.sourceroot.value
67
68
val appendDiagnostics = phaseMode == ExtractSemanticDB .PhaseMode .AppendDiagnostics
68
69
if (appendDiagnostics)
69
70
val warnings = ctx.reporter.allWarnings.groupBy(w => w.pos.source)
70
- units.asJava.parallelStream().forEach { unit =>
71
- warnings.get(unit.source).foreach { ws =>
72
- ExtractSemanticDB .appendDiagnostics(unit.source, ws.map(_.toSemanticDiagnostic))
71
+ units.map { unit =>
72
+ val unitCtx = ctx.fresh.setCompilationUnit(unit).withRootImports
73
+ val outputDir =
74
+ ExtractSemanticDB .semanticdbPath(
75
+ unit.source,
76
+ ExtractSemanticDB .outputDirectory(using unitCtx),
77
+ sourceRoot
78
+ )
79
+ val source = unit.source
80
+ (outputDir, source)
81
+ }.asJava.parallelStream().forEach { case (out, source) =>
82
+ warnings.get(source).foreach { ws =>
83
+ ExtractSemanticDB .appendDiagnostics(source, ws.map(_.toSemanticDiagnostic), out)
73
84
}
74
85
}
75
86
else
76
87
units.foreach { unit =>
88
+ val outputDir =
89
+ ExtractSemanticDB .semanticdbPath(
90
+ unit.source,
91
+ ExtractSemanticDB .outputDirectory(using ctx.fresh.setCompilationUnit(unit).withRootImports),
92
+ sourceRoot
93
+ )
77
94
val extractor = ExtractSemanticDB .Extractor ()
78
95
extractor.extract(unit.tpdTree)
79
- ExtractSemanticDB .write(unit.source, extractor.occurrences.toList, extractor.symbolInfos.toList, extractor.synthetics.toList)
96
+ ExtractSemanticDB .write(
97
+ unit.source,
98
+ extractor.occurrences.toList,
99
+ extractor.symbolInfos.toList,
100
+ extractor.synthetics.toList,
101
+ outputDir,
102
+ sourceRoot
103
+ )
80
104
}
81
105
units
82
106
}
@@ -105,7 +129,8 @@ object ExtractSemanticDB:
105
129
.filterNot(_.isEmpty)
106
130
.map(Paths .get(_))
107
131
108
- private def outputDirectory (using Context ): AbstractFile = ctx.settings.outputDir.value
132
+ private def outputDirectory (using Context ): Path =
133
+ semanticdbTarget.getOrElse(ctx.settings.outputDir.value.jpath)
109
134
110
135
private def absolutePath (path : Path ): Path = path.toAbsolutePath.normalize
111
136
@@ -114,13 +139,14 @@ object ExtractSemanticDB:
114
139
occurrences : List [SymbolOccurrence ],
115
140
symbolInfos : List [SymbolInformation ],
116
141
synthetics : List [Synthetic ],
117
- )(using Context ): Unit =
118
- val outpath = semanticdbPath(source)
142
+ outpath : Path ,
143
+ sourceRoot : String
144
+ ): Unit =
119
145
Files .createDirectories(outpath.getParent())
120
146
val doc : TextDocument = TextDocument (
121
147
schema = Schema .SEMANTICDB4 ,
122
148
language = Language .SCALA ,
123
- uri = Tools .mkURIstring(Paths .get(relPath(source))),
149
+ uri = Tools .mkURIstring(Paths .get(relPath(source, sourceRoot ))),
124
150
text = " " ,
125
151
md5 = internal.MD5 .compute(String (source.content)),
126
152
symbols = symbolInfos,
@@ -139,15 +165,15 @@ object ExtractSemanticDB:
139
165
140
166
private def appendDiagnostics (
141
167
source : SourceFile ,
142
- diagnostics : Seq [Diagnostic ]
143
- )( using Context ) : Unit =
144
- val path = semanticdbPath(source)
168
+ diagnostics : Seq [Diagnostic ],
169
+ outpath : Path
170
+ ) : Unit =
145
171
Using .Manager { use =>
146
- val in = use(Files .newInputStream(path ))
172
+ val in = use(Files .newInputStream(outpath ))
147
173
val sin = internal.SemanticdbInputStream .newInstance(in)
148
174
val docs = TextDocuments .parseFrom(sin)
149
175
150
- val out = use(Files .newOutputStream(path ))
176
+ val out = use(Files .newOutputStream(outpath ))
151
177
val sout = internal.SemanticdbOutputStream .newInstance(out)
152
178
TextDocuments (docs.documents.map(_.withDiagnostics(diagnostics))).writeTo(sout)
153
179
sout.flush()
@@ -156,14 +182,14 @@ object ExtractSemanticDB:
156
182
case Success (_) => // success to update semanticdb, say nothing
157
183
end appendDiagnostics
158
184
159
- private def relPath (source : SourceFile )( using ctx : Context ) =
160
- SourceFile .relativePath(source, ctx.settings.sourceroot.value )
185
+ private def relPath (source : SourceFile , sourceRoot : String ) =
186
+ SourceFile .relativePath(source, sourceRoot )
161
187
162
- private def semanticdbPath (source : SourceFile )( using Context ) =
163
- absolutePath(semanticdbTarget.getOrElse(outputDirectory.jpath) )
188
+ private def semanticdbPath (source : SourceFile , base : Path , sourceRoot : String ) : Path =
189
+ absolutePath(base )
164
190
.resolve(" META-INF" )
165
191
.resolve(" semanticdb" )
166
- .resolve(relPath(source))
192
+ .resolve(relPath(source, sourceRoot ))
167
193
.resolveSibling(source.name + " .semanticdb" )
168
194
169
195
/** Extractor of symbol occurrences from trees */
0 commit comments