summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/corelib/CoreJSLibs.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/corelib/CoreJSLibs.scala')
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/corelib/CoreJSLibs.scala113
1 files changed, 113 insertions, 0 deletions
diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/corelib/CoreJSLibs.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/corelib/CoreJSLibs.scala
new file mode 100644
index 0000000..ecbea1f
--- /dev/null
+++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/corelib/CoreJSLibs.scala
@@ -0,0 +1,113 @@
+/* __ *\
+** ________ ___ / / ___ __ ____ Scala.js tools **
+** / __/ __// _ | / / / _ | __ / // __/ (c) 2013-2014, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ **
+** /____/\___/_/ |_/____/_/ | |__/ /____/ **
+** |/____/ **
+\* */
+
+
+package scala.scalajs.tools.corelib
+
+import java.net.URI
+
+import scala.scalajs.ir.ScalaJSVersions
+import scala.scalajs.tools.io._
+
+import scala.scalajs.tools.sem._
+
+import scala.collection.immutable.Seq
+import scala.collection.mutable
+
+object CoreJSLibs {
+
+ private val cachedLibBySemantics =
+ mutable.HashMap.empty[Semantics, VirtualJSFile]
+
+ private val ScalaJSEnvLines =
+ ScalaJSEnvHolder.scalajsenv.split("\n|\r\n?")
+
+ private val gitHubBaseURI =
+ new URI("https://raw.githubusercontent.com/scala-js/scala-js/")
+
+ def libs(semantics: Semantics): Seq[VirtualJSFile] = synchronized {
+ Seq(cachedLibBySemantics.getOrElseUpdate(semantics, makeLib(semantics)))
+ }
+
+ private def makeLib(semantics: Semantics): VirtualJSFile = {
+ new ScalaJSEnvVirtualJSFile(makeContent(semantics))
+ }
+
+ private def makeContent(semantics: Semantics): String = {
+ // This is a basic sort-of-C-style preprocessor
+
+ def getOption(name: String): String = name match {
+ case "asInstanceOfs" =>
+ semantics.asInstanceOfs.toString()
+ case "floats" =>
+ if (semantics.strictFloats) "Strict"
+ else "Loose"
+ }
+
+ var skipping = false
+ var skipDepth = 0
+ val lines = for (line <- ScalaJSEnvLines) yield {
+ val includeThisLine = if (skipping) {
+ if (line == "//!else" && skipDepth == 1) {
+ skipping = false
+ skipDepth = 0
+ } else if (line == "//!endif") {
+ skipDepth -= 1
+ if (skipDepth == 0)
+ skipping = false
+ } else if (line.startsWith("//!if ")) {
+ skipDepth += 1
+ }
+ false
+ } else {
+ if (line.startsWith("//!")) {
+ if (line.startsWith("//!if ")) {
+ val Array(_, option, op, value) = line.split(" ")
+ val optionValue = getOption(option)
+ val success = op match {
+ case "==" => optionValue == value
+ case "!=" => optionValue != value
+ }
+ if (!success) {
+ skipping = true
+ skipDepth = 1
+ }
+ } else if (line == "//!else") {
+ skipping = true
+ skipDepth = 1
+ } else if (line == "//!endif") {
+ // nothing to do
+ } else {
+ throw new MatchError(line)
+ }
+ false
+ } else {
+ true
+ }
+ }
+ if (includeThisLine) line
+ else "" // blank line preserves line numbers in source maps
+ }
+
+ lines.mkString("", "\n", "\n")
+ }
+
+ private class ScalaJSEnvVirtualJSFile(override val content: String) extends VirtualJSFile {
+ override def path: String = "scalajsenv.js"
+ override def version: Option[String] = Some("")
+ override def exists: Boolean = true
+
+ override def toURI: URI = {
+ if (!ScalaJSVersions.currentIsSnapshot)
+ gitHubBaseURI.resolve(s"v${ScalaJSVersions.current}/tools/$path")
+ else
+ super.toURI
+ }
+ }
+
+}