Skip to content

Commit c97c7aa

Browse files
authored
Merge pull request #14577 from dotty-staging/scaladoc/groupping-fix
Fix groupping entries using markdown syntax
2 parents e6a6e30 + b5b85ce commit c97c7aa

File tree

4 files changed

+145
-2
lines changed

4 files changed

+145
-2
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package tests
2+
package groups
3+
4+
/** Groups
5+
* @groupname foo Foo-group
6+
* @groupprio bazz 10
7+
* @groupdesc bar Description of group
8+
* bar
9+
*/
10+
class Groups {
11+
/** Method in group foo
12+
* @group foo
13+
*/
14+
def groupFoo: String = ???
15+
16+
/** Method in group bar
17+
* @group bar
18+
*/
19+
def groupBar: String = ???
20+
21+
/** Method in group bazz
22+
* @group bazz
23+
*/
24+
def groupBazz: String = ???
25+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ class MarkdownCommentParser(repr: Repr)(using dctx: DocContext)
178178
def stringToMarkup(str: String) =
179179
MarkdownParser.parseToMarkdown(str, markdown.DocFlexmarkParser(resolveLink))
180180

181-
def markupToString(t: mdu.Node): String = t.toString()
181+
def markupToString(t: mdu.Node): String = t.getChars().toString()
182182

183183
def markupToDokka(md: mdu.Node): DocPart = md
184184

scaladoc/test/dotty/tools/scaladoc/ScaladocTest.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ abstract class ScaladocTest(val name: String):
1111
val ctx = Scaladoc.run(args)(using testContext)
1212
op(using ctx)
1313

14+
def moduleDocContext = testDocContext(tastyFiles(name))
1415

1516
def withModule(op: DocContext ?=> Module => Unit) =
16-
given DocContext = testDocContext(tastyFiles(name))
17+
given DocContext = moduleDocContext
1718
op(ScalaModuleProvider.mkModule())
1819

1920
protected def getTempDir() : TemporaryFolder =
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package dotty.tools.scaladoc
2+
package tasty
3+
package comments
4+
5+
import org.junit.{Test, Rule}
6+
import org.junit.Assert.{assertSame, assertTrue, assertEquals}
7+
import com.vladsch.flexmark.util.{ast => mdu, sequence}
8+
import com.vladsch.flexmark.{ast => mda}
9+
10+
import wiki.WikiDocElement
11+
12+
abstract class MemberGroupingTests(syntax: String) extends ScaladocTest("groups") {
13+
import MemberGroupingTests._
14+
override def moduleDocContext = super.moduleDocContext.copy(args = super.moduleDocContext.args.copy(defaultSyntax = List(syntax)))
15+
16+
val expectedMemberGroups = Map(
17+
"groupFoo" -> "foo",
18+
"groupBar" -> "bar",
19+
"groupBazz" -> "bazz"
20+
)
21+
22+
val expectedDescriptions = Map(
23+
"bar" -> Seq("Description", "of", "group", "bar")
24+
)
25+
26+
val expectedNames = Map(
27+
"foo" -> "Foo-group"
28+
)
29+
30+
val expectedPrio = Map(
31+
"bazz" -> 10
32+
)
33+
34+
override def runTest = withModule { module =>
35+
val memberGroups = module.members.values.flatMap { member =>
36+
member.docs.flatMap(_.group).map(g => member.name -> g)
37+
}.toMap
38+
39+
val groupDescriptions: Map[String, String] = module.members.values
40+
.flatMap { member =>
41+
member.docs.map(_.groupDesc)
42+
}
43+
.foldLeft[Map[String, DocPart]](Map.empty)(_ ++ _)
44+
.map {
45+
case (k, s: Seq[WikiDocElement] @unchecked) => k -> s.map {
46+
case i: wiki.Inline => flatten(i)
47+
case b: wiki.Block => flatten(b)
48+
}.mkString
49+
case (k, n: mdu.Node) => k -> n.getChars.toString
50+
}
51+
52+
val groupNames = module.members.values
53+
.flatMap { member =>
54+
member.docs.map(_.groupNames)
55+
}
56+
.foldLeft[Map[String, DocPart]](Map.empty)(_ ++ _)
57+
.map {
58+
case (k, s: Seq[WikiDocElement] @unchecked) => k -> s.map {
59+
case i: wiki.Inline => flatten(i)
60+
case b: wiki.Block => flatten(b)
61+
}.mkString
62+
case (k, n: mdu.Node) => k -> n.getChars.toString
63+
}
64+
65+
val groupPrios = module.members.values
66+
.flatMap { member =>
67+
member.docs.map(_.groupPrio)
68+
}
69+
.foldLeft(Map.empty)(_ ++ _)
70+
71+
expectedMemberGroups.foreach {
72+
case (memberName, groupName) => assertEquals(memberGroups.getOrElse(memberName, ""), groupName)
73+
}
74+
75+
expectedDescriptions.foreach {
76+
case (memberName, expectedWords) => assert(expectedWords.forall(word => groupDescriptions.getOrElse(memberName, "").contains(word)))
77+
}
78+
79+
expectedNames.foreach {
80+
case (group, groupName) => assertEquals(groupNames.getOrElse(group, ""), groupName)
81+
}
82+
83+
expectedPrio.foreach {
84+
case (group, prio) => assertEquals(groupPrios.getOrElse(group, -1), prio)
85+
}
86+
}
87+
}
88+
89+
object MemberGroupingTests {
90+
private def flatten(b: wiki.Inline): String = b match
91+
case wiki.Text(t) => t
92+
case wiki.Italic(t) => flatten(t)
93+
case wiki.Bold(t) => flatten(t)
94+
case wiki.Underline(t) => flatten(t)
95+
case wiki.Superscript(t) => flatten(t)
96+
case wiki.Subscript(t) => flatten(t)
97+
case wiki.Link(_, t) => t.fold("")(flatten)
98+
case wiki.Monospace(t) => flatten(t)
99+
case wiki.RepresentationLink(t, _) => flatten(t)
100+
case wiki.Chain(elems) => elems.headOption.fold("")(flatten)
101+
case wiki.HtmlTag(t) => t
102+
case wiki.Summary(t) => flatten(t)
103+
104+
private def flatten(b: wiki.Block): String = b match
105+
case wiki.Paragraph(text) => flatten(text)
106+
case wiki.Title(text, _) => flatten(text)
107+
case wiki.Code(text) => text
108+
case wiki.UnorderedList(elems) => elems.headOption.fold("")(flatten)
109+
case wiki.OrderedList(elems, _) => elems.headOption.fold("")(flatten)
110+
case wiki.DefinitionList(items) => items.headOption.fold("")(e => flatten(e._1))
111+
case wiki.HorizontalRule => ""
112+
case wiki.Table(header, columns, rows) => (header +: rows).flatMap(_.cells).flatMap(_.blocks).map(flatten).mkString
113+
}
114+
115+
class WikiMemberGroupingTests extends MemberGroupingTests("wiki")
116+
117+
class MarkdownMemberGroupingTests extends MemberGroupingTests("markdown")

0 commit comments

Comments
 (0)