Skip to content

Scaladoc: Allow to set a comment syntax based on path to source #14650

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1801,6 +1801,10 @@ object ScaladocConfigs {
.add(Revision("main"))
.add(SnippetCompiler(List("scaladoc-testcases/docs=compile")))
.add(SiteRoot("scaladoc-testcases/docs"))
.add(CommentSyntax(List(
"scaladoc-testcases/src/example/comment-md=markdown",
"scaladoc-testcases/src/example/comment-wiki=wiki"
)))
.add(ExternalMappings(List(dottyExternalMapping, javaExternalMapping)))
.withTargets(tastyRoots)
}
Expand Down Expand Up @@ -1830,7 +1834,10 @@ object ScaladocConfigs {
.add(Revision("main"))
.add(ExternalMappings(List(javaExternalMapping)))
.add(DocRootContent(docRootFile.toString))
.add(CommentSyntax("wiki"))
.add(CommentSyntax(List(
s"${dottyLibRoot}=markdown",
s"${stdLibRoot}=wiki"
)))
.add(VersionsDictionaryUrl("https://scala-lang.org/api/versions.json"))
.add(DocumentSyntheticTypes(true))
.add(SnippetCompiler(List(
Expand Down
2 changes: 1 addition & 1 deletion project/ScaladocGeneration.scala
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ object ScaladocGeneration {
def key: String = "-source-links"
}

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

Expand Down
1 change: 1 addition & 0 deletions project/scripts/cmdScaladocTests
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dist/target/pack/bin/scaladoc \
"-skip-by-id:scala.runtime.stdLibPatches" \
"-skip-by-id:scala.runtime.MatchCase" \
"-snippet-compiler:scaladoc-testcases/docs=compile" \
"-comment-syntax:scaladoc-testcases/src/example/comment-md=markdown,scaladoc-testcases/src/example/comment-wiki=wiki" \
-siteroot scaladoc-testcases/docs \
-project-footer "Copyright (c) 2002-2022, LAMP/EPFL" \
-default-template static-site-main \
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package example.comment.md
/**
* # markdown header
* Markdown syntax is used here.
*/
object CommentExample
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package example.comment.wiki
/**
* = wiki header =
* Wiki syntax is used here.
*/
object CommentExample
2 changes: 2 additions & 0 deletions scaladoc/src/dotty/tools/scaladoc/DocContext.scala
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ case class NavigationNode(name: String, dri: DRI, nested: Seq[NavigationNode])
case class DocContext(args: Scaladoc.Args, compilerContext: CompilerContext):
lazy val sourceLinks = SourceLinks.load(args.sourceLinks, args.revision)(using compilerContext)

lazy val commentSyntaxArgs = tasty.comments.CommentSyntaxArgs.load(args.defaultSyntax)(using compilerContext)

lazy val snippetCompilerArgs = snippets.SnippetCompilerArgs.load(args.snippetCompiler)(using compilerContext)

lazy val snippetChecker = snippets.SnippetChecker(args)(using compilerContext)
Expand Down
22 changes: 2 additions & 20 deletions scaladoc/src/dotty/tools/scaladoc/Scaladoc.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,6 @@ import dotty.tools.scaladoc.Inkuire
import dotty.tools.scaladoc.Inkuire._

object Scaladoc:
enum CommentSyntax:
case Wiki
case Markdown

object CommentSyntax:
def parse(str: String) = str match
case "wiki" => Some(CommentSyntax.Wiki)
case "markdown" => Some(CommentSyntax.Markdown)
case _ => None

val default = CommentSyntax.Markdown

case class Args(
name: String,
tastyDirs: Seq[File] = Nil,
Expand All @@ -41,7 +29,7 @@ object Scaladoc:
projectVersion: Option[String] = None,
projectLogo: Option[String] = None,
projectFooter: Option[String] = None,
defaultSyntax: CommentSyntax = CommentSyntax.Markdown,
defaultSyntax: List[String] = Nil,
sourceLinks: List[String] = Nil,
revision: Option[String] = None,
externalMappings: List[ExternalDocLink] = Nil,
Expand Down Expand Up @@ -164,12 +152,6 @@ object Scaladoc:
report.warning("Destination is not provided, please provide '-d' parameter pointing to directory where docs should be created")
File("output")

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

val externalMappings =
Expand Down Expand Up @@ -219,7 +201,7 @@ object Scaladoc:
projectVersion.nonDefault,
projectLogo.nonDefault,
projectFooter.nonDefault,
parseSyntax,
syntax.get,
sourceLinks.get ++ legacySourceLinkList,
revision.nonDefault,
externalMappings ++ legacyExternalMappings,
Expand Down
4 changes: 2 additions & 2 deletions scaladoc/src/dotty/tools/scaladoc/ScaladocSettings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ class ScaladocSettings extends SettingGroup with AllScalaSettings:
val legacySourceLink: Setting[String] =
StringSetting("-doc-source-url", "sources", "Legacy option from Scala 2. Use -source-links instead.", "")

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

val revision: Setting[String] =
StringSetting("-revision", "revision", "Revision (branch or ref) used to build project project", "")
Expand Down
18 changes: 12 additions & 6 deletions scaladoc/src/dotty/tools/scaladoc/tasty/ScalaDocSupport.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package tasty

import scala.jdk.CollectionConverters._

import dotty.tools.scaladoc.Scaladoc.CommentSyntax
import dotty.tools.scaladoc.tasty.comments.Comment
import dotty.tools.scaladoc.tasty.comments.{Comment, CommentSyntax}
import dotty.tools.scaladoc.tasty.SymOps.source

import scala.quoted._

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

def pathBasedCommentSyntax(): CommentSyntax =
val path = sym.source.map(_.path)
summon[DocContext].commentSyntaxArgs.get(path)

val commentSyntax =
preparsed.syntax.headOption match {
case Some(commentSetting) =>
CommentSyntax.parse(commentSetting).getOrElse {
val msg = s"not a valid comment syntax: $commentSetting, defaulting to Markdown syntax."
CommentSyntax.CommentSyntaxParser.parse(commentSetting).getOrElse {
val defaultSyntax = pathBasedCommentSyntax()
val msg = s"not a valid comment syntax: $commentSetting, defaulting to ${defaultSyntax} syntax."
// we should update pos with span from documentation
pos.fold(report.warning(msg))(report.warning(msg, _))

CommentSyntax.default
defaultSyntax
}
case None => summon[DocContext].args.defaultSyntax
case None =>
pathBasedCommentSyntax()
}

val parser = commentSyntax match {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package dotty.tools.scaladoc
package tasty.comments

import java.nio.file.Path

enum CommentSyntax:
case Wiki
case Markdown

object CommentSyntax:
object CommentSyntaxParser extends ArgParser[CommentSyntax]:
def parse(s: String): Either[String, CommentSyntax] = s match
case "wiki" => Right(CommentSyntax.Wiki)
case "markdown" => Right(CommentSyntax.Markdown)
case _ => Left(s"No such syntax found.")

val default = CommentSyntax.Markdown

case class CommentSyntaxArgs(csFormats: PathBased[CommentSyntax]):
def get(path: Option[Path]): CommentSyntax =
path
.flatMap(p => csFormats.get(p).map(_.elem))
.getOrElse(CommentSyntax.default)

object CommentSyntaxArgs:
val usage =
"""
|Comment Syntax arguments provide a way to set comment syntax for specified paths.
|
|This setting accepts list of arguments in format:
|args := arg{,arg}
|arg := [path=]syntax
|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.
|
|If the path is not present, the argument will be used as the default for all unmatched paths.
|
|Available syntaxes:
|markdown
|wiki
|
""".stripMargin

def load(args: List[String])(using CompilerContext): CommentSyntaxArgs = {
PathBased.parse[CommentSyntax](args)(using CommentSyntax.CommentSyntaxParser) match {
case PathBased.ParsingResult(errors, res) =>
if errors.nonEmpty then report.warning(s"""
|Got following errors during comment syntax args parsing:
|$errors
|
|$usage
|""".stripMargin
)
CommentSyntaxArgs(res)
}
}