From e4ecaa0d977661954a7c686e3fe8eca2d71dba82 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Wed, 18 Jan 2017 17:45:42 +0100 Subject: Harmonize package objects and packages in Doc AST --- .../src/dotty/tools/dottydoc/DocCompiler.scala | 1 + .../tools/dottydoc/core/PackageObjectsPhase.scala | 35 ++++++++++++++++++++++ .../src/dotty/tools/dottydoc/model/entities.scala | 2 +- .../src/dotty/tools/dottydoc/model/internal.scala | 1 + doc-tool/src/dotty/tools/dottydoc/model/java.scala | 3 ++ doc-tool/src/dotty/tools/dottydoc/model/json.scala | 1 + .../dotty/tools/dottydoc/model/references.scala | 1 + doc-tool/test/ConstructorTest.scala | 14 ++++----- doc-tool/test/PackageStructure.scala | 8 ++--- doc-tool/test/UsecaseTest.scala | 10 +++---- 10 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala (limited to 'doc-tool') diff --git a/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala b/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala index af4aaae4f..55b079adf 100644 --- a/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala +++ b/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala @@ -25,6 +25,7 @@ class DocCompiler extends Compiler { List(new DocASTPhase), List(DocMiniTransformations(new UsecasePhase, new DocstringPhase, + new PackageObjectsPhase, new LinkReturnTypes, new LinkParamListTypes, new LinkImplicitlyAddedTypes, diff --git a/doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala new file mode 100644 index 000000000..adcadb0ba --- /dev/null +++ b/doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala @@ -0,0 +1,35 @@ +package dotty.tools +package dottydoc +package core + +import dotty.tools.dotc.core.Symbols.Symbol +import dotc.core.Contexts.Context +import dotc.ast.tpd + +import model._ +import model.internal._ +import util.syntax._ +import transform.DocMiniPhase + +class PackageObjectsPhase extends DocMiniPhase { + + override def transformPackage(implicit ctx: Context) = { case pkg: PackageImpl => + pkg + .members + .collect { case o: Object if o.symbol.isPackageObject => o } + .headOption + .map { obj => + pkg.copy( + members = obj.members ++ pkg.members, + superTypes = obj.superTypes, + comment = obj.comment + ) + } + .getOrElse(pkg) + } + + override def transformObject(implicit ctx: Context) = { case obj: Object => + if (obj.symbol.isPackageObject) NonEntity + else obj + } +} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala index a40666e0d..613788964 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala @@ -84,7 +84,7 @@ trait ImplicitlyAddedEntity extends Entity { def implicitlyAddedFrom: Option[Reference] } -trait Package extends Entity with Members { +trait Package extends Entity with Members with SuperTypes { val kind = "package" } diff --git a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala index 5bc410706..ac789f29f 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala @@ -17,6 +17,7 @@ object internal { name: String, var members: List[Entity], path: List[String], + superTypes: List[MaterializableLink] = Nil, var comment: Option[Comment] = None ) extends Package with Impl diff --git a/doc-tool/src/dotty/tools/dottydoc/model/java.scala b/doc-tool/src/dotty/tools/dottydoc/model/java.scala index 8e493f889..189012e18 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/java.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/java.scala @@ -52,6 +52,7 @@ object java { "path" -> ent.path.asJava, "members" -> ent.members.map(_.asJava()).asJava, "comment" -> ent.comment.map(_.asJava).asJava, + "superTypes" -> ent.superTypes, "hasVisibleMembers" -> ent.hasVisibleMembers ) ++ extras).asJava } @@ -234,6 +235,8 @@ object java { "title" -> title, "scala" -> ref ).asJava + + case EmptyReference => ??? } } diff --git a/doc-tool/src/dotty/tools/dottydoc/model/json.scala b/doc-tool/src/dotty/tools/dottydoc/model/json.scala index 145728f8a..766f0c147 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/json.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/json.scala @@ -63,6 +63,7 @@ object json { s"""{"args":${ref.args.map(refToJson).mkString("[",",","]")},"returnValue":${refToJson(ref.returnValue)},"kind": "FunctionReference"}""" case ref: TupleReference => s"""{"args":${ref.args.map(refToJson).mkString("[",",","]")},"kind": "TupleReference"}""" + case EmptyReference => ??? } implicit class ReferenceJson(val ref: Reference) extends AnyVal { def json: String = refToJson(ref) } diff --git a/doc-tool/src/dotty/tools/dottydoc/model/references.scala b/doc-tool/src/dotty/tools/dottydoc/model/references.scala index 766b2a340..02304b302 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/references.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/references.scala @@ -11,6 +11,7 @@ object references { final case class BoundsReference(low: Reference, high: Reference) extends Reference final case class NamedReference(title: String, ref: Reference, isByName: Boolean = false, isRepeated: Boolean = false) extends Reference final case class ConstantReference(title: String) extends Reference + final case object EmptyReference extends Reference /** Use MaterializableLink for entities that need be picklable */ sealed trait MaterializableLink { def title: String } diff --git a/doc-tool/test/ConstructorTest.scala b/doc-tool/test/ConstructorTest.scala index 76abce100..4808ceab3 100644 --- a/doc-tool/test/ConstructorTest.scala +++ b/doc-tool/test/ConstructorTest.scala @@ -22,7 +22,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _) => + case PackageImpl(_, _, _, List(cls: Class), _, _, _) => cls.constructors.headOption match { case Some(ParamListImpl(NamedReference("str", _, false, false) :: Nil, false) :: Nil) => // success! @@ -44,7 +44,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _) => + case PackageImpl(_, _, _, List(cls: Class), _, _, _) => cls.constructors match { case ( ParamListImpl(NamedReference("str1", _, false, false) :: Nil, false) :: @@ -69,7 +69,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _) => + case PackageImpl(_, _, _, List(cls: Class), _, _, _) => cls.constructors match { case ( ParamListImpl(NamedReference("str1", _, false, false) :: Nil, false) :: @@ -101,7 +101,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _) => + case PackageImpl(_, _, _, List(cls: Class), _, _, _) => cls.constructors match { case ( ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil @@ -139,7 +139,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(cls: CaseClass, obj: Object), _, _) => + case PackageImpl(_, _, _, List(cls: CaseClass, obj: Object), _, _, _) => cls.constructors match { case ( ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil @@ -172,7 +172,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _) => + case PackageImpl(_, _, _, List(trt: Trait), _, _, _) => trt.traitParams match { case ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil => case _ => @@ -199,7 +199,7 @@ class Constructors extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(cc: CaseClass, _, cls: Class, trt: Trait), _, _) => + case PackageImpl(_, _, _, List(cc: CaseClass, _, cls: Class, trt: Trait), _, _, _) => import model.json._ lazy val incorrectJson = s"The json generated for:\n$actualSource\n\nIs not correct" assert(cc.json.contains(s""""constructors":[[{"list":[{"title":"main""""), incorrectJson) diff --git a/doc-tool/test/PackageStructure.scala b/doc-tool/test/PackageStructure.scala index be80c57fc..b242d2f39 100644 --- a/doc-tool/test/PackageStructure.scala +++ b/doc-tool/test/PackageStructure.scala @@ -29,7 +29,7 @@ class PackageStructure extends DottyDocTest { checkSources(source1 :: source2 :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(tA, tB), _, _) => + case PackageImpl(_, _, _, List(tA, tB), _, _, _) => assert( tA.name == "A" && tB.name == "B", s"trait A had name '${tA.name}' and trait B had name '${tB.name}'" @@ -65,8 +65,8 @@ class PackageStructure extends DottyDocTest { _, _, "scala", - List(PackageImpl(_, _, "scala.collection", List(tA, tB), _, _)), - _, _ + List(PackageImpl(_, _, "scala.collection", List(tA, tB), _, _, _)), + _, _, _ ) => assert( tA.name == "A" && tB.name == "B", @@ -78,7 +78,7 @@ class PackageStructure extends DottyDocTest { } packages("scala.collection") match { - case PackageImpl(_, _, "scala.collection", List(tA, tB), _, _) => + case PackageImpl(_, _, "scala.collection", List(tA, tB), _, _, _) => assert( tA.name == "A" && tB.name == "B", s"trait A had name '${tA.name}' and trait B had name '${tB.name}'" diff --git a/doc-tool/test/UsecaseTest.scala b/doc-tool/test/UsecaseTest.scala index 2731517e7..bc896ed8d 100644 --- a/doc-tool/test/UsecaseTest.scala +++ b/doc-tool/test/UsecaseTest.scala @@ -29,7 +29,7 @@ class UsecaseTest extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _) => + case PackageImpl(_, _, _, List(trt: Trait), _, _, _) => val List(foo: Def) = trt.members assert(foo.comment.isDefined, "Lost comment in transformations") @@ -73,7 +73,7 @@ class UsecaseTest extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _) => + case PackageImpl(_, _, _, List(trt: Trait), _, _, _) => val List(foo: Def) = trt.members val returnValue = foo.returnValue match { @@ -118,7 +118,7 @@ class UsecaseTest extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _) => + case PackageImpl(_, _, _, List(trt: Trait), _, _, _) => val List(foo: Def) = trt.members val returnValue = foo.returnValue match { @@ -166,7 +166,7 @@ class UsecaseTest extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _) => + case PackageImpl(_, _, _, List(trt: Trait), _, _, _) => val List(map: Def) = trt.members val returnValue = map.returnValue match { @@ -209,7 +209,7 @@ class UsecaseTest extends DottyDocTest { checkSources(source :: Nil) { packages => packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _) => + case PackageImpl(_, _, _, List(trt: Trait), _, _, _) => val List(map: Def) = trt.members assert(map.comment.isDefined, "Lost comment in transformations") -- cgit v1.2.3