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 + -
显示快捷键?