All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalajs.jsenv.LinkingUnitJSEnv.scala Maven / Gradle / Ivy

/*                     __                                               *\
**     ________ ___   / /  ___      __ ____  Scala.js sbt plugin        **
**    / __/ __// _ | / /  / _ | __ / // __/  (c) 2013, LAMP/EPFL        **
**  __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \    http://scala-js.org/       **
** /____/\___/_/ |_/____/_/ | |__/ /____/                               **
**                          |/____/                                     **
\*                                                                      */


package org.scalajs.jsenv

import org.scalajs.core.tools.io.VirtualJSFile
import org.scalajs.core.tools.jsdep.ResolvedJSDependency
import org.scalajs.core.tools.linker.LinkingUnit
import org.scalajs.core.tools.linker.analyzer.SymbolRequirement

trait LinkingUnitJSEnv extends JSEnv {
  /** Symbols this [[LinkingUnitJSEnv]] needs present in the
   *  [[org.scalajs.core.tools.linker.LinkingUnit LinkingUnit]] it receives.
   */
  val symbolRequirements: SymbolRequirement

  /** Prepare a runner for the code in the virtual file. */
  def jsRunner(preLibs: Seq[ResolvedJSDependency], linkingUnit: LinkingUnit,
      postLibs: Seq[ResolvedJSDependency], code: VirtualJSFile): JSRunner

  override def loadLibs(libs: Seq[ResolvedJSDependency]): LinkingUnitJSEnv =
    new LinkingUnitLoadedLibs { val loadedLibs = libs }

  /** Returns a [[JSEnv]] with the given
   *  [[org.scalajs.core.tools.linker.LinkingUnit LinkingUnit]] already loaded.
   *
   *  Note that any subsequent libraries will be inserted after the
   *  [[org.scalajs.core.tools.linker.LinkingUnit LinkingUnit]].
   *
   *  Hence, the following are equivalent:
   *  {{{
   *  jsEnv.loadUnit(a).jsRunner(b, c)
   *  jsEnv.jsRunner(Nil, a, b, c)
   *  }}}
   *
   *  If you need to load libraries before, you can use the [[loadLibs]] method:
   *  {{{
   *  jsEnv.loadLibs(a).loadUnit(b).jsRunner(c, d)
   *  // equivalent to
   *  jsEnv.jsRunner(a, b, c, d)
   *  }}}
   */
  def loadLinkingUnit(linkingUnit: LinkingUnit): JSEnv =
    new LoadedUnit { val loadedUnit = linkingUnit }

  private[jsenv] trait LinkingUnitLoadedLibs
      extends LoadedLibs with LinkingUnitJSEnv {
    val symbolRequirements: SymbolRequirement =
      LinkingUnitJSEnv.this.symbolRequirements

    def jsRunner(preLibs: Seq[ResolvedJSDependency], linkingUnit: LinkingUnit,
        postLibs: Seq[ResolvedJSDependency], code: VirtualJSFile): JSRunner = {
      LinkingUnitJSEnv.this.jsRunner(loadedLibs ++ preLibs,
          linkingUnit, postLibs, code)
    }
  }

  private[jsenv] trait LoadedUnit extends JSEnv {
    val loadedUnit: LinkingUnit

    def name: String = LinkingUnitJSEnv.this.name

    def jsRunner(libs: Seq[ResolvedJSDependency], code: VirtualJSFile): JSRunner =
      LinkingUnitJSEnv.this.jsRunner(Nil, loadedUnit, libs, code)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy