Skip to content

Commit 51edd7e

Browse files
committed
Write SemanticDB file
1 parent 48d9fd8 commit 51edd7e

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import StdNames.nme
1515
import util.SourcePosition
1616
import collection.mutable
1717
import java.lang.Character.{isJavaIdentifierPart, isJavaIdentifierStart}
18+
import java.nio.file.Paths
1819

1920
abstract class ExtractSemanticDB extends Phase {
2021
import ast.tpd._
@@ -33,6 +34,17 @@ abstract class ExtractSemanticDB extends Phase {
3334
val extract = Extractor()
3435
val unit = ctx.compilationUnit
3536
extract.traverse(unit.tpdTree)
37+
val targetRootSetting = ctx.settings.targetroot.value
38+
val targetRoot =
39+
if targetRootSetting.isEmpty then ctx.settings.outputDir.value.jpath
40+
else Paths.get(targetRootSetting)
41+
ExtractSemanticDB.write(
42+
unit.source.file.jpath,
43+
String(unit.source.content),
44+
Paths.get(ctx.settings.sourceroot.value),
45+
Paths.get(ctx.settings.targetroot.value),
46+
extract.occurrences.toList
47+
)
3648
}
3749

3850
class Extractor extends TreeTraverser {
@@ -126,5 +138,40 @@ abstract class ExtractSemanticDB extends Phase {
126138
}
127139

128140
object ExtractSemanticDB {
141+
import java.nio.file.Path
142+
import scala.collection.JavaConverters._
143+
import java.nio.file.Files
144+
129145
val name: String = "extractSemanticDB"
146+
147+
def write(
148+
source: Path,
149+
contents: String,
150+
sourceroot: Path,
151+
targetroot: Path,
152+
occurrences: Seq[SymbolOccurrence]
153+
): Unit =
154+
val relpath = sourceroot.relativize(source)
155+
val reluri = relpath.iterator().asScala.mkString("/")
156+
val outpath = targetroot
157+
.resolve("META-INF")
158+
.resolve("semanticdb")
159+
.resolve(relpath)
160+
.resolveSibling(source.getFileName().toString() + ".semanticdb")
161+
Files.createDirectories(outpath.getParent())
162+
val doc: TextDocument = TextDocument(
163+
schema = Schema.SEMANTICDB4,
164+
language = Language.SCALA,
165+
uri = reluri,
166+
md5 = MD5.compute(contents),
167+
occurrences = occurrences
168+
)
169+
val docs = TextDocuments(List(doc))
170+
val out = Files.newOutputStream(outpath)
171+
try
172+
val stream = SemanticdbOutputStream.newInstance(out)
173+
docs.writeTo(stream)
174+
stream.flush()
175+
finally
176+
out.close()
130177
}

0 commit comments

Comments
 (0)