From 5bb7c976712e8c86898b94d1abea1acedeed3562 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Fri, 24 Feb 2017 17:04:31 +0900 Subject: Add type params to type aliases --- doc-tool/resources/_layouts/api-page.html | 15 ++++++++++++++- .../src/dotty/tools/dottydoc/core/DocASTPhase.scala | 14 +++++++++++--- doc-tool/src/dotty/tools/dottydoc/core/transform.scala | 1 + .../dotty/tools/dottydoc/model/JavaConverters.scala | 1 + doc-tool/src/dotty/tools/dottydoc/model/entities.scala | 2 +- .../src/dotty/tools/dottydoc/model/factories.scala | 18 ++++++------------ doc-tool/src/dotty/tools/dottydoc/model/internal.scala | 1 + 7 files changed, 35 insertions(+), 17 deletions(-) (limited to 'doc-tool') diff --git a/doc-tool/resources/_layouts/api-page.html b/doc-tool/resources/_layouts/api-page.html index 878ec8d8f..2d2f0265a 100644 --- a/doc-tool/resources/_layouts/api-page.html +++ b/doc-tool/resources/_layouts/api-page.html @@ -134,12 +134,25 @@ extraCSS: {% endfor %} {% endif %} - {% if member.kind == "type" and member.alias != null %} + {% if member.kind == "type" %} + {% for tparam in member.typeParams %} + {% if forloop.first %} + [ + {% endif %} + {% if forloop.last %} + {{ tparam }} + ] + {% else %} + {{ tparam }}, + {% endif %} + {% endfor %} + {% if member.alias != null %} = {% renderRef member.alias %} {% endif %} + {% endif %} {% if member.returnValue %} : {% renderRef member.returnValue %} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala index 7f44c5656..cfb66fa56 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala @@ -8,7 +8,7 @@ import dotc.CompilationUnit import dotc.config.Printers.dottydoc import dotc.core.Contexts.Context import dotc.core.Comments.ContextDocstrings -import dotc.core.Types.NoType +import dotc.core.Types.{PolyType, NoType} import dotc.core.Phases.Phase import dotc.core.Symbols.{ Symbol, NoSymbol } @@ -92,8 +92,16 @@ class DocASTPhase extends Phase { val sym = t.symbol 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)) + else { + val tparams = t.rhs.tpe match { + case tp: PolyType => tp.paramRefs.zip(tp.variances).map { case (tp, variance) => + val varianceSym = if (variance == 1) "+" else if (variance == -1) "-" else "" + varianceSym + tp.paramName.show + } + case _ => Nil + } + TypeAliasImpl(sym, annotations(sym), flags(t), t.name.show.split("\\$\\$").last, path(sym), alias(t.rhs.tpe), tparams) + } /** trait */ case t @ TypeDef(n, rhs) if t.symbol.is(Flags.Trait) => diff --git a/doc-tool/src/dotty/tools/dottydoc/core/transform.scala b/doc-tool/src/dotty/tools/dottydoc/core/transform.scala index e4b9ae6b6..5174c0922 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/transform.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/transform.scala @@ -92,6 +92,7 @@ object transform { t.name, t.path, t.alias, + t.typeParams, t.comment, t.parent ) diff --git a/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala b/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala index 239656141..4a9bfce0c 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala @@ -189,6 +189,7 @@ object JavaConverters { "name" -> ent.name, "path" -> ent.path.asJava, "alias" -> ent.alias.map(_.asJava).asJava, + "typeParams" -> ent.typeParams.asJava, "comment" -> ent.comment.map(_.asJava).asJava, "hasShortenedDocstring" -> ent.hasShortenedDocstring, "isPrivate" -> ent.isPrivate, diff --git a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala index d35077816..d0f1a82c7 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala @@ -108,7 +108,7 @@ trait Package extends Entity with Members with SuperTypes { val kind = "package" } -trait TypeAlias extends Entity with Modifiers { +trait TypeAlias extends Entity with Modifiers with TypeParams { val kind = "type" def alias: Option[Reference] def isAbstract: Boolean = !alias.isDefined diff --git a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala index 568b532b7..3e766a990 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala @@ -4,7 +4,8 @@ package model import comment._ import references._ import dotty.tools.dotc -import dotc.core.Types._ +import dotc.core.Types +import Types._ import dotc.core.TypeApplications._ import dotc.core.Contexts.Context import dotc.core.Symbols.{ Symbol, ClassSymbol } @@ -105,17 +106,8 @@ object factories { case ci: ClassInfo => typeRef(ci.cls.name.show, query = ci.typeSymbol.showFullName) - case tl: PolyType => { - // FIXME: should be handled correctly - // example, in `Option`: - // - // ```scala - // def companion: GenericCompanion[collection.Iterable] - // ``` - // - // Becomes: def companion: [+X0] -> collection.Iterable[X0] - typeRef(tl.show + " (not handled)") - } + case tl: PolyType => + expandTpe(tl.resType) case OrType(left, right) => OrTypeReference(expandTpe(left), expandTpe(right)) @@ -148,6 +140,8 @@ object factories { prefix + tp.name.show.split("\\$").last } .toList + case tp: Types.TypeAlias => + typeParams(tp.alias.typeSymbol) case _ => Nil } diff --git a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala index bf50c0232..b50c93ee5 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala @@ -31,6 +31,7 @@ object internal { name: String, path: List[String], alias: Option[Reference], + typeParams: List[String] = Nil, var comment: Option[Comment] = None, var parent: Entity = NonEntity ) extends TypeAlias -- cgit v1.2.3