global.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 724 行 · 第 1/2 页

SCALA
724
字号
    val global: Global.this.type = Global.this  }  object closureElimination extends ClosureElimination {    val global: Global.this.type = Global.this  }  object deadCode extends DeadCodeElimination {    val global: Global.this.type = Global.this  }  object genJVM extends GenJVM {    val global: Global.this.type = Global.this  }  object genMSIL extends GenMSIL {    val global: Global.this.type = Global.this  }  object icodeChecker extends checkers.ICodeChecker()  object typer extends analyzer.Typer(    analyzer.NoContext.make(EmptyTree, Global.this.definitions.RootClass, newScope))  /** The built-in components.  The full list of components, including   *  plugins, is computed in the Plugins trait.   */  protected def builtInPhaseDescriptors: List[SubComponent] = List(    analyzer.namerFactory: SubComponent, // note: types are there because otherwise    analyzer.typerFactory: SubComponent, // consistency check after refchecks would fail.    superAccessors,  // add super accessors    pickler,         // serializes symbol tables    refchecks       // perform reference and override checking, translate nested objects  ) ::: (    if (forJVM) List(liftcode) else List()  // generate reified trees  ) ::: List(    uncurry,         // uncurry, translate function values to anonymous classes    tailCalls,       // replace tail calls by jumps    explicitOuter,   // replace C.this by explicit outer pointers, eliminate pattern matching//    checkDefined,    erasure,         // erase generic types to Java 1.4 types, add interfaces for traits    lazyVals,    lambdaLift,      // move nested functions to top level//    detach,     constructors,    // move field definitions into constructors    flatten,         // get rid of inner classes    mixer,           // do mixin composition    cleanup,         // some platform-specific cleanups    genicode,        // generate portable intermediate code    inliner,         // optimization: do inlining    closureElimination, // optimization: get rid of uncalled closures    deadCode,           // optimization: get rid of dead cpde    if (forMSIL) genMSIL else genJVM, // generate .class files    sampleTransform  )  private var phasesCache: Option[List[SubComponent]] = None  def phaseDescriptors = {    if (phasesCache.isEmpty)      phasesCache = Some(computePhaseDescriptors)    phasesCache.get  }  /** A description of the phases that will run */  def phaseDescriptions: String = {    new Run // force some initialization    val messages =      for (phase <- phaseDescriptors)	yield phase.phaseName //todo: + " - " + phase.description    messages.mkString("\n")  }  protected def insertBefore(c: SubComponent, cs: List[SubComponent], before: SubComponent): List[SubComponent] = cs match {    case List() => List(c)    case c1 :: cs1 => if (c1 == before) c :: cs else c1 :: insertBefore(c, cs1, before)  }  private var curRun: Run = null  def currentRun: Run = curRun  private var curRunId = 0  override def currentRunId = curRunId  private var runCount = 0  class Run {    curRunId += 1    assert(curRunId > 0)    //Console.println("starting run: " + id)    var currentUnit: CompilationUnit = _    curRun = this    private val firstPhase = syntaxAnalyzer.newPhase(NoPhase)    phase = firstPhase    definitions.init  // needs phase to be defined != NoPhase,                      // that's why it is placed here.    /** Deprecation warnings occurred */    var deprecationWarnings: Boolean = false    var uncheckedWarnings: Boolean = false    private var p: Phase = firstPhase    protected def stopPhase(name : String) =       if (onlyPresentation) name == "superaccessors"      else settings.stop.contains(name)   //  protected def stopPhase(name : String) = settings.stop.contains(name)        for (pd <- phaseDescriptors.takeWhile(pd => !(stopPhase(pd.phaseName))))      if (!(settings.skip contains pd.phaseName)) p = pd.newPhase(p)    def cancel { reporter.cancelled = true }    // progress tracking    def progress(current: Int, total: Int) {}    private var phasec: Int = 0    private var unitc: Int = 0    def advancePhase {      unitc = 0      phasec += 1      refreshProgress    }    def advanceUnit {      unitc += 1      refreshProgress    }    private def refreshProgress = if (fileset.size > 0)      progress((phasec * fileset.size) + unitc,               (phaseDescriptors.length+1) * fileset.size)    def phaseNamed(name: String): Phase = {      var p: Phase = firstPhase      while (p.next != p && p.name != name) p = p.next      if (p.name != name) NoPhase else p    }    val namerPhase = phaseNamed("namer")    val typerPhase = phaseNamed("typer")    val refchecksPhase = phaseNamed("refchecks")    val explicitOuterPhase = phaseNamed("explicitouter")    val erasurePhase = phaseNamed("erasure")    val flattenPhase = phaseNamed("flatten")    val mixinPhase = phaseNamed("mixin")    val icodePhase = phaseNamed("icode")    private var unitbuf = new ListBuffer[CompilationUnit]    private var fileset = new HashSet[AbstractFile]    lazy val terminalPhase : Phase = {      //var q : Phase = firstPhase      //while (q != null && !stopPhase(q.name)) q = q.next      //if (q == null)       new TerminalPhase(p)      //else q    }    private def addUnit(unit: CompilationUnit) {      unitbuf += unit      fileset += unit.source.file    }    def units: Iterator[CompilationUnit] = unitbuf.elements    /** A map from compiled top-level symbols to their source files */    val symSource = new HashMap[Symbol, AbstractFile]    /** A map from compiled top-level symbols to their picklers */    val symData = new HashMap[Symbol, PickleBuffer]    /** does this run compile given class, module, or case factory? */    def compiles(sym: Symbol): Boolean =      if (sym == NoSymbol) false      else if (symSource.isDefinedAt(sym)) true      else if (!sym.owner.isPackageClass) compiles(sym.toplevelClass)      else if (sym.isModuleClass) compiles(sym.sourceModule)      else false    def compileSources(sources: List[SourceFile]) {      if (reporter.hasErrors)        return  // there is a problem already, e.g. a                // plugin was passed a bad option      val startTime = currentTime      reporter.reset      for (source <- sources) addUnit(new CompilationUnit(source))      globalPhase = firstPhase      while (globalPhase != terminalPhase && !reporter.hasErrors) {        val startTime = currentTime        phase = globalPhase        globalPhase.run        if (settings.print contains globalPhase.name)          if (globalPhase.id >= icodePhase.id) writeICode()          else if (settings.Xshowtrees.value) nodePrinters.printAll()           else printAllUnits()        if (settings.printLate.value && globalPhase.name == "cleanup")          printAllUnits()                if (settings.browse contains globalPhase.name) treeBrowser.browse(units)        informTime(globalPhase.description, startTime)        globalPhase = globalPhase.next        if (settings.check contains globalPhase.name) {          phase = globalPhase          if (globalPhase.id >= icodePhase.id) icodeChecker.checkICodes          else checker.checkTrees        }        if (settings.statistics.value) statistics.print(phase)        advancePhase      }      if (settings.Xshowcls.value != "")        showDef(newTermName(settings.Xshowcls.value), false)      if (settings.Xshowobj.value != "")        showDef(newTermName(settings.Xshowobj.value), true)      if (reporter.hasErrors) {        for ((sym, file) <- symSource.elements) {          sym.reset(new loaders.SourcefileLoader(file))          if (sym.isTerm) sym.moduleClass.reset(loaders.moduleClassLoader)        }      } else {        //assert(symData.isEmpty || !settings.stop.value.isEmpty || !settings.skip.value.isEmpty, symData)        if (deprecationWarnings) {          warning("there were deprecation warnings; re-run with " + settings.deprecation.name + " for details")        }        if (uncheckedWarnings) {          warning("there were unchecked warnings; re-run with " + settings.unchecked.name + " for details")        }      }      for ((sym, file) <- symSource.elements) resetPackageClass(sym.owner)      //units foreach (.clear())      informTime("total", startTime)    }    def compileLate(file: AbstractFile) {      if (fileset eq null) {        val msg = "No class file for " + file +                  " was found\n(This file cannot be loaded as a source file)"        inform(msg)        throw new FatalError(msg)      }      else if (!(fileset contains file)) {        val unit = new CompilationUnit(getSourceFile(file))        addUnit(unit)        var localPhase = firstPhase.asInstanceOf[GlobalPhase]        while (localPhase != null && (localPhase.id < globalPhase.id || localPhase.id <= namerPhase.id) && !reporter.hasErrors) {          val oldSource = reporter.getSource                    reporter.setSource(unit.source)                    atPhase(localPhase)(localPhase.applyPhase(unit))          val newLocalPhase = localPhase.next.asInstanceOf[GlobalPhase]          localPhase = if (localPhase == newLocalPhase) null else newLocalPhase          reporter.setSource(oldSource)        }        refreshProgress      }    }    def compileFiles(files: List[AbstractFile]) {      try {        compileSources(files map getSourceFile)      } catch {        case ex: IOException => error(ex.getMessage())      }    }    def compile(filenames: List[String]) {      try {        val scriptMain = settings.script.value        if (scriptMain != "" && filenames.length != 1)          error("can only compile one script at a time")        val sources = filenames map (          if (scriptMain != "")            (x => ScriptRunner.wrappedScript(scriptMain, x, getSourceFile _))          else            getSourceFile)        compileSources(sources)      } catch {        case ex: IOException => error(ex.getMessage())      }    }    private def resetPackageClass(pclazz: Symbol) {      atPhase(firstPhase) {        pclazz.setInfo(atPhase(typerPhase)(pclazz.info))      }      if (!pclazz.isRoot) resetPackageClass(pclazz.owner)    }  } // class Run  def printAllUnits() {    print("[[syntax trees at end of " + phase + "]]")    atPhase(phase.next) {      for (unit <- currentRun.units) treePrinter.print(unit)    }  }  def showDef(name: Name, module: Boolean) {    def getSym(name: Name, module: Boolean): Symbol = {      var i = name.length - 1      while (i != 0 && name(i) != '#' && name(i) != '.') i -= 1      if (i == 0)        definitions.getModule(name)      else {        val root = getSym(name.subName(0, i), name(i) == '.')        var selector = name.subName(i+1, name.length)        if (module) selector = selector.toTypeName        root.info.member(selector)      }    }    val sym = getSym(name, module)    inform("" + sym.name + ":" +(if (module) sym.tpe.typeSymbol.info else sym.info))  }  /** Returns the file with the given suffix for the given class. */  def getFile(clazz: Symbol, suffix: String): File = {    val outdirname = settings.outdir.value    var outdir = new File(if (outdirname == "") "." else outdirname)    val filename = clazz.fullNameString('.')    var start = 0    var end = filename.indexOf('.', start)    while (end >= start) {      outdir = new File(outdir, filename.substring(start, end))      if (!outdir.exists()) outdir.mkdir()      start = end + 1      end = filename.indexOf('.', start)    }    new File(outdir, filename.substring(start) + suffix)  }  private def writeICode() {    val printer = new icodes.TextPrinter(null, icodes.linearizer)    icodes.classes.values.foreach((cls) => {      val suffix = if (cls.symbol hasFlag Flags.MODULE) "$.icode" else ".icode"      var file = getFile(cls.symbol, suffix)//      if (file.exists())//        file = new File(file.getParentFile(), file.getName() + "1")      try {        val stream = new FileOutputStream(file)        printer.setWriter(new PrintWriter(stream, true))        printer.printClass(cls)        informProgress("wrote " + file)      } catch {        case ex: IOException =>          if (settings.debug.value) ex.printStackTrace()        error("could not write file " + file)      }    })  }  def forCLDC: Boolean = settings.target.value == "cldc"  def forJVM : Boolean = settings.target.value startsWith "jvm"  def forMSIL: Boolean = settings.target.value == "msil"  def onlyPresentation = inIDE  private val unpickleIDEHook0 : (( => Type) => Type) = f => f  def unpickleIDEHook : (( => Type) => Type) = unpickleIDEHook0  def doPickleHash = false}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?