From 79133f9454bf56521bb07a4402d3f0a29ab22e81 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Tue, 31 May 2016 15:17:02 +0200 Subject: Add interface for interacting with serialized case classes on frontend --- dottydoc/js/src/DottyDoc.scala | 12 ++-- dottydoc/js/src/EntityIndex.scala | 35 +++++------ dottydoc/js/src/model/entities.scala | 71 ++++++++++++++++++++++ .../jvm/src/dotty/tools/dottydoc/model/json.scala | 19 +++--- 4 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 dottydoc/js/src/model/entities.scala (limited to 'dottydoc') diff --git a/dottydoc/js/src/DottyDoc.scala b/dottydoc/js/src/DottyDoc.scala index d08bd8cc8..48989b66c 100644 --- a/dottydoc/js/src/DottyDoc.scala +++ b/dottydoc/js/src/DottyDoc.scala @@ -1,10 +1,10 @@ package dotty.tools.dottydoc package js -import scala.scalajs.js -import js.Dynamic.global -import js.JSApp -import js.annotation.{ JSExport, JSName } +import scala.scalajs.{ js => sjs } +import sjs.Dynamic.global +import sjs.JSApp +import sjs.annotation.{ JSExport, JSName } import org.scalajs.dom import dom.document import dom.webworkers.Worker @@ -20,6 +20,6 @@ import html.EntityLayout } /** Library wrapper for highlighting */ -@js.native object hljs extends js.Object { - def initHighlightingOnLoad(): js.Any = js.native +@sjs.native object hljs extends sjs.Object { + def initHighlightingOnLoad(): sjs.Any = sjs.native } diff --git a/dottydoc/js/src/EntityIndex.scala b/dottydoc/js/src/EntityIndex.scala index e58cdf88e..b6fe1842f 100644 --- a/dottydoc/js/src/EntityIndex.scala +++ b/dottydoc/js/src/EntityIndex.scala @@ -1,35 +1,30 @@ -package dotty.tools.dottydoc +package dotty.tools +package dottydoc package js -import scala.scalajs.js -import js.Dynamic.global -import js.JSApp -import js.annotation.JSName +import scala.scalajs.{ js => sjs } +import sjs.JSConverters._ +import sjs.Dynamic.global +import sjs.JSApp +import sjs.annotation.JSName /** The unpickled AST available as scala classes */ object EntityIndex { - import microjson._ import prickle._ - import model._ - import model.pickling._ + import dottydoc.model.pickling._ + import js.model._ lazy val packages: Map[String, Package] = - //FIXME - //Unpickle[Map[String, Package]] - //.fromString(js.JSON.stringify(Unparsed.packages)) - //.from[js.Object](Unparsed.packages) - //.toOption - None - .getOrElse(Map.empty) + Unparsed.packages.toMap[String, Package] - val currentEntity: Entity = Unpickle[Entity] - .fromString(js.JSON.stringify(Unparsed.currentEntity)) + val currentEntity: dottydoc.model.Entity = Unpickle[dottydoc.model.Entity] + .fromString(sjs.JSON.stringify(Unparsed.currentEntity)) .toOption .get /** Unparsed index stores the pickled AST generated by the dottydoc tool */ - @js.native @JSName("UnparsedIndex") private object Unparsed extends js.Object { - def packages: js.Object = js.native - def currentEntity: js.Object = js.native + @sjs.native @JSName("UnparsedIndex") private object Unparsed extends sjs.Object { + def packages: sjs.Dictionary[Package] = sjs.native + def currentEntity: sjs.Object = sjs.native } } diff --git a/dottydoc/js/src/model/entities.scala b/dottydoc/js/src/model/entities.scala new file mode 100644 index 000000000..27db4ec0a --- /dev/null +++ b/dottydoc/js/src/model/entities.scala @@ -0,0 +1,71 @@ +package dotty.tools +package dottydoc +package js +package model + +import scala.scalajs.{ js => sjs } + +/** This file defines the interface for which to interact with the searchable + * index. To use the normal operations available on the traits on the JVM: + * + * {{{ + * import dotty.tools.dottydoc.js.model.ops._ + * val x: Package = ... + * }}} + * + * Please note that some of the actual fields have not been added to this + * interface, this is simply due to the fact that they're not necessary for + * search - YET. They could be added, for instance `comment` is missing. + */ +@sjs.native +trait Entity extends sjs.Any { + val kind: String = sjs.native + + val name: String = sjs.native + + val path: sjs.Array[String] = sjs.native + + val parent: Entity = sjs.native +} + +@sjs.native +trait Members extends sjs.Any { + val members: sjs.Array[Entity] = sjs.native +} + +@sjs.native +trait Package extends Entity with Members + +@sjs.native +trait Class extends Entity with Members + +@sjs.native +trait CaseClass extends Entity with Members + +@sjs.native +trait Object extends Class + +@sjs.native +trait Trait extends Class + +@sjs.native +trait Def extends Entity + +@sjs.native +trait Val extends Def + +@sjs.native +trait Var extends Def + +object ops { + val EntitiesWithMembers = + "package" :: "case class" :: "class" :: "object" :: "trait" :: Nil + + implicit class PackageOps(val p: Package) { + def children: sjs.Array[Entity with Members] = + p.members.collect { + case x if EntitiesWithMembers contains x.kind => + x.asInstanceOf[Entity with Members] + } + } +} diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala index 02d4ecf02..ba1438c7a 100644 --- a/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala +++ b/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala @@ -33,14 +33,19 @@ object json extends DefaultJsonProtocol { } implicit object EntityJsonFormat extends RootJsonFormat[Entity] { + private def addKind(json: JsValue, kind: String): JsValue = json match { + case json: JsObject => JsObject(json.fields + ("kind" -> JsString(kind))) + case other => other + } + def write(e: Entity) = e match { - case e: PackageImpl => e.toJson - case e: ClassImpl => e.toJson - case e: CaseClassImpl => e.toJson - case e: TraitImpl => e.toJson - case e: ObjectImpl => e.toJson - case e: DefImpl => e.toJson - case e: ValImpl => e.toJson + case e: PackageImpl => addKind(e.toJson, "package") + case e: ClassImpl => addKind(e.toJson, "class") + case e: CaseClassImpl => addKind(e.toJson, "case class") + case e: TraitImpl => addKind(e.toJson, "trait") + case e: ObjectImpl => addKind(e.toJson, "object") + case e: DefImpl => addKind(e.toJson, "def") + case e: ValImpl => addKind(e.toJson, "val") } def read(json: JsValue) = ??? // The json serialization is supposed to be one way } -- cgit v1.2.3