diff options
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.scala | 69 |
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) + } +} |