Skip to content

Commit 51abd42

Browse files
committed
add progress tracking/cancellation to extractSemanticDB
1 parent 7ccdd40 commit 51abd42

File tree

1 file changed

+37
-28
lines changed

1 file changed

+37
-28
lines changed

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

+37-28
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import dotty.tools.dotc.{semanticdb => s}
2929
import dotty.tools.io.{AbstractFile, JarArchive}
3030
import dotty.tools.dotc.semanticdb.DiagnosticOps.*
3131
import scala.util.{Using, Failure, Success}
32+
import java.nio.file.Path
3233

3334

3435
/** Extract symbol references and uses to semanticdb files.
@@ -65,41 +66,49 @@ class ExtractSemanticDB private (phaseMode: ExtractSemanticDB.PhaseMode) extends
6566
val appendDiagnostics = phaseMode == ExtractSemanticDB.PhaseMode.AppendDiagnostics
6667
if (appendDiagnostics)
6768
val warnings = ctx.reporter.allWarnings.groupBy(w => w.pos.source)
68-
units.flatMap { unit =>
69-
warnings.get(unit.source).map { ws =>
70-
val unitCtx = ctx.fresh.setCompilationUnit(unit).withRootImports
71-
val outputDir =
72-
ExtractSemanticDB.semanticdbPath(
73-
unit.source,
74-
ExtractSemanticDB.semanticdbOutDir(using unitCtx),
75-
sourceRoot
76-
)
77-
(outputDir, ws.map(_.toSemanticDiagnostic))
69+
val buf = mutable.ListBuffer.empty[(Path, Seq[Diagnostic])]
70+
units.foreach { unit =>
71+
val unitCtx = ctx.fresh.setCompilationUnit(unit).withRootImports
72+
monitor(phaseName) {
73+
warnings.get(unit.source).foreach { ws =>
74+
val outputDir =
75+
ExtractSemanticDB.semanticdbPath(
76+
unit.source,
77+
ExtractSemanticDB.semanticdbOutDir(using unitCtx),
78+
sourceRoot
79+
)
80+
buf += ((outputDir, ws.map(_.toSemanticDiagnostic)))
81+
}
82+
}(using unitCtx)
83+
}
84+
cancellable {
85+
buf.toList.asJava.parallelStream().forEach { case (out, warnings) =>
86+
ExtractSemanticDB.appendDiagnostics(warnings, out)
7887
}
79-
}.asJava.parallelStream().forEach { case (out, warnings) =>
80-
ExtractSemanticDB.appendDiagnostics(warnings, out)
8188
}
8289
else
8390
val writeSemanticdbText = ctx.settings.semanticdbText.value
8491
units.foreach { unit =>
8592
val unitCtx = ctx.fresh.setCompilationUnit(unit).withRootImports
86-
val outputDir =
87-
ExtractSemanticDB.semanticdbPath(
93+
monitor(phaseName) {
94+
val outputDir =
95+
ExtractSemanticDB.semanticdbPath(
96+
unit.source,
97+
ExtractSemanticDB.semanticdbOutDir(using unitCtx),
98+
sourceRoot
99+
)
100+
val extractor = ExtractSemanticDB.Extractor()
101+
extractor.extract(unit.tpdTree)(using unitCtx)
102+
ExtractSemanticDB.write(
88103
unit.source,
89-
ExtractSemanticDB.semanticdbOutDir(using unitCtx),
90-
sourceRoot
104+
extractor.occurrences.toList,
105+
extractor.symbolInfos.toList,
106+
extractor.synthetics.toList,
107+
outputDir,
108+
sourceRoot,
109+
writeSemanticdbText
91110
)
92-
val extractor = ExtractSemanticDB.Extractor()
93-
extractor.extract(unit.tpdTree)(using unitCtx)
94-
ExtractSemanticDB.write(
95-
unit.source,
96-
extractor.occurrences.toList,
97-
extractor.symbolInfos.toList,
98-
extractor.synthetics.toList,
99-
outputDir,
100-
sourceRoot,
101-
writeSemanticdbText
102-
)
111+
}(using unitCtx)
103112
}
104113
units
105114
}
@@ -611,4 +620,4 @@ object ExtractSemanticDB:
611620
traverse(vparam.tpt)
612621
tparams.foreach(tp => traverse(tp.rhs))
613622
end Extractor
614-
end ExtractSemanticDB
623+
end ExtractSemanticDB

0 commit comments

Comments
 (0)