summaryrefslogtreecommitdiff
path: root/examples/scala-js/compiler/src/main/scala/scala/scalajs/compiler/JSTreeExtractors.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/compiler/src/main/scala/scala/scalajs/compiler/JSTreeExtractors.scala')
-rw-r--r--examples/scala-js/compiler/src/main/scala/scala/scalajs/compiler/JSTreeExtractors.scala66
1 files changed, 66 insertions, 0 deletions
diff --git a/examples/scala-js/compiler/src/main/scala/scala/scalajs/compiler/JSTreeExtractors.scala b/examples/scala-js/compiler/src/main/scala/scala/scalajs/compiler/JSTreeExtractors.scala
new file mode 100644
index 0000000..a18ad88
--- /dev/null
+++ b/examples/scala-js/compiler/src/main/scala/scala/scalajs/compiler/JSTreeExtractors.scala
@@ -0,0 +1,66 @@
+/* Scala.js compiler
+ * Copyright 2013 LAMP/EPFL
+ * @author Tobias Schlatter
+ */
+
+package scala.scalajs.compiler
+
+import scala.annotation.tailrec
+
+import scala.scalajs.ir.Trees._
+import scala.scalajs.ir.Types._
+
+/** Useful extractors for JavaScript trees */
+object JSTreeExtractors {
+
+ object jse {
+ /**
+ * A literally named sequence (like in a call to applyDynamicNamed)
+ *
+ * Example (Scala): method(("name1", x), ("name2", y))
+ */
+ object LitNamed {
+ def unapply(exprs: List[Tree]) = unapply0(exprs, Nil)
+
+ @tailrec
+ private def unapply0(
+ exprs: List[Tree],
+ acc: List[(StringLiteral, Tree)]
+ ): Option[List[(StringLiteral, Tree)]] = exprs match {
+ case Tuple2(name: StringLiteral, value) :: xs =>
+ unapply0(xs, (name, value) :: acc)
+ case Nil => Some(acc.reverse)
+ case _ => None
+ }
+ }
+
+ /**
+ * A literal Tuple2
+ *
+ * Example (Scala): (x, y)
+ * But also (Scala): x -> y
+ */
+ object Tuple2 {
+ def unapply(tree: Tree): Option[(Tree, Tree)] = tree match {
+ // case (x, y)
+ case New(ClassType("T2"), Ident("init___O__O", _),
+ List(_1, _2)) =>
+ Some((_1, _2))
+ // case x -> y
+ case Apply(
+ LoadModule(ClassType("s_Predef$ArrowAssoc$")),
+ Ident("$$minus$greater$extension__O__O__T2", _),
+ List(
+ Apply(
+ LoadModule(ClassType("s_Predef$")),
+ Ident("any2ArrowAssoc__O__O", _),
+ List(_1)),
+ _2)) =>
+ Some((_1, _2))
+ case _ =>
+ None
+ }
+ }
+ }
+
+}