Skip to content

Commit 3957345

Browse files
committed
Add failing flag
1 parent f9e875a commit 3957345

File tree

6 files changed

+55
-18
lines changed

6 files changed

+55
-18
lines changed

scaladoc-testcases/src/tests/snippetCompilerTest.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package snippetCompiler
22

33
/**
4-
* ```scala sc:compile
4+
* ```scala sc:compile&failing
55
* def a = 2
66
* val x = 1 + List()
77
* a
88
* ```
99
*
10+
* ```scala sc:compile&failing
11+
* def a = 2
12+
* ```
13+
*
1014
* ```scala sc:nocompile
1115
* def a = 3
1216
* a()

scaladoc/src/dotty/tools/scaladoc/renderers/UncycloDocRenderer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ class DocRender(signatureRenderer: SignatureRenderer, snippetChecker: SnippetChe
1616
val arg = argOverride.getOrElse(
1717
ctx.snippetCompilerArgs.get(m).getOrElse(SnippetCompilerArg.default)
1818
)
19-
19+
2020
snippetChecker.checkSnippet(str, m.docs.map(_.snippetCompilerData), arg, lineOffset).foreach { _ match {
21-
case r @ SnippetCompilationResult(None, _) =>
21+
case r: SnippetCompilationResult if !r.isSuccessful =>
2222
println(s"In member ${m.name} (${m.dri.location}):")
2323
println(r.getSummary)
2424
case _ =>

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ class SnippetChecker()(using ctx: DocContext):
1111
ctx.args.tastyDirs.map(_.getAbsolutePath()).mkString(sep)
1212
private val compiler: SnippetCompiler = SnippetCompiler(classpath = cp)
1313

14-
var warningsCount = 0
15-
var errorsCount = 0
14+
private var warningsCount = 0
15+
private var errorsCount = 0
1616

1717
def checkSnippet(
1818
snippet: String,
@@ -30,9 +30,9 @@ class SnippetChecker()(using ctx: DocContext):
3030
lineOffset + data.fold(0)(_.position.line) + 1,
3131
data.fold(0)(_.position.column)
3232
)
33-
val res = compiler.compile(wrapped)
34-
if !res.messages.filter(_.level == MessageLevel.Error).isEmpty then errorsCount = errorsCount + 1
35-
if !res.messages.filter(_.level == MessageLevel.Warning).isEmpty then warningsCount = warningsCount + 1
33+
val res = compiler.compile(wrapped, arg)
34+
if !res.isSuccessful && res.messages.exists(_.level == MessageLevel.Error) then errorsCount = errorsCount + 1
35+
if !res.isSuccessful && res.messages.exists(_.level == MessageLevel.Warning) then warningsCount = warningsCount + 1
3636
Some(res)
3737
else None
3838
}

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,23 @@ package snippets
33

44
import dotty.tools.io.{ AbstractFile }
55

6-
case class SnippetCompilerMessage(line: Int, column: Int, sourceLine: String, message: String, level: MessageLevel)
6+
case class Position(line: Int, column: Int, sourceLine: String)
77

8-
case class SnippetCompilationResult(result: Option[AbstractFile], messages: Seq[SnippetCompilerMessage]):
9-
def getSummary: String = messages.map(m => s"At ${m.line}:${m.column}:\n${m.sourceLine}${m.level.text}: ${m.message}").mkString("\n")
8+
case class SnippetCompilerMessage(position: Option[Position], message: String, level: MessageLevel)
9+
10+
case class SnippetCompilationResult(
11+
isSuccessful: Boolean,
12+
result: Option[AbstractFile],
13+
messages: Seq[SnippetCompilerMessage]
14+
):
15+
def getSummary: String =
16+
messages.map(m =>
17+
m.position.fold(
18+
s"${m.level.text}: ${m.message}"
19+
)(pos =>
20+
s"At ${pos.line}:${pos.column}:\n${pos.sourceLine}${m.level.text}: ${m.message}"
21+
)
22+
).mkString("\n")
1023

1124

1225
enum MessageLevel(val text: String):

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

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,34 @@ class SnippetCompiler(
4646
val infos = diagnostics.toSeq.sortBy(_.pos.source.path)
4747
val errorMessages = infos.map {
4848
case diagnostic if diagnostic.position.isPresent =>
49-
val pos = diagnostic.position.get
49+
val diagPos = diagnostic.position.get
50+
val pos = Some(
51+
Position(diagPos.line + line, diagPos.column + column, diagPos.lineContent)
52+
)
5053
val msg = nullableMessage(diagnostic.message)
5154
val level = MessageLevel.fromOrdinal(diagnostic.level)
52-
SnippetCompilerMessage(pos.line + line, pos.column + column, pos.lineContent, msg, level)
55+
SnippetCompilerMessage(pos, msg, level)
5356
case d =>
5457
val level = MessageLevel.fromOrdinal(d.level)
55-
SnippetCompilerMessage(-1, -1, "", nullableMessage(d.message), level)
58+
SnippetCompilerMessage(None, nullableMessage(d.message), level)
5659
}
5760
errorMessages
5861
}
5962

63+
private def additionalMessages(arg: SnippetCompilerArg, context: Context): Seq[SnippetCompilerMessage] = {
64+
Option.when(arg.is(SCFlags.Fail) && !context.reporter.hasErrors)(
65+
SnippetCompilerMessage(None, "Snippet should not compile but compiled succesfully", MessageLevel.Error)
66+
).toList
67+
}
68+
69+
private def isSuccessful(arg: SnippetCompilerArg, context: Context): Boolean = {
70+
if arg.is(SCFlags.Fail) then context.reporter.hasErrors
71+
else !context.reporter.hasErrors
72+
}
73+
6074
def compile(
61-
wrappedSnippet: WrappedSnippet
75+
wrappedSnippet: WrappedSnippet,
76+
arg: SnippetCompilerArg
6277
): SnippetCompilationResult = {
6378
val context = driver.currentCtx.fresh
6479
.setSetting(
@@ -68,7 +83,11 @@ class SnippetCompiler(
6883
.setReporter(new StoreReporter)
6984
val run = newRun(using context)
7085
run.compileFromStrings(List(wrappedSnippet.snippet))
71-
val messages = createReportMessage(context.reporter.pendingMessages(using context), wrappedSnippet.lineOffset, wrappedSnippet.columnOffset)
72-
val targetIfSuccessful = Option.when(!context.reporter.hasErrors)(target)
73-
SnippetCompilationResult(targetIfSuccessful, messages)
86+
87+
val messages =
88+
createReportMessage(context.reporter.pendingMessages(using context), wrappedSnippet.lineOffset, wrappedSnippet.columnOffset) ++
89+
additionalMessages(arg, context)
90+
91+
val t = Option.when(!context.reporter.hasErrors)(target)
92+
SnippetCompilationResult(isSuccessful(arg, context), t, messages)
7493
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ object SnippetCompilerArg:
1212
enum SCFlags(val flagName: String, val forbiddenFlags: Set[SCFlags]):
1313
case Compile extends SCFlags("compile", Set())
1414
case NoCompile extends SCFlags("nocompile", Set())
15+
case Fail extends SCFlags("failing", Set())
1516

1617
case class SnippetCompilerArgs(scArgs: PathBased[SnippetCompilerArg]):
1718
def get(member: Member): Option[SnippetCompilerArg] = member.sources.flatMap(s => scArgs.get(s.path).map(_.elem))

0 commit comments

Comments
 (0)