Skip to content

Commit b465ae5

Browse files
committed
Implement annotation parsing like CommentFactoryBase from nsc
1 parent c644fc2 commit b465ae5

File tree

6 files changed

+158
-67
lines changed

6 files changed

+158
-67
lines changed

dottydoc/js/src/html/EntityLayout.scala

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,28 +58,34 @@ case class EntityLayout(entity: Entity) extends MemberLayout {
5858
main(
5959
id := "entity-container",
6060
cls := "mdl-layout__content",
61-
div(
62-
cls := "page-content",
63-
div(cls := "entity-title", entityTitle),
64-
div(raw(entity.comment.fold("")(_.body))),
65-
entity match {
66-
case x if x.hasMembers =>
67-
val e = x.asInstanceOf[Entity with Members]
68-
if (e.members.nonEmpty)
69-
Seq(
70-
h5("Members"),
71-
div(
72-
cls := "mld-grid",
73-
e.members
74-
.collect {
75-
case x if x.hasModifiers && !x.isPrivate => x
76-
}
77-
.flatMap(member(_, entity)).toList
61+
div(
62+
cls := "page-content",
63+
div(cls := "entity-title", entityTitle),
64+
div(raw(entity.comment.fold("")(_.body))),
65+
entity.comment.filter(_.authors.nonEmpty).map { comment =>
66+
dl(
67+
dt(cls := "entity-authors", "Authors"),
68+
comment.authors.map(x => dd(cls := "entity-author", raw(x))).toList
69+
)
70+
}.toOption,
71+
entity match {
72+
case x if x.hasMembers =>
73+
val e = x.asInstanceOf[Entity with Members]
74+
if (e.members.nonEmpty)
75+
Seq(
76+
h5("Members"),
77+
div(
78+
cls := "mdl-grid",
79+
e.members
80+
.collect {
81+
case x if x.hasModifiers && !x.isPrivate => x
82+
}
83+
.flatMap(member(_, entity)).toList
84+
)
7885
)
79-
)
80-
case _ => ()
81-
}
82-
)
86+
case _ => ()
87+
}
88+
)
8389
),
8490
main(
8591
id := "search-results",

dottydoc/js/src/model/entities.scala

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,26 @@ trait Entity extends sjs.Object {
2828

2929
@ScalaJSDefined
3030
trait Comment extends sjs.Object {
31-
val body: String
32-
val short: String
31+
val body: String
32+
val short: String
33+
val authors: sjs.Array[String]
34+
val see: sjs.Array[String]
35+
val result: sjs.UndefOr[String]
36+
val throws: Map[String, String]
37+
val valueParams: Map[String, String]
38+
val typeParams: Map[String, String]
39+
val version: sjs.UndefOr[String]
40+
val since: sjs.UndefOr[String]
41+
val todo: List[String]
42+
val deprecated: sjs.UndefOr[String]
43+
val note: List[String]
44+
val example: List[String]
45+
val constructor: sjs.UndefOr[String]
46+
val group: sjs.UndefOr[String]
47+
val groupDesc: Map[String, String]
48+
val groupNames: Map[String, String]
49+
val groupPrio: Map[String, String]
50+
val hideImplicitConversions: List[String]
3351
}
3452

3553
@ScalaJSDefined

dottydoc/jvm/src/dotty/tools/dottydoc/model/comment/Comment.scala

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,26 @@ package dottydoc
33
package model
44
package comment
55

6-
case class Comment(body: String, short: String)
6+
case class Comment (
7+
body: String,
8+
short: String,
9+
authors: List[String],
10+
see: List[String],
11+
result: Option[String],
12+
throws: Map[String, String],
13+
valueParams: Map[String, String],
14+
typeParams: Map[String, String],
15+
version: Option[String],
16+
since: Option[String],
17+
todo: List[String],
18+
deprecated: Option[String],
19+
note: List[String],
20+
example: List[String],
21+
constructor: Option[String],
22+
group: Option[String],
23+
groupDesc: Map[String, String],
24+
groupNames: Map[String, String],
25+
groupPrio: Map[String, String],
26+
/** List of conversions to hide - containing e.g: `scala.Predef.FloatArrayOps` */
27+
hideImplicitConversions: List[String]
28+
)

dottydoc/jvm/src/dotty/tools/dottydoc/model/comment/CommentParser.scala

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,59 @@ trait CommentParser extends util.MemberLookup {
1313
import Regexes._
1414
import model.internal._
1515

16+
case class FullComment (
17+
body: Body,
18+
authors: List[Body],
19+
see: List[Body],
20+
result: Option[Body],
21+
throws: Map[String, Body],
22+
valueParams: Map[String, Body],
23+
typeParams: Map[String, Body],
24+
version: Option[Body],
25+
since: Option[Body],
26+
todo: List[Body],
27+
deprecated: Option[Body],
28+
note: List[Body],
29+
example: List[Body],
30+
constructor: Option[Body],
31+
group: Option[Body],
32+
groupDesc: Map[String, Body],
33+
groupNames: Map[String, Body],
34+
groupPrio: Map[String, Body],
35+
hideImplicitConversions: List[Body],
36+
shortDescription: List[Body]
37+
) {
38+
39+
/**
40+
* Transform this CommentParser.FullComment to a Comment using the supplied
41+
* Body transformer
42+
*/
43+
def toComment(transform: Body => String) = Comment(
44+
transform(body),
45+
short =
46+
if (shortDescription.nonEmpty) shortDescription.map(transform).mkString
47+
else body.summary.map(transform).getOrElse(""),
48+
authors.map(transform),
49+
see.map(transform),
50+
result.map(transform),
51+
throws.map { case (k, v) => (k, transform(v)) },
52+
valueParams.map { case (k, v) => (k, transform(v)) },
53+
typeParams.map { case (k, v) => (k, transform(v)) },
54+
version.map(transform),
55+
since.map(transform),
56+
todo.map(transform),
57+
deprecated.map(transform),
58+
note.map(transform),
59+
example.map(transform),
60+
constructor.map(transform),
61+
group.map(transform),
62+
groupDesc.map { case (k, v) => (k, transform(v)) },
63+
groupNames.map { case (k, v) => (k, transform(v)) },
64+
groupPrio.map { case (k, v) => (k, transform(v)) },
65+
hideImplicitConversions.map(transform)
66+
)
67+
}
68+
1669
/** Parses a raw comment string into a `Comment` object.
1770
* @param packages all packages parsed by Scaladoc tool, used for lookup
1871
* @param cleanComment a cleaned comment to be parsed
@@ -26,7 +79,7 @@ trait CommentParser extends util.MemberLookup {
2679
src: String,
2780
pos: Position,
2881
site: Symbol = NoSymbol
29-
)(implicit ctx: Context): Body = {
82+
)(implicit ctx: Context): FullComment = {
3083

3184
/** Parses a comment (in the form of a list of lines) to a `Comment`
3285
* instance, recursively on lines. To do so, it splits the whole comment
@@ -48,7 +101,7 @@ trait CommentParser extends util.MemberLookup {
48101
lastTagKey: Option[TagKey],
49102
remaining: List[String],
50103
inCodeBlock: Boolean
51-
): Body = remaining match {
104+
): FullComment = remaining match {
52105

53106
case CodeBlockStartRegex(before, marker, after) :: ls if (!inCodeBlock) =>
54107
if (!before.trim.isEmpty && !after.trim.isEmpty)
@@ -155,8 +208,8 @@ trait CommentParser extends util.MemberLookup {
155208
case _ => None
156209
}
157210

158-
def allTags(key: SimpleTagKey): List[Body] =
159-
(bodyTags remove key).getOrElse(Nil).filterNot(_.blocks.isEmpty)
211+
def allTags[B](key: SimpleTagKey): List[Body] =
212+
(bodyTags remove key).getOrElse(Nil).filterNot(_.blocks.isEmpty).reverse
160213

161214
def allSymsOneTag(key: TagKey, filterEmpty: Boolean = true): Map[String, Body] = {
162215
val keys: Seq[SymbolTagKey] =
@@ -193,37 +246,33 @@ trait CommentParser extends util.MemberLookup {
193246
}
194247
}
195248

196-
// TODO: this method should return a parsed comment with the members below
197-
//val com = createComment (
198-
// body0 = Some(parseWikiAtSymbol(docBody.toString, pos, site)),
199-
// authors0 = allTags(SimpleTagKey("author")),
200-
// see0 = allTags(SimpleTagKey("see")),
201-
// result0 = oneTag(SimpleTagKey("return")),
202-
// throws0 = linkedExceptions,
203-
// valueParams0 = allSymsOneTag(SimpleTagKey("param")),
204-
// typeParams0 = allSymsOneTag(SimpleTagKey("tparam")),
205-
// version0 = oneTag(SimpleTagKey("version")),
206-
// since0 = oneTag(SimpleTagKey("since")),
207-
// todo0 = allTags(SimpleTagKey("todo")),
208-
// deprecated0 = oneTag(SimpleTagKey("deprecated"), filterEmpty = false),
209-
// note0 = allTags(SimpleTagKey("note")),
210-
// example0 = allTags(SimpleTagKey("example")),
211-
// constructor0 = oneTag(SimpleTagKey("constructor")),
212-
// source0 = Some(clean(src).mkString("\n")),
213-
// inheritDiagram0 = inheritDiagramText,
214-
// contentDiagram0 = contentDiagramText,
215-
// group0 = oneTag(SimpleTagKey("group")),
216-
// groupDesc0 = allSymsOneTag(SimpleTagKey("groupdesc")),
217-
// groupNames0 = allSymsOneTag(SimpleTagKey("groupname")),
218-
// groupPrio0 = allSymsOneTag(SimpleTagKey("groupprio")),
219-
// hideImplicitConversions0 = allTags(SimpleTagKey("hideImplicitConversion")),
220-
// shortDescription0 = allTags(SimpleTagKey("shortDescription"))
221-
//)
222-
//
223-
//for ((key, _) <- bodyTags)
224-
// dottydoc.println(s"$pos: Tag '@${key.name}' is not recognised")
225-
226-
parseWikiAtSymbol(entity, packages, docBody.toString, pos, site)
249+
val cmt = FullComment(
250+
body = parseWikiAtSymbol(entity, packages, docBody.toString, pos, site),
251+
authors = allTags(SimpleTagKey("author")),
252+
see = allTags(SimpleTagKey("see")),
253+
result = oneTag(SimpleTagKey("return")),
254+
throws = linkedExceptions,
255+
valueParams = allSymsOneTag(SimpleTagKey("param")),
256+
typeParams = allSymsOneTag(SimpleTagKey("tparam")),
257+
version = oneTag(SimpleTagKey("version")),
258+
since = oneTag(SimpleTagKey("since")),
259+
todo = allTags(SimpleTagKey("todo")),
260+
deprecated = oneTag(SimpleTagKey("deprecated"), filterEmpty = false),
261+
note = allTags(SimpleTagKey("note")),
262+
example = allTags(SimpleTagKey("example")),
263+
constructor = oneTag(SimpleTagKey("constructor")),
264+
group = oneTag(SimpleTagKey("group")),
265+
groupDesc = allSymsOneTag(SimpleTagKey("groupdesc")),
266+
groupNames = allSymsOneTag(SimpleTagKey("groupname")),
267+
groupPrio = allSymsOneTag(SimpleTagKey("groupprio")),
268+
hideImplicitConversions = allTags(SimpleTagKey("hideImplicitConversion")),
269+
shortDescription = allTags(SimpleTagKey("shortDescription"))
270+
)
271+
272+
for ((key, _) <- bodyTags)
273+
dottydoc.println(s"$pos: Tag '@${key.name}' is not recognised")
274+
275+
cmt
227276
}
228277
}
229278

dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ object json {
2525
}
2626

2727
implicit class JsonComment(val cmt: Comment) extends AnyVal {
28-
def json: String = s"""{"body":${cmt.body.json},"short":${cmt.short.json}}"""
28+
def json: String =
29+
s"""{"body":${cmt.body.json},"short":${cmt.short.json},"authors":${cmt.authors.map(_.json).mkString("[",",","]")},"see":${cmt.see.map(_.json).mkString("[",",","]")},${cmt.result.map(res => s""""result":${res.json},""").getOrElse("")}"throws":${cmt.throws.map { case (k, v) => s"${k.json}:${v.json}" }.mkString("{",",","}")},"valueParams":${cmt.valueParams.map { case (k, v) => s"${k.json}:${v.json}"}.mkString("{",",","}")},"typeParams":${cmt.typeParams.map { case (k, v) => s"${k.json}:${v.json}"}.mkString("{",",","}")},${cmt.version.map(x => s""""version":${x.json},""").getOrElse("")}${cmt.since.map(x => s""""since":${x.json},""").getOrElse("")}"todo":${cmt.todo.map(_.json).mkString("[",",","]")},${cmt.deprecated.map(x => s""""deprecated":${x.json},""").getOrElse("")}"note":${cmt.note.map(_.json).mkString("[",",","]")},"example":${cmt.example.map(_.json).mkString("[",",","]")},${cmt.constructor.map(x => s""""constructor":${x.json},""").getOrElse("")}${cmt.group.map(x => s""""group":${x.json},""").getOrElse("")}"groupDesc":${cmt.groupDesc.map { case (k, v) => s"${k.json}:${v.json}"}.mkString("{",",","}")},"groupNames":${cmt.groupNames.map { case (k, v) => s"${k.json}:${v.json}"}.mkString("{",",","}")},"groupPrio":${cmt.groupPrio.map { case (k, v) => s"${k.json}:${v.json}"}.mkString("{",",","}")},"hideImplicitConversions":${cmt.hideImplicitConversions.map(_.json).mkString("[",",","]")}}"""
2930
}
3031

3132
implicit class LinkJson(val link: MaterializableLink) extends AnyVal {

dottydoc/jvm/src/dotty/tools/dottydoc/model/parsers.scala

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,8 @@ object parsers {
2525
def parseHtml(sym: Symbol, parent: Symbol, entity: Entity, packages: Map[String, Package])(implicit ctx: Context): (String, Option[Comment]) = {
2626
val cmt = ctx.docbase.docstring(sym).map { d =>
2727
val expanded = expand(sym, parent)
28-
val body = parse(entity, packages, clean(expanded), expanded, d.pos)
29-
val summary = body.summary.map(_.toHtml(entity)).getOrElse("")
30-
body.toHtml(entity) match {
31-
case "" => None
32-
case x => Some(Comment(x, summary))
33-
}
34-
}.flatten
28+
parse(entity, packages, clean(expanded), expanded, d.pos).toComment(_.toHtml(entity))
29+
}
3530

3631
(entity.path.mkString("."), cmt)
3732
}

0 commit comments

Comments
 (0)