Skip to content

Commit d3b17d0

Browse files
committed
Refactor snippet compiler reporting
1 parent 68044a6 commit d3b17d0

File tree

8 files changed

+46
-37
lines changed

8 files changed

+46
-37
lines changed

scaladoc/src/dotty/tools/scaladoc/site/templates.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ case class TemplateFile(
7676
Nil,
7777
SnippetCompilerData.Position(configOffset - 1, 0)
7878
)
79-
ssctx.snippetChecker.checkSnippet(str, Some(compilerData), arg, lineOffset).collect {
79+
val sourceFile = dotty.tools.dotc.util.SourceFile(dotty.tools.io.AbstractFile.getFile(path.get), scala.io.Codec.UTF8)
80+
ssctx.snippetChecker.checkSnippet(str, Some(compilerData), arg, lineOffset, sourceFile).collect {
8081
case r: SnippetCompilationResult if !r.isSuccessful =>
81-
val msg = s"In static site (${file.getAbsolutePath}):\n${r.getSummary}"
82-
report.error(msg)(using ssctx.outerCtx)
82+
r.reportMessages()(using ssctx.outerCtx)
8383
r
8484
case r => r
8585
}

scaladoc/src/dotty/tools/scaladoc/snippets/SnippetChecker.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import dotty.tools.scaladoc.DocContext
55
import java.nio.file.Paths
66
import java.io.File
77

8+
import dotty.tools.dotc.util.SourceFile
89
import dotty.tools.io.AbstractFile
910
import dotty.tools.dotc.fromtasty.TastyFileUtil
1011
import dotty.tools.dotc.config.Settings._
@@ -39,7 +40,8 @@ class SnippetChecker(val args: Scaladoc.Args)(using cctx: CompilerContext):
3940
snippet: String,
4041
data: Option[SnippetCompilerData],
4142
arg: SnippetCompilerArg,
42-
lineOffset: SnippetChecker.LineOffset
43+
lineOffset: SnippetChecker.LineOffset,
44+
sourceFile: SourceFile
4345
): Option[SnippetCompilationResult] = {
4446
if arg.flag != SCFlags.NoCompile then
4547
val wrapped = WrappedSnippet(
@@ -50,7 +52,7 @@ class SnippetChecker(val args: Scaladoc.Args)(using cctx: CompilerContext):
5052
lineOffset + data.fold(0)(_.position.line) + constantLineOffset,
5153
data.fold(0)(_.position.column) + constantColumnOffset
5254
)
53-
val res = compiler.compile(wrapped, arg)
55+
val res = compiler.compile(wrapped, arg, sourceFile)
5456
Some(res)
5557
else None
5658
}

scaladoc/src/dotty/tools/scaladoc/snippets/SnippetCompilationResult.scala

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,28 @@ package dotty.tools.scaladoc
22
package snippets
33

44
import dotty.tools.io.{ AbstractFile }
5+
import dotty.tools.dotc.util.{ SourcePosition, SrcPos }
56

6-
case class Position(line: Int, column: Int, sourceLine: String, relativeLine: Int)
7+
case class Position(srcPos: SourcePosition, relativeLine: Int)
78

8-
case class SnippetCompilerMessage(position: Option[Position], message: String, level: MessageLevel):
9-
def getSummary: String =
10-
position.fold(s"${level.text}: ${message}") { pos =>
11-
s"At ${pos.line}:${pos.column}:\n${pos.sourceLine}${level.text}: ${message}"
12-
}
9+
case class SnippetCompilerMessage(position: Option[Position], message: String, level: MessageLevel)
1310

1411
case class SnippetCompilationResult(
1512
wrappedSnippet: WrappedSnippet,
1613
isSuccessful: Boolean,
1714
result: Option[AbstractFile],
1815
messages: Seq[SnippetCompilerMessage]
1916
):
20-
def getSummary: String = messages.map(_.getSummary).mkString("\n")
17+
def reportMessages()(using CompilerContext) = messages.foreach {
18+
case SnippetCompilerMessage(posOpt, msg, level) =>
19+
val pos: SrcPos = posOpt.fold(dotty.tools.dotc.util.NoSourcePosition)(_.srcPos)
20+
level match {
21+
case MessageLevel.Info => report.log(msg, pos)
22+
case MessageLevel.Warning => report.warning(msg, pos)
23+
case MessageLevel.Error => report.error(msg, pos)
24+
case MessageLevel.Debug => report.log(msg, pos)
25+
}
26+
}
2127

2228
enum MessageLevel(val text: String):
2329
case Info extends MessageLevel("Info")

scaladoc/src/dotty/tools/scaladoc/snippets/SnippetCompiler.scala

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import dotty.tools.dotc.{ Compiler, Run }
1515
import dotty.tools.io.{AbstractFile, VirtualDirectory}
1616
import dotty.tools.repl.AbstractFileClassLoader
1717
import dotty.tools.dotc.util.SourceFile
18+
import dotty.tools.dotc.util.Spans._
1819
import dotty.tools.dotc.interfaces.Diagnostic._
1920

2021
import scala.util.{ Try, Success, Failure }
@@ -49,17 +50,20 @@ class SnippetCompiler(
4950
private def nullableMessage(msgOrNull: String): String =
5051
if (msgOrNull == null) "" else msgOrNull
5152

52-
private def createReportMessage(wrappedSnippet: WrappedSnippet, arg: SnippetCompilerArg, diagnostics: Seq[Diagnostic]): Seq[SnippetCompilerMessage] = {
53+
private def createReportMessage(wrappedSnippet: WrappedSnippet, arg: SnippetCompilerArg, diagnostics: Seq[Diagnostic], sourceFile: SourceFile): Seq[SnippetCompilerMessage] = {
5354
val line = wrappedSnippet.outerLineOffset
5455
val column = wrappedSnippet.outerColumnOffset
5556
val innerLineOffset = wrappedSnippet.innerLineOffset
5657
val innerColumnOffset = wrappedSnippet.innerColumnOffset
5758
val infos = diagnostics.toSeq.sortBy(_.pos.source.path)
5859
val errorMessages = infos.map {
5960
case diagnostic if diagnostic.position.isPresent =>
60-
val diagPos = diagnostic.position.get
61+
val diagPos = diagnostic.position.get.asInstanceOf[dotty.tools.dotc.util.SourcePosition]
62+
val offsetFromLine = sourceFile.lineToOffset(diagPos.line + line - innerLineOffset - 1)
63+
val offsetFromColumn = diagPos.column + column - innerColumnOffset
64+
val span = Span(offsetFromLine + offsetFromColumn, offsetFromLine + offsetFromColumn)
6165
val pos = Some(
62-
Position(diagPos.line + line - innerLineOffset, diagPos.column + column - innerColumnOffset, diagPos.lineContent, diagPos.line)
66+
Position(dotty.tools.dotc.util.SourcePosition(sourceFile, span), diagPos.line)
6367
)
6468
val dmsg = Try(diagnostic.message) match {
6569
case Success(msg) => msg
@@ -75,7 +79,7 @@ class SnippetCompiler(
7579
errorMessages
7680
}
7781

78-
private def additionalMessages(wrappedSnippet: WrappedSnippet, arg: SnippetCompilerArg, context: Context): Seq[SnippetCompilerMessage] = {
82+
private def additionalMessages(wrappedSnippet: WrappedSnippet, arg: SnippetCompilerArg, sourceFile: SourceFile, context: Context): Seq[SnippetCompilerMessage] = {
7983
Option.when(arg.flag == SCFlags.Fail && !context.reporter.hasErrors)(
8084
SnippetCompilerMessage(None, "Snippet should not compile but compiled succesfully", MessageLevel.Error)
8185
).toList
@@ -88,7 +92,8 @@ class SnippetCompiler(
8892

8993
def compile(
9094
wrappedSnippet: WrappedSnippet,
91-
arg: SnippetCompilerArg
95+
arg: SnippetCompilerArg,
96+
sourceFile: SourceFile
9297
): SnippetCompilationResult = {
9398
val context = SnippetDriver.currentCtx.fresh
9499
.setSetting(
@@ -100,8 +105,8 @@ class SnippetCompiler(
100105
run.compileFromStrings(List(wrappedSnippet.snippet))
101106

102107
val messages =
103-
createReportMessage(wrappedSnippet, arg, context.reporter.pendingMessages(using context)) ++
104-
additionalMessages(wrappedSnippet, arg, context)
108+
createReportMessage(wrappedSnippet, arg, context.reporter.pendingMessages(using context), sourceFile) ++
109+
additionalMessages(wrappedSnippet, arg, sourceFile, context)
105110

106111
val t = Option.when(!context.reporter.hasErrors)(target)
107112
SnippetCompilationResult(wrappedSnippet, isSuccessful(arg, context), t, messages)

scaladoc/src/dotty/tools/scaladoc/tasty/comments/Comments.scala

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,12 @@ abstract class MarkupConversion[T](val repr: Repr)(using dctx: DocContext) {
129129
val path = s.source.map(_.path)
130130
val pathBasedArg = dctx.snippetCompilerArgs.get(path)
131131
val data = SnippetCompilerDataCollector[qctx.type](qctx).getSnippetCompilerData(s, s)
132+
val sourceFile: dotty.tools.dotc.util.SourceFile = s.pos.fold(dotty.tools.dotc.util.NoSource)(_.sourceFile.asInstanceOf[dotty.tools.dotc.util.SourceFile])
132133
(str: String, lineOffset: SnippetChecker.LineOffset, argOverride: Option[SCFlags]) => {
133134
val arg = argOverride.fold(pathBasedArg)(pathBasedArg.overrideFlag(_))
134-
135-
snippetChecker.checkSnippet(str, Some(data), arg, lineOffset).collect {
136-
case r: SnippetCompilationResult if !r.isSuccessful =>
137-
val msg = s"In member ${s.name} (${s.dri.location}):\n${r.getSummary}"
138-
report.error(msg)(using dctx.compilerContext)
139-
r
140-
case r => r
141-
}
135+
val res = snippetChecker.checkSnippet(str, Some(data), arg, lineOffset, sourceFile)
136+
res.filter(r => !r.isSuccessful).foreach(_.reportMessages()(using compilerContext))
137+
res
142138
}
143139
}
144140

scaladoc/src/dotty/tools/scaladoc/tasty/comments/markdown/SnippetRenderer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ object SnippetRenderer:
125125
else
126126
val content = messages
127127
.map { msg =>
128-
s"""<span class="${compileMessageCSSClass(msg)}">${msg.getSummary}</span>"""
128+
s"""<span class="${compileMessageCSSClass(msg)}">${msg.message}</span>"""
129129
}
130130
.mkString("<br>")
131131
s"""<hr>$content"""

scaladoc/test/dotty/tools/scaladoc/snippets/SnippetCompilerTest.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ class SnippetCompilerTest {
1818
0
1919
)
2020

21-
def runTest(str: String) = compiler.compile(wrapFn(str), SnippetCompilerArg(SCFlags.Compile))
21+
def runTest(str: String) = compiler.compile(wrapFn(str), SnippetCompilerArg(SCFlags.Compile), dotty.tools.dotc.util.SourceFile.virtual("test", str))
2222

2323
private def assertSuccessfulCompilation(res: SnippetCompilationResult): Unit = res match {
24-
case r @ SnippetCompilationResult(_, isSuccessful, _, messages) => assert(isSuccessful, r.getSummary)
24+
case r @ SnippetCompilationResult(_, isSuccessful, _, messages) => assert(isSuccessful, r.messages.map(_.message).mkString("\n"))
2525
}
2626

2727
private def assertFailedCompilation(res: SnippetCompilationResult): Unit = res match {
28-
case r @ SnippetCompilationResult(_, isSuccessful, _, messages) => assert(!isSuccessful, r.getSummary)
28+
case r @ SnippetCompilationResult(_, isSuccessful, _, messages) => assert(!isSuccessful, r.messages.map(_.message).mkString("\n"))
2929
}
3030

3131
def assertSuccessfulCompilation(str: String): Unit = assertSuccessfulCompilation(runTest(str))
@@ -36,7 +36,7 @@ class SnippetCompilerTest {
3636

3737
def assertMessageLevelPresent(res: SnippetCompilationResult, level: MessageLevel): Unit = res match {
3838
case r @ SnippetCompilationResult(_, isSuccessful, _, messages) => assertTrue(
39-
s"Expected message with level: ${level.text}. Got result ${r.getSummary}",
39+
s"Expected message with level: ${level.text}. Got result ${r.messages.map(_.message).mkString("\n")}",
4040
messages.exists(_.level == level)
4141
)
4242
}

scaladoc/test/dotty/tools/scaladoc/snippets/SnippetsE2eTest.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,19 @@ abstract class SnippetsE2eTest(testName: String, flag: SCFlags) extends Scaladoc
7878
case m @ SnippetCompilerMessage(Some(_), _, _) => m
7979
}.toList
8080
def isSamePosition(msg: Message, cmsg: SnippetCompilerMessage): Boolean =
81-
cmsg.level == msg.level && cmsg.position.get.line == msg.offset.line && cmsg.position.get.column == msg.offset.column
81+
cmsg.level == msg.level && (cmsg.position.get.srcPos.line + 1) == msg.offset.line && cmsg.position.get.srcPos.column == msg.offset.column
8282

8383
def checkRelativeLines(msg: Message, cmsg: SnippetCompilerMessage): Seq[String] =
8484
val pos = cmsg.position.get
85-
if !(pos.relativeLine == pos.line - ws.outerLineOffset + ws.innerLineOffset) then Seq(
86-
s"Expected ${msg.level.text} message at relative line: ${pos.line - ws.outerLineOffset + ws.innerLineOffset} " +
85+
if !(pos.relativeLine == pos.srcPos.line + ws.innerLineOffset - ws.outerLineOffset + 1) then Seq(
86+
s"Expected ${msg.level.text} message at relative line: ${pos.srcPos.line + ws.innerLineOffset - ws.outerLineOffset + 1} " +
8787
s"but found at ${pos.relativeLine}"
8888
) else Nil
8989

9090
val mResult = compilationMessagesWithPos.flatMap { cmsg =>
9191
messages
9292
.find(msg => isSamePosition(msg, cmsg))
93-
.fold(Seq(s"Unexpected compilation message: ${cmsg.message} at relative line: ${cmsg.position.fold(-1)(_.line)}"))(_ => Seq())
93+
.fold(Seq(s"Unexpected compilation message: ${cmsg.message} at relative line: ${cmsg.position.fold(-1)(_.relativeLine)}"))(_ => Seq())
9494
}
9595

9696
val result = mResult ++ messages.flatMap { msg =>
@@ -103,7 +103,7 @@ abstract class SnippetsE2eTest(testName: String, flag: SCFlags) extends Scaladoc
103103

104104
if !result.isEmpty then {
105105
val errors = result.mkString("\n")
106-
val foundMessages = compilationMessages.map(m => s"${m.level} at ${m.position.get.line}:${m.position.get.column}").mkString("\n")
106+
val foundMessages = compilationMessages.map(m => s"${m.level} at ${m.position.get.srcPos.line}:${m.position.get.srcPos.column}").mkString("\n")
107107
throw AssertionError(Seq("Errors:", errors,"Found:", foundMessages).mkString("\n", "\n", "\n"))
108108
}
109109
}

0 commit comments

Comments
 (0)