Skip to content

Commit 1cb7080

Browse files
committed
Refactor snippet compiler args
1 parent 2d04f70 commit 1cb7080

File tree

9 files changed

+56
-90
lines changed

9 files changed

+56
-90
lines changed

scaladoc-testcases/src/tests/snippetCompilerTest.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package snippetCompiler
22

33
/**
4-
* ```scala sc:compile&failing
4+
* ```scala sc:compile
55
* def a = 2
66
* val x = 1 + List()
77
* a
88
* ```
99
*
10-
* ```scala sc:compile&debug
10+
* ```scala sc:failing
1111
* def a = 2
1212
* val x = 1 + List()
1313
* a
1414
* ```
1515
*
16-
* ```scala sc:compile&failing
16+
* ```scala sc:failing
1717
* def a = 2
1818
* ```
1919
*

scaladoc/src/dotty/tools/scaladoc/DocContext.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ case class NavigationNode(name: String, dri: DRI, nested: Seq[NavigationNode])
7474
case class DocContext(args: Scaladoc.Args, compilerContext: CompilerContext):
7575
lazy val sourceLinks = SourceLinks.load(args.sourceLinks, args.revision)(using compilerContext)
7676

77-
lazy val snippetCompilerArgs = snippets.SnippetCompilerArgs.load(args.snippetCompilerArgs)(using compilerContext)
77+
lazy val snippetCompilerArgs = snippets.SnippetCompilerArgs.load(args.snippetCompiler, args.snippetCompilerDebug)(using compilerContext)
7878

7979
lazy val staticSiteContext = args.docsRoot.map(path => StaticSiteContext(
8080
File(path).getAbsoluteFile(),

scaladoc/src/dotty/tools/scaladoc/Scaladoc.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ object Scaladoc:
4949
includePrivateAPI: Boolean = false,
5050
docCanonicalBaseUrl: String = "",
5151
documentSyntheticTypes: Boolean = false,
52-
snippetCompilerArgs: List[String] = Nil
52+
snippetCompiler: List[String] = Nil,
53+
snippetCompilerDebug: Boolean = false
5354
)
5455

5556
def run(args: Array[String], rootContext: CompilerContext): Reporter =
@@ -191,7 +192,8 @@ object Scaladoc:
191192
visibilityPrivate.get,
192193
docCanonicalBaseUrl.get,
193194
YdocumentSyntheticTypes.get,
194-
snippetCompilerArgs.get
195+
snippetCompiler.get,
196+
snippetCompilerDebug.get
195197
)
196198
(Some(docArgs), newContext)
197199
}

scaladoc/src/dotty/tools/scaladoc/ScaladocSettings.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,11 @@ class ScaladocSettings extends SettingGroup with AllScalaSettings:
9595
val YdocumentSyntheticTypes: Setting[Boolean] =
9696
BooleanSetting("-Ydocument-synthetic-types", "Documents intrinsic types e. g. Any, Nothing. Setting is useful only for stdlib", false)
9797

98-
val snippetCompilerArgs: Setting[List[String]] =
99-
MultiStringSetting("-snippet-compiler-args", "snippet-compiler-args", snippets.SnippetCompilerArgs.usage)
98+
val snippetCompiler: Setting[List[String]] =
99+
MultiStringSetting("-snippet-compiler", "snippet-compiler", snippets.SnippetCompilerArgs.usage)
100+
101+
val snippetCompilerDebug: Setting[Boolean] =
102+
BooleanSetting("-snippet-compiler-debug", snippets.SnippetCompilerArgs.debugUsage, false)
100103

101104
def scaladocSpecificSettings: Set[Setting[_]] =
102-
Set(sourceLinks, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent, snippetCompilerArgs)
105+
Set(sourceLinks, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent, snippetCompiler, snippetCompilerDebug)

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,11 @@ import dotty.tools.scaladoc.snippets._
1010

1111
class DocRender(signatureRenderer: SignatureRenderer, snippetChecker: SnippetChecker)(using ctx: DocContext):
1212

13-
private val snippetCheckingFuncFromMember: Member => SnippetChecker.SnippetCheckingFunc =
13+
private def snippetCheckingFuncFromMember: Member => SnippetChecker.SnippetCheckingFunc =
1414
(m: Member) => {
15-
(str: String, lineOffset: SnippetChecker.LineOffset, argOverride: Option[SnippetCompilerArg]) => {
16-
val pathBasedArg = ctx.snippetCompilerArgs.get(m).fold(
17-
SnippetCompilerArg.default
18-
)(
19-
_ + SnippetCompilerArg.default
20-
)
21-
val arg = argOverride.fold(
22-
pathBasedArg
23-
)(
24-
_ + pathBasedArg
25-
)
15+
(str: String, lineOffset: SnippetChecker.LineOffset, argOverride: Option[SCFlags]) => {
16+
val pathBasedArg = ctx.snippetCompilerArgs.get(m)
17+
val arg = argOverride.fold(pathBasedArg)(pathBasedArg.overrideFlag(_))
2618

2719
snippetChecker.checkSnippet(str, m.docs.map(_.snippetCompilerData), arg, lineOffset).foreach { _ match {
2820
case r: SnippetCompilationResult if !r.isSuccessful =>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class SnippetChecker()(using ctx: DocContext):
2020
arg: SnippetCompilerArg,
2121
lineOffset: SnippetChecker.LineOffset
2222
): Option[SnippetCompilationResult] = {
23-
if arg.is(SCFlags.Compile) then
23+
if arg.flag != SCFlags.NoCompile then
2424
val wrapped = WrappedSnippet(
2525
snippet,
2626
data.map(_.packageName),
@@ -45,4 +45,4 @@ class SnippetChecker()(using ctx: DocContext):
4545

4646
object SnippetChecker:
4747
type LineOffset = Int
48-
type SnippetCheckingFunc = (String, LineOffset, Option[SnippetCompilerArg]) => Unit
48+
type SnippetCheckingFunc = (String, LineOffset, Option[SCFlags]) => Unit

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,17 @@ class SnippetCompiler(
6262

6363
private def additionalMessages(wrappedSnippet: WrappedSnippet, arg: SnippetCompilerArg, context: Context): Seq[SnippetCompilerMessage] = {
6464
(
65-
Option.when(arg.is(SCFlags.Fail) && !context.reporter.hasErrors)(
65+
Option.when(arg.flag == SCFlags.Fail && !context.reporter.hasErrors)(
6666
SnippetCompilerMessage(None, "Snippet should not compile but compiled succesfully", MessageLevel.Error)
6767
) ++
68-
Option.when(arg.is(SCFlags.Debug))(
68+
Option.when(arg.debug && !isSuccessful(arg, context))(
6969
SnippetCompilerMessage(None, s"\n${wrappedSnippet.snippet}", MessageLevel.Debug)
7070
)
7171
).toList
7272
}
7373

7474
private def isSuccessful(arg: SnippetCompilerArg, context: Context): Boolean = {
75-
if arg.is(SCFlags.Fail) then context.reporter.hasErrors
75+
if arg.flag == SCFlags.Fail then context.reporter.hasErrors
7676
else !context.reporter.hasErrors
7777
}
7878

Lines changed: 32 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,64 @@
11
package dotty.tools.scaladoc
22
package snippets
33

4-
case class SnippetCompilerArg(flags: Set[SCFlags]):
5-
def is(flag: SCFlags): Boolean = flags.contains(flag)
6-
def +(other: SnippetCompilerArg): SnippetCompilerArg = {
7-
val allNoncompatbileFlags = flags.flatMap(_.forbiddenFlags)
8-
val compatibleFlags = other.flags.filter(flag => !allNoncompatbileFlags.contains(flag))
9-
copy(flags = flags ++ compatibleFlags)
10-
}
11-
12-
object SnippetCompilerArg:
13-
def default: SnippetCompilerArg = SnippetCompilerArg(
14-
Set(SCFlags.NoCompile)
15-
)
4+
case class SnippetCompilerArg(flag: SCFlags, debug: Boolean):
5+
def overrideFlag(f: SCFlags): SnippetCompilerArg = copy(flag = f)
166

17-
sealed trait SCFlags(val flagName: String, val forbiddenFlags: Set[SCFlags])
7+
sealed trait SCFlags(val flagName: String)
188

199
object SCFlags:
20-
case object Compile extends SCFlags("compile", Set(NoCompile))
21-
case object NoCompile extends SCFlags("nocompile", Set(Compile))
22-
case object Fail extends SCFlags("failing", Set())
23-
case object Debug extends SCFlags("debug", Set())
10+
case object Compile extends SCFlags("compile")
11+
case object NoCompile extends SCFlags("nocompile")
12+
case object Fail extends SCFlags("failing")
2413

25-
def values: Seq[SCFlags] = Seq(Compile, NoCompile, Fail, Debug)
14+
def values: Seq[SCFlags] = Seq(Compile, NoCompile, Fail)
2615

27-
case class SnippetCompilerArgs(scArgs: PathBased[SnippetCompilerArg]):
28-
def get(member: Member): Option[SnippetCompilerArg] = member.sources.flatMap(s => scArgs.get(s.path).map(_.elem))
16+
case class SnippetCompilerArgs(scFlags: PathBased[SCFlags], val debug: Boolean, defaultFlag: SCFlags):
17+
def get(member: Member): SnippetCompilerArg =
18+
member.sources
19+
.flatMap(s => scFlags.get(s.path).map(_.elem))
20+
.fold(SnippetCompilerArg(defaultFlag, debug))(SnippetCompilerArg(_, debug))
2921

3022
object SnippetCompilerArgs:
3123
val usage =
3224
"""
3325
|Snippet compiler arguments provide a way to configure snippet checking.
3426
|
3527
|This setting accept list of arguments in format:
36-
|arg := [path=]flag{&flag}
28+
|args := arg{,arg}
29+
|arg := [path=]flag
3730
|where path is a prefix of source paths to members to which argument should be set.
3831
|
3932
|If path is not present, argument will be used as default.
4033
|
4134
|Available flags:
42-
|compile - Enables snippet checking. Cannot be used with nocompile.
43-
|nocompile - Disables snippet checking. Cannot be used with compile.
35+
|compile - Enables snippet checking.
36+
|nocompile - Disables snippet checking.
37+
|failing - Enables snippet checking, asserts that snippet doesn't compile.
4438
|
4539
""".stripMargin
4640

47-
def load(args: List[String])(using CompilerContext): SnippetCompilerArgs = {
48-
PathBased.parse[SnippetCompilerArg](args)(using SnippetCompilerArgParser) match {
41+
val debugUsage = """
42+
|Setting this option causes snippet compiler to print snippet as it is compiled (after wrapping).
43+
""".stripMargin
44+
45+
def load(args: List[String], debug: Boolean, defaultFlag: SCFlags = SCFlags.NoCompile)(using CompilerContext): SnippetCompilerArgs = {
46+
PathBased.parse[SCFlags](args)(using SCFlagsParser) match {
4947
case PathBased.ParsingResult(errors, res) =>
50-
if errors.nonEmpty then report.warning(
51-
s"""Got following errors during snippet compiler args parsing:
48+
if errors.nonEmpty then report.warning(s"""
49+
|Got following errors during snippet compiler args parsing:
5250
|$errors
5351
|
54-
|${usage}
52+
|$usage
5553
|""".stripMargin
5654
)
57-
SnippetCompilerArgs(res)
55+
SnippetCompilerArgs(res, debug, defaultFlag)
5856
}
5957
}
6058

61-
object SnippetCompilerArgParser extends ArgParser[SnippetCompilerArg]:
62-
def parse(s: String): Either[String, SnippetCompilerArg] = {
63-
val flagStrings = s.split("&")
64-
val (parsed, errors) = flagStrings.map(flag => SCFlags.values.find(_.flagName == flag).fold(
65-
Left(s"$flag: No such flag found.")
66-
)(
67-
Right(_)
68-
)
69-
).partition(_.isRight)
70-
71-
72-
val (flags, errors2) = parsed.collect {
73-
case Right(flag) => flag
74-
} match {
75-
case list =>
76-
list.map(f =>
77-
list.find(elem =>
78-
f.forbiddenFlags.contains(elem)
79-
) match {
80-
case Some(forbiddenElem) => Left(s"${f.flagName}: Cannot be used with flag: ${forbiddenElem.flagName}")
81-
case None => Right(f)
82-
}
83-
).partition(_.isRight)
84-
}
85-
86-
val checkedFlags = flags.collect {
87-
case Right(flag) => flag
88-
}.toSet
89-
90-
val allErrors = (errors ++ errors2).collect {
91-
case Left(error) => error
92-
}.toList
93-
94-
if !allErrors.isEmpty then Left(allErrors.mkString("\n")) else Right(SnippetCompilerArg(checkedFlags))
59+
object SCFlagsParser extends ArgParser[SCFlags]:
60+
def parse(s: String): Either[String, SCFlags] = {
61+
SCFlags.values
62+
.find(_.flagName == s)
63+
.fold(Left(s"$s: No such flag found."))(Right(_))
9564
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ case class DocFlexmarkRenderer(renderLink: (DocLink, String) => String, snippetC
5959
info.split(" ")
6060
.find(_.startsWith("sc:"))
6161
.map(_.stripPrefix("sc:"))
62-
.map(snippets.SnippetCompilerArgParser.parse)
62+
.map(snippets.SCFlagsParser.parse)
6363
.flatMap(_.toOption)
6464
snippetCheckingFunc(node.getContentChars.toString, node.getStartLineNumber, argOverride)
6565
c.delegateRender()

0 commit comments

Comments
 (0)