Skip to content

Commit 17e46ad

Browse files
authored
Merge pull request #14650 from jchyb/scaladoc/comment-syntax-overrides
Scaladoc: Allow to set a comment syntax based on path to source
2 parents f4a8983 + 8766c44 commit 17e46ad

File tree

10 files changed

+95
-30
lines changed

10 files changed

+95
-30
lines changed

project/Build.scala

+8-1
Original file line numberDiff line numberDiff line change
@@ -1804,6 +1804,10 @@ object ScaladocConfigs {
18041804
.add(Revision("main"))
18051805
.add(SnippetCompiler(List("scaladoc-testcases/docs=compile")))
18061806
.add(SiteRoot("scaladoc-testcases/docs"))
1807+
.add(CommentSyntax(List(
1808+
"scaladoc-testcases/src/example/comment-md=markdown",
1809+
"scaladoc-testcases/src/example/comment-wiki=wiki"
1810+
)))
18071811
.add(ExternalMappings(List(dottyExternalMapping, javaExternalMapping)))
18081812
.withTargets(tastyRoots)
18091813
}
@@ -1833,7 +1837,10 @@ object ScaladocConfigs {
18331837
.add(Revision("main"))
18341838
.add(ExternalMappings(List(javaExternalMapping)))
18351839
.add(DocRootContent(docRootFile.toString))
1836-
.add(CommentSyntax("wiki"))
1840+
.add(CommentSyntax(List(
1841+
s"${dottyLibRoot}=markdown",
1842+
s"${stdLibRoot}=wiki"
1843+
)))
18371844
.add(VersionsDictionaryUrl("https://scala-lang.org/api/versions.json"))
18381845
.add(DocumentSyntheticTypes(true))
18391846
.add(SnippetCompiler(List(

project/ScaladocGeneration.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ object ScaladocGeneration {
4545
def key: String = "-source-links"
4646
}
4747

48-
case class CommentSyntax(value: String) extends Arg[String] {
48+
case class CommentSyntax(value: List[String]) extends Arg[List[String]] {
4949
def key: String = "-comment-syntax"
5050
}
5151

project/scripts/cmdScaladocTests

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dist/target/pack/bin/scaladoc \
3535
"-skip-by-id:scala.runtime.stdLibPatches" \
3636
"-skip-by-id:scala.runtime.MatchCase" \
3737
"-snippet-compiler:scaladoc-testcases/docs=compile" \
38+
"-comment-syntax:scaladoc-testcases/src/example/comment-md=markdown,scaladoc-testcases/src/example/comment-wiki=wiki" \
3839
-siteroot scaladoc-testcases/docs \
3940
-project-footer "Copyright (c) 2002-2022, LAMP/EPFL" \
4041
-default-template static-site-main \
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package example.comment.md
2+
/**
3+
* # markdown header
4+
* Markdown syntax is used here.
5+
*/
6+
object CommentExample
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package example.comment.wiki
2+
/**
3+
* = wiki header =
4+
* Wiki syntax is used here.
5+
*/
6+
object CommentExample

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

+2
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ 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 commentSyntaxArgs = tasty.comments.CommentSyntaxArgs.load(args.defaultSyntax)(using compilerContext)
78+
7779
lazy val snippetCompilerArgs = snippets.SnippetCompilerArgs.load(args.snippetCompiler)(using compilerContext)
7880

7981
lazy val snippetChecker = snippets.SnippetChecker(args)(using compilerContext)

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

+2-20
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,6 @@ import dotty.tools.scaladoc.Inkuire
1818
import dotty.tools.scaladoc.Inkuire._
1919

2020
object Scaladoc:
21-
enum CommentSyntax:
22-
case Wiki
23-
case Markdown
24-
25-
object CommentSyntax:
26-
def parse(str: String) = str match
27-
case "wiki" => Some(CommentSyntax.Wiki)
28-
case "markdown" => Some(CommentSyntax.Markdown)
29-
case _ => None
30-
31-
val default = CommentSyntax.Markdown
32-
3321
case class Args(
3422
name: String,
3523
tastyDirs: Seq[File] = Nil,
@@ -41,7 +29,7 @@ object Scaladoc:
4129
projectVersion: Option[String] = None,
4230
projectLogo: Option[String] = None,
4331
projectFooter: Option[String] = None,
44-
defaultSyntax: CommentSyntax = CommentSyntax.Markdown,
32+
defaultSyntax: List[String] = Nil,
4533
sourceLinks: List[String] = Nil,
4634
revision: Option[String] = None,
4735
externalMappings: List[ExternalDocLink] = Nil,
@@ -164,12 +152,6 @@ object Scaladoc:
164152
report.warning("Destination is not provided, please provide '-d' parameter pointing to directory where docs should be created")
165153
File("output")
166154

167-
val parseSyntax: CommentSyntax = syntax.nonDefault.fold(CommentSyntax.default){ str =>
168-
CommentSyntax.parse(str).getOrElse{
169-
report.error(s"unrecognized value for -syntax option: $str")
170-
CommentSyntax.default
171-
}
172-
}
173155
val legacySourceLinkList = if legacySourceLink.get.nonEmpty then List(legacySourceLink.get) else Nil
174156

175157
val externalMappings =
@@ -219,7 +201,7 @@ object Scaladoc:
219201
projectVersion.nonDefault,
220202
projectLogo.nonDefault,
221203
projectFooter.nonDefault,
222-
parseSyntax,
204+
syntax.get,
223205
sourceLinks.get ++ legacySourceLinkList,
224206
revision.nonDefault,
225207
externalMappings ++ legacyExternalMappings,

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class ScaladocSettings extends SettingGroup with AllScalaSettings:
4040
val legacySourceLink: Setting[String] =
4141
StringSetting("-doc-source-url", "sources", "Legacy option from Scala 2. Use -source-links instead.", "")
4242

43-
val syntax: Setting[String] =
44-
StringSetting("-comment-syntax", "syntax", "Syntax of the comment used", "")
43+
val syntax: Setting[List[String]] =
44+
MultiStringSetting("-comment-syntax", "syntax", tasty.comments.CommentSyntaxArgs.usage)
4545

4646
val revision: Setting[String] =
4747
StringSetting("-revision", "revision", "Revision (branch or ref) used to build project project", "")

scaladoc/src/dotty/tools/scaladoc/tasty/ScalaDocSupport.scala

+12-6
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package tasty
33

44
import scala.jdk.CollectionConverters._
55

6-
import dotty.tools.scaladoc.Scaladoc.CommentSyntax
7-
import dotty.tools.scaladoc.tasty.comments.Comment
6+
import dotty.tools.scaladoc.tasty.comments.{Comment, CommentSyntax}
7+
import dotty.tools.scaladoc.tasty.SymOps.source
88

99
import scala.quoted._
1010

@@ -14,17 +14,23 @@ object ScaladocSupport:
1414
import reflect.report
1515
val preparsed = comments.Preparser.preparse(comments.Cleaner.clean(comment))
1616

17+
def pathBasedCommentSyntax(): CommentSyntax =
18+
val path = sym.source.map(_.path)
19+
summon[DocContext].commentSyntaxArgs.get(path)
20+
1721
val commentSyntax =
1822
preparsed.syntax.headOption match {
1923
case Some(commentSetting) =>
20-
CommentSyntax.parse(commentSetting).getOrElse {
21-
val msg = s"not a valid comment syntax: $commentSetting, defaulting to Markdown syntax."
24+
CommentSyntax.CommentSyntaxParser.parse(commentSetting).getOrElse {
25+
val defaultSyntax = pathBasedCommentSyntax()
26+
val msg = s"not a valid comment syntax: $commentSetting, defaulting to ${defaultSyntax} syntax."
2227
// we should update pos with span from documentation
2328
pos.fold(report.warning(msg))(report.warning(msg, _))
2429

25-
CommentSyntax.default
30+
defaultSyntax
2631
}
27-
case None => summon[DocContext].args.defaultSyntax
32+
case None =>
33+
pathBasedCommentSyntax()
2834
}
2935

3036
val parser = commentSyntax match {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package dotty.tools.scaladoc
2+
package tasty.comments
3+
4+
import java.nio.file.Path
5+
6+
enum CommentSyntax:
7+
case Wiki
8+
case Markdown
9+
10+
object CommentSyntax:
11+
object CommentSyntaxParser extends ArgParser[CommentSyntax]:
12+
def parse(s: String): Either[String, CommentSyntax] = s match
13+
case "wiki" => Right(CommentSyntax.Wiki)
14+
case "markdown" => Right(CommentSyntax.Markdown)
15+
case _ => Left(s"No such syntax found.")
16+
17+
val default = CommentSyntax.Markdown
18+
19+
case class CommentSyntaxArgs(csFormats: PathBased[CommentSyntax]):
20+
def get(path: Option[Path]): CommentSyntax =
21+
path
22+
.flatMap(p => csFormats.get(p).map(_.elem))
23+
.getOrElse(CommentSyntax.default)
24+
25+
object CommentSyntaxArgs:
26+
val usage =
27+
"""
28+
|Comment Syntax arguments provide a way to set comment syntax for specified paths.
29+
|
30+
|This setting accepts list of arguments in format:
31+
|args := arg{,arg}
32+
|arg := [path=]syntax
33+
|where `path` is a prefix of the path to source files that will have a specific comment syntax set and `syntax` specifies the one used.
34+
|
35+
|If the path is not present, the argument will be used as the default for all unmatched paths.
36+
|
37+
|Available syntaxes:
38+
|markdown
39+
|wiki
40+
|
41+
""".stripMargin
42+
43+
def load(args: List[String])(using CompilerContext): CommentSyntaxArgs = {
44+
PathBased.parse[CommentSyntax](args)(using CommentSyntax.CommentSyntaxParser) match {
45+
case PathBased.ParsingResult(errors, res) =>
46+
if errors.nonEmpty then report.warning(s"""
47+
|Got following errors during comment syntax args parsing:
48+
|$errors
49+
|
50+
|$usage
51+
|""".stripMargin
52+
)
53+
CommentSyntaxArgs(res)
54+
}
55+
}

0 commit comments

Comments
 (0)