From e77fe63f98099caca481f74f3613c5814fff3020 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Tue, 17 Jan 2017 14:36:58 +0100 Subject: Implement remainder of type members --- .../dotty/tools/dottydoc/core/DocASTPhase.scala | 5 ++- .../tools/dottydoc/core/SortMembersPhase.scala | 25 ++++++++++--- .../src/dotty/tools/dottydoc/model/entities.scala | 9 +++-- .../src/dotty/tools/dottydoc/model/factories.scala | 9 +++++ doc-tool/src/dotty/tools/dottydoc/model/java.scala | 42 ++++++++++++++++------ .../dotty/tools/dottydoc/staticsite/filters.scala | 4 ++- .../dotty/tools/dottydoc/util/MemberLookup.scala | 8 +---- 7 files changed, 75 insertions(+), 27 deletions(-) (limited to 'doc-tool/src') diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala index a3e71340c..f8ffdc0aa 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala @@ -92,7 +92,10 @@ class DocASTPhase extends Phase { /** type alias */ case t: TypeDef if !t.isClassDef => val sym = t.symbol - TypeAliasImpl(sym, annotations(sym), flags(t), t.name.show.split("\\$\\$").last, path(sym), None) + if (sym.is(Flags.Synthetic | Flags.Param)) + NonEntity + else + TypeAliasImpl(sym, annotations(sym), flags(t), t.name.show.split("\\$\\$").last, path(sym), alias(t.rhs.tpe)) /** trait */ case t @ TypeDef(n, rhs) if t.symbol.is(Flags.Trait) => diff --git a/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala index c8de532bb..29898b140 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala @@ -10,23 +10,38 @@ import model.internal._ /** This DocMiniPhase sorts the members of all classes, traits, objects and packages */ class SortMembers extends DocMiniPhase { + private def sort(xs: List[Entity]): List[Entity] = { + def sortOrNil(xs: Option[List[Entity]]*) = + xs.map(_.getOrElse(Nil)).reduceLeft(_ ++ _).sortBy(_.name) + + val map = xs.groupBy(_.kind) + + val pkgs = sortOrNil(map.get("package")) + val typs = sortOrNil(map.get("type")) + val vals = sortOrNil(map.get("val"), map.get("var")) + val nested = sortOrNil(map.get("object"), map.get("class"), map.get("case class"), map.get("trait")) + val defs = sortOrNil(map.get("def")) + + pkgs ++ nested ++ typs ++ vals ++ defs + } + override def transformPackage(implicit ctx: Context) = { case p: PackageImpl => - p.copy(members = p.members.sortBy(_.name)) + p.copy(members = sort(p.members)) } override def transformClass(implicit ctx: Context) = { case c: ClassImpl => - c.copy(members = c.members.sortBy(_.name)) + c.copy(members = sort(c.members)) } override def transformCaseClass(implicit ctx: Context) = { case cc: CaseClassImpl => - cc.copy(members = cc.members.sortBy(_.name)) + cc.copy(members = sort(cc.members)) } override def transformTrait(implicit ctx: Context) = { case t: TraitImpl => - t.copy(members = t.members.sortBy(_.name)) + t.copy(members = sort(t.members)) } override def transformObject(implicit ctx: Context) = { case o: ObjectImpl => - o.copy(members = o.members.sortBy(_.name)) + o.copy(members = sort(o.members)) } } diff --git a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala index e9d388c3b..a04898740 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala @@ -46,15 +46,20 @@ trait SuperTypes { trait Members { def members: List[Entity] + + def hasVisibleMembers: Boolean = members.exists { + case e: Entity with Modifiers => !(e.isPrivate || e.isProtected) + case e => true + } } trait Modifiers { def modifiers: List[String] - val isPrivate: Boolean = + def isPrivate: Boolean = modifiers.contains("private") - val isProtected: Boolean = + def isProtected: Boolean = modifiers.contains("protected") } diff --git a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala index 8f1fad4a7..ad6bf7bae 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala @@ -37,6 +37,15 @@ object factories { private val product = """Product[1-9][0-9]*""".r + def alias(t: Type)(implicit ctx: Context): Option[Reference] = { + val defn = ctx.definitions + t match { + case TypeBounds(low, high) if (low eq defn.NothingType) && (high eq defn.AnyType) => + None + case t => Some(returnType(t)) + } + } + def returnType(t: Type)(implicit ctx: Context): Reference = { val defn = ctx.definitions diff --git a/doc-tool/src/dotty/tools/dottydoc/model/java.scala b/doc-tool/src/dotty/tools/dottydoc/model/java.scala index 331699957..8e493f889 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/java.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/java.scala @@ -51,7 +51,8 @@ object java { "name" -> ent.name, "path" -> ent.path.asJava, "members" -> ent.members.map(_.asJava()).asJava, - "comment" -> ent.comment.map(_.asJava).asJava + "comment" -> ent.comment.map(_.asJava).asJava, + "hasVisibleMembers" -> ent.hasVisibleMembers ) ++ extras).asJava } @@ -67,7 +68,8 @@ object java { "superTypes" -> ent.superTypes.map(_.asJava).asJava, "comment" -> ent.comment.map(_.asJava).asJava, "isPrivate" -> ent.isPrivate, - "isProtected" -> ent.isProtected + "isProtected" -> ent.isProtected, + "hasVisibleMembers" -> ent.hasVisibleMembers ) ++ extras).asJava } @@ -83,7 +85,8 @@ object java { "superTypes" -> ent.superTypes.map(_.asJava).asJava, "comment" -> ent.comment.map(_.asJava).asJava, "isPrivate" -> ent.isPrivate, - "isProtected" -> ent.isProtected + "isProtected" -> ent.isProtected, + "hasVisibleMembers" -> ent.hasVisibleMembers ) ++ extras).asJava } @@ -99,7 +102,8 @@ object java { "superTypes" -> ent.superTypes.map(_.asJava).asJava, "comment" -> ent.comment.map(_.asJava).asJava, "isPrivate" -> ent.isPrivate, - "isProtected" -> ent.isProtected + "isProtected" -> ent.isProtected, + "hasVisibleMembers" -> ent.hasVisibleMembers ) ++ extras).asJava } @@ -114,7 +118,8 @@ object java { "superTypes" -> ent.superTypes.map(_.asJava).asJava, "comment" -> ent.comment.map(_.asJava).asJava, "isPrivate" -> ent.isPrivate, - "isProtected" -> ent.isProtected + "isProtected" -> ent.isProtected, + "hasVisibleMembers" -> ent.hasVisibleMembers ) ++ extras).asJava } @@ -137,19 +142,33 @@ object java { implicit class JavaVal(val ent: Val) extends AnyVal { def asJava: JMap[String, _] = Map( - "kind" -> ent.kind, + "kind" -> ent.kind, "annotations" -> ent.annotations.asJava, - "name" -> ent.name, - "modifiers" -> ent.modifiers.asJava, - "path" -> ent.path.asJava, - "returnValue" -> ent.returnValue.asJava, - "comment" -> ent.comment.map(_.asJava).asJava, + "name" -> ent.name, + "modifiers" -> ent.modifiers.asJava, + "path" -> ent.path.asJava, + "returnValue" -> ent.returnValue.asJava, + "comment" -> ent.comment.map(_.asJava).asJava, "implicitlyAddedFrom" -> ent.implicitlyAddedFrom.map(_.asJava).asJava, "isPrivate" -> ent.isPrivate, "isProtected" -> ent.isProtected ).asJava } + implicit class JavaTypeAlias(val ent: TypeAlias) extends AnyVal { + def asJava: JMap[String, _] = Map( + "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, + "modifiers" -> ent.modifiers.asJava, + "name" -> ent.name, + "path" -> ent.path.asJava, + "alias" -> ent.alias.map(_.asJava).asJava, + "comment" -> ent.comment.map(_.asJava).asJava, + "isPrivate" -> ent.isPrivate, + "isProtected" -> ent.isProtected + ).asJava + } + implicit class JavaParamList(val pl: ParamList) extends AnyVal { def asJava: JMap[String, _] = Map( "list" -> pl.list.map(_.asJava).asJava, @@ -255,6 +274,7 @@ object java { case ent: Object => ent.asJava(extras) case ent: Def => ent.asJava case ent: Val => ent.asJava + case ent: TypeAlias => ent.asJava case _ => Map.empty.asJava } diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala index bb6f314dc..a4662e735 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala @@ -88,7 +88,9 @@ object filters { override def apply(value: Any, params: AnyRef*): AnyRef = value match { case value: JMap[String, _] @unchecked => - renderReference(value.get("scala").asInstanceOf[Reference]) + val ref = value.get("scala").asInstanceOf[Reference] + if (ref ne null) renderReference(ref) + else null case _ => /*dottydoc.*/println(s"couldn't render: '$value'") null diff --git a/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala b/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala index ad73ad008..caa57db52 100644 --- a/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala +++ b/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala @@ -30,13 +30,7 @@ trait MemberLookup { .collect { case x if x.name == searchStr => x } .sortBy(_.path.last) .headOption - .fold(notFound) { - case e: TypeAlias => - // TODO: will explode once type aliases are fixed - if (e.alias.isDefined) ??? - else notFound - case e => LinkToEntity(e) - } + .fold(notFound)(e => LinkToEntity(e)) /** Looks for an entity down in the structure, if the search list is Nil, * the search stops -- cgit v1.2.3