From 2c08c956d39d9a06b3c5aa7eddc3b8c903f807df Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Fri, 13 Jan 2017 11:39:48 +0100 Subject: Add annotations to doc AST --- doc-tool/resources/_layouts/api-page.html | 3 +++ doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala | 14 ++++++++------ .../src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala | 7 +++++++ doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala | 1 + doc-tool/src/dotty/tools/dottydoc/model/entities.scala | 13 ++++++++----- doc-tool/src/dotty/tools/dottydoc/model/factories.scala | 2 ++ doc-tool/src/dotty/tools/dottydoc/model/internal.scala | 7 +++++++ doc-tool/src/dotty/tools/dottydoc/model/java.scala | 7 +++++++ doc-tool/test/ConstructorTest.scala | 14 +++++++------- doc-tool/test/PackageStructure.scala | 7 ++++--- doc-tool/test/UsecaseTest.scala | 10 +++++----- 11 files changed, 59 insertions(+), 26 deletions(-) (limited to 'doc-tool') diff --git a/doc-tool/resources/_layouts/api-page.html b/doc-tool/resources/_layouts/api-page.html index 41daf6c47..1f5a441de 100644 --- a/doc-tool/resources/_layouts/api-page.html +++ b/doc-tool/resources/_layouts/api-page.html @@ -29,6 +29,9 @@ extraCSS: {% for member in entity.members %}
+ + {% for annot in member.annotations %}@{{ annot | split: '.' | last }} {% endfor %} + {{ member.modifiers | join: " " }} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala index bb1ed5182..0ad199ca2 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala @@ -51,6 +51,7 @@ class DocASTPhase extends Phase { .map { meth => DefImpl( meth.symbol, + annotations(meth.symbol), meth.symbol.name.show, Nil, path(meth.symbol), @@ -64,6 +65,7 @@ class DocASTPhase extends Phase { val vals = sym.info.fields.filterNot(_.symbol.is(Flags.Private | Flags.Synthetic)).map { value => ValImpl( value.symbol, + annotations(value.symbol), value.symbol.name.show, Nil, path(value.symbol), returnType(value.info), @@ -81,34 +83,34 @@ class DocASTPhase extends Phase { /** package */ case pd @ PackageDef(pid, st) => val pkgPath = path(pd.symbol) - addEntity(PackageImpl(pd.symbol, pd.symbol.showFullName, collectEntityMembers(st, pkgPath), pkgPath)) + addEntity(PackageImpl(pd.symbol, annotations(pd.symbol), pd.symbol.showFullName, collectEntityMembers(st, pkgPath), pkgPath)) /** trait */ case t @ TypeDef(n, rhs) if t.symbol.is(Flags.Trait) => //TODO: should not `collectMember` from `rhs` - instead: get from symbol, will get inherited members as well - TraitImpl(t.symbol, n.show, collectMembers(rhs), flags(t), path(t.symbol), typeParams(t.symbol), traitParameters(t.symbol), superTypes(t)) + TraitImpl(t.symbol, annotations(t.symbol), n.show, collectMembers(rhs), flags(t), path(t.symbol), typeParams(t.symbol), traitParameters(t.symbol), superTypes(t)) /** objects, on the format "Object$" so drop the last letter */ case o @ TypeDef(n, rhs) if o.symbol.is(Flags.Module) => val name = o.name.show //TODO: should not `collectMember` from `rhs` - instead: get from symbol, will get inherited members as well - ObjectImpl(o.symbol, name.dropRight(1), collectMembers(rhs, prev :+ name), flags(o), path(o.symbol).init :+ name, superTypes(o)) + ObjectImpl(o.symbol, annotations(o.symbol), name.dropRight(1), collectMembers(rhs, prev :+ name), flags(o), path(o.symbol).init :+ name, superTypes(o)) /** class / case class */ case c @ TypeDef(n, rhs) if c.symbol.isClass => //TODO: should not `collectMember` from `rhs` - instead: get from symbol, will get inherited members as well - (c.symbol, n.show, collectMembers(rhs), flags(c), path(c.symbol), typeParams(c.symbol), constructors(c.symbol), superTypes(c), None) match { + (c.symbol, annotations(c.symbol), n.show, collectMembers(rhs), flags(c), path(c.symbol), typeParams(c.symbol), constructors(c.symbol), superTypes(c), None) match { case x if c.symbol.is(Flags.CaseClass) => CaseClassImpl.tupled(x) case x => ClassImpl.tupled(x) } /** def */ case d: DefDef => - DefImpl(d.symbol, d.name.decode.toString, flags(d), path(d.symbol), returnType(d.tpt.tpe), typeParams(d.symbol), paramLists(d.symbol.info)) + DefImpl(d.symbol, annotations(d.symbol), d.name.decode.toString, flags(d), path(d.symbol), returnType(d.tpt.tpe), typeParams(d.symbol), paramLists(d.symbol.info)) /** val */ case v: ValDef if !v.symbol.is(Flags.ModuleVal) => - ValImpl(v.symbol, v.name.decode.toString, flags(v), path(v.symbol), returnType(v.tpt.tpe)) + ValImpl(v.symbol, annotations(v.symbol), v.name.decode.toString, flags(v), path(v.symbol), returnType(v.tpt.tpe)) case x => { //dottydoc.println(s"Found unwanted entity: $x (${x.pos},\n${x.show}") diff --git a/doc-tool/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala b/doc-tool/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala index 150a4e08f..100e0af6b 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala @@ -80,6 +80,7 @@ object transform { case p: Package => transformEntity(p, _.packageTransformation) { p => val newPackage = PackageImpl( p.symbol, + p.annotations, p.name, p.members.map(traverse), p.path, @@ -94,6 +95,7 @@ object transform { case c: Class => transformEntity(c, _.classTransformation) { cls => ClassImpl( cls.symbol, + cls.annotations, cls.name, cls.members.map(traverse), cls.modifiers, @@ -107,6 +109,7 @@ object transform { case cc: CaseClass => transformEntity(cc, _.caseClassTransformation) { cc => CaseClassImpl( cc.symbol, + cc.annotations, cc.name, cc.members.map(traverse), cc.modifiers, @@ -120,6 +123,7 @@ object transform { case trt: Trait => transformEntity(trt, _.traitTransformation) { trt => TraitImpl( trt.symbol, + trt.annotations, trt.name, trt.members.map(traverse), trt.modifiers, @@ -133,6 +137,7 @@ object transform { case obj: Object => transformEntity(obj, _.objectTransformation) { obj => ObjectImpl( obj.symbol, + obj.annotations, obj.name, obj.members.map(traverse), obj.modifiers, @@ -144,6 +149,7 @@ object transform { case df: Def => transformEntity(df, _.defTransformation) { df => DefImpl( df.symbol, + df.annotations, df.name, df.modifiers, df.path, @@ -157,6 +163,7 @@ object transform { case vl: Val => transformEntity(vl, _.valTransformation) { vl => ValImpl( vl.symbol, + vl.annotations, vl.name, vl.modifiers, vl.path, diff --git a/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala index 47376eb26..5940df0bc 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala @@ -16,6 +16,7 @@ class UsecasePhase extends DocMiniPhase { val name = d.name.show.split("\\$").head // UseCase defs get $pos appended to their names DefImpl( sym, + annotations(sym), name, flags(d), path(d.symbol).init :+ name, diff --git a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala index 52379f9ad..aea09f745 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala @@ -19,6 +19,8 @@ trait Entity { def parent: Entity + def annotations: List[String] + /** All parents from package level i.e. Package to Object to Member etc */ def parents: List[Entity] = parent match { case NonEntity => Nil @@ -105,12 +107,13 @@ trait Var extends Entity with Modifiers with ReturnValue { } trait NonEntity extends Entity { - val name = "" - val symbol = NoSymbol + val annotations = Nil + val name = "" + val symbol = NoSymbol val comment = None - val path = Nil - val kind = "" - val parent = NonEntity + val path = Nil + val kind = "" + val parent = NonEntity } final case object NonEntity extends NonEntity diff --git a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala index 2976c2f48..e47c683f3 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala @@ -32,6 +32,8 @@ object factories { case sym => path(sym.owner) :+ sym.name.show } + def annotations(sym: Symbol)(implicit ctx: Context): List[String] = + sym.annotations.map(_.symbol.showFullName) private val product = """Product[1-9][0-9]*""".r diff --git a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala index 09f642d0b..9787da7ce 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala @@ -13,6 +13,7 @@ object internal { final case class PackageImpl( symbol: Symbol, + annotations: List[String], name: String, var members: List[Entity], path: List[String], @@ -24,6 +25,7 @@ object internal { final case class ClassImpl( symbol: Symbol, + annotations: List[String], name: String, members: List[Entity], modifiers: List[String], @@ -36,6 +38,7 @@ object internal { final case class CaseClassImpl( symbol: Symbol, + annotations: List[String], name: String, members: List[Entity], modifiers: List[String], @@ -48,6 +51,7 @@ object internal { final case class TraitImpl( symbol: Symbol, + annotations: List[String], name: String, members: List[Entity], modifiers: List[String], @@ -60,6 +64,7 @@ object internal { final case class ObjectImpl( symbol: Symbol, + annotations: List[String], name: String, members: List[Entity], modifiers: List[String], @@ -70,6 +75,7 @@ object internal { final case class DefImpl( symbol: Symbol, + annotations: List[String], name: String, modifiers: List[String], path: List[String], @@ -82,6 +88,7 @@ object internal { final case class ValImpl( symbol: Symbol, + annotations: List[String], name: String, modifiers: List[String], path: List[String], diff --git a/doc-tool/src/dotty/tools/dottydoc/model/java.scala b/doc-tool/src/dotty/tools/dottydoc/model/java.scala index 01dac2685..6ec35875f 100644 --- a/doc-tool/src/dotty/tools/dottydoc/model/java.scala +++ b/doc-tool/src/dotty/tools/dottydoc/model/java.scala @@ -47,6 +47,7 @@ object java { implicit class JavaPackage(val ent: Package) extends AnyVal { def asJava(extras: Map[String, _] = Map.empty): JMap[String, _] = (Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "path" -> ent.path.asJava, "members" -> ent.members.map(_.asJava()).asJava, @@ -57,6 +58,7 @@ object java { implicit class JavaCaseClass(val ent: CaseClass) extends AnyVal { def asJava(extras: Map[String, _] = Map.empty): JMap[String, _] = (Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "members" -> ent.members.map(_.asJava()).asJava, "modifiers" -> ent.modifiers.asJava, @@ -70,6 +72,7 @@ object java { implicit class JavaClass(val ent: Class) extends AnyVal { def asJava(extras: Map[String, _] = Map.empty): JMap[String, _] = (Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "members" -> ent.members.map(_.asJava()).asJava, "modifiers" -> ent.modifiers.asJava, @@ -83,6 +86,7 @@ object java { implicit class JavaTrait(val ent: Trait) extends AnyVal { def asJava(extras: Map[String, _] = Map.empty): JMap[String, _] = (Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "members" -> ent.members.map(_.asJava()).asJava, "modifiers" -> ent.modifiers.asJava, @@ -96,6 +100,7 @@ object java { implicit class JavaObject(val ent: Object) extends AnyVal { def asJava(extras: Map[String, _] = Map.empty): JMap[String, _] = (Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "members" -> ent.members.map(_.asJava()).asJava, "modifiers" -> ent.modifiers.asJava, @@ -108,6 +113,7 @@ object java { implicit class JavaDef(val ent: Def) extends AnyVal { def asJava: JMap[String, _] = Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "modifiers" -> ent.modifiers.asJava, "path" -> ent.path.asJava, @@ -122,6 +128,7 @@ object java { implicit class JavaVal(val ent: Val) extends AnyVal { def asJava: JMap[String, _] = Map( "kind" -> ent.kind, + "annotations" -> ent.annotations.asJava, "name" -> ent.name, "modifiers" -> ent.modifiers.asJava, "path" -> ent.path.asJava, diff --git a/doc-tool/test/ConstructorTest.scala b/doc-tool/test/ConstructorTest.scala index 99192985a..76abce100 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 54ff1b9e7..be80c57fc 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}'" @@ -62,9 +62,10 @@ class PackageStructure extends DottyDocTest { checkSources(source1 :: source2 :: Nil) { packages => packages("scala") match { case PackageImpl( + _, _, "scala", - List(PackageImpl(_, "scala.collection", List(tA, tB), _, _)), + List(PackageImpl(_, _, "scala.collection", List(tA, tB), _, _)), _, _ ) => assert( @@ -77,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 2a5ae4602..2731517e7 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