aboutsummaryrefslogtreecommitdiff
path: root/dottydoc
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2016-05-31 15:17:02 +0200
committerFelix Mulder <felix.mulder@gmail.com>2016-08-19 15:37:25 +0200
commit79133f9454bf56521bb07a4402d3f0a29ab22e81 (patch)
treeb742314c2f2b721d8704b68d9cfc760dc4eaf25b /dottydoc
parent4b99e29b7de0bb5725d9e63a2c44f9e633685a6e (diff)
downloaddotty-79133f9454bf56521bb07a4402d3f0a29ab22e81.tar.gz
dotty-79133f9454bf56521bb07a4402d3f0a29ab22e81.tar.bz2
dotty-79133f9454bf56521bb07a4402d3f0a29ab22e81.zip
Add interface for interacting with serialized case classes on frontend
Diffstat (limited to 'dottydoc')
-rw-r--r--dottydoc/js/src/DottyDoc.scala12
-rw-r--r--dottydoc/js/src/EntityIndex.scala35
-rw-r--r--dottydoc/js/src/model/entities.scala71
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala19
4 files changed, 104 insertions, 33 deletions
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
}