blob: ecbea1fb77cf01e7d6ff7eb1dd66e74348fbe526 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
}
}
}
|