summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/classpath/IRClasspath.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/classpath/IRClasspath.scala')
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/classpath/IRClasspath.scala69
1 files changed, 69 insertions, 0 deletions
diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/classpath/IRClasspath.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/classpath/IRClasspath.scala
new file mode 100644
index 0000000..a92293b
--- /dev/null
+++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/classpath/IRClasspath.scala
@@ -0,0 +1,69 @@
+/* __ *\
+** ________ ___ / / ___ __ ____ Scala.js tools **
+** / __/ __// _ | / / / _ | __ / // __/ (c) 2013-2014, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ **
+** /____/\___/_/ |_/____/_/ | |__/ /____/ **
+** |/____/ **
+\* */
+
+
+package scala.scalajs.tools.classpath
+
+import scala.collection.immutable.{Seq, Traversable}
+
+import scala.scalajs.tools.sem.Semantics
+import scala.scalajs.tools.io._
+import scala.scalajs.tools.logging._
+import scala.scalajs.tools.optimizer.ScalaJSOptimizer
+import scala.scalajs.tools.jsdep.ResolutionInfo
+
+/** A [[CompleteClasspath]] that contains only IR as scalaJSCode */
+final class IRClasspath(
+ /** The JS libraries the IR code depends on */
+ jsLibs: Seq[ResolvedJSDependency],
+ val requiredCompliance: Traversable[ComplianceRequirement],
+ /** The IR itself. Ancestor count is used for later ordering */
+ val scalaJSIR: Traversable[VirtualScalaJSIRFile],
+ requiresDOM: Boolean,
+ version: Option[String]
+) extends CompleteClasspath(jsLibs, requiresDOM, version) {
+
+ /** Orders and optimizes the contained IR.
+ *
+ * Consider using [[ScalaJSOptimizer]] for a canonical way to do so. It
+ * allows to persist the resulting file and create a source map, as well as
+ * using non-default [[Semantics]].
+ */
+ override lazy val scalaJSCode: VirtualJSFile = {
+ import ScalaJSOptimizer._
+
+ val outName = "temporary-fastOpt.js"
+
+ if (scalaJSIR.nonEmpty) {
+ val semantics = Semantics.compliantTo(requiredCompliance.map(_.semantics))
+ val output = WritableMemVirtualJSFile(outName)
+ new ScalaJSOptimizer(semantics).optimizeCP(
+ Inputs(this),
+ OutputConfig(output),
+ NullLogger)
+ output
+ } else {
+ // We cannot run the optimizer without IR, because it will complain about
+ // java.lang.Object missing. However, an empty JS file is perfectly valid
+ // for no IR at all.
+ VirtualJSFile.empty(outName)
+ }
+ }
+
+ /** Checks whether the given semantics are compliant with the requirements of
+ * this CompleteClasspath. Throws an exception otherwise.
+ */
+ final def checkCompliance(semantics: Semantics): Unit = {
+ val unmet = requiredCompliance filterNot { compliance =>
+ semantics.isCompliant(compliance.semantics)
+ }
+
+ if (unmet.nonEmpty)
+ throw new BadComplianceException(unmet.toList)
+ }
+}