package scala.tools.nsc
package symtab
import ast.{Trees, TreePrinters, DocComments}
import util._
abstract class SymbolTable extends reflect.generic.Universe
with Names
with Symbols
with Types
with Scopes
with Definitions
with reflect.generic.Constants
with BaseTypeSeqs
with InfoTransformers
with StdNames
with AnnotationInfos
with AnnotationCheckers
with Trees
with TreePrinters
with Positions
with DocComments
with TypeDebugging
{
def settings: Settings
def rootLoader: LazyType
def log(msg: => AnyRef): Unit
def abort(msg: String) = throw new Error(msg)
def abort() = throw new Error()
def forJVM: Boolean
def forMSIL: Boolean
type Period = Int
final val NoPeriod = 0
type RunId = Int
final val NoRunId = 0
private var ph: Phase = NoPhase
private var per = NoPeriod
final def phase: Phase = ph
final def phase_=(p: Phase) {
assert((p ne null) && p != NoPhase)
ph = p
per = (currentRunId << 8) + p.id
}
def currentRunId: RunId
final def runId(period: Period): RunId = period >> 8
final def phaseId(period: Period): Phase#Id = period & 0xFF
final def startRun(period: Period): Period = period & 0xFFFFFF00
final def currentPeriod: Period = {
per
}
final def phaseOf(period: Period): Phase = phaseWithId(phaseId(period))
final def period(rid: RunId, pid: Phase#Id): Period =
(currentRunId << 8) + pid
final def atPhase[T](ph: Phase)(op: => T): T = {
val current = phase
phase = ph
try op
finally phase = current
}
final def afterPhase[T](ph: Phase)(op: => T): T =
atPhase(ph.next)(op)
final def isValid(period: Period): Boolean =
period != 0 && runId(period) == currentRunId && {
val pid = phaseId(period)
if (phase.id > pid) infoTransformers.nextFrom(pid).pid >= phase.id
else infoTransformers.nextFrom(phase.id).pid >= pid
}
final def isValidForBaseClasses(period: Period): Boolean = {
def noChangeInBaseClasses(it: InfoTransformer, limit: Phase#Id): Boolean = (
it.pid >= limit ||
!it.changesBaseClasses && noChangeInBaseClasses(it.next, limit)
);
period != 0 && runId(period) == currentRunId && {
val pid = phaseId(period)
if (phase.id > pid) noChangeInBaseClasses(infoTransformers.nextFrom(pid), phase.id)
else noChangeInBaseClasses(infoTransformers.nextFrom(phase.id), pid)
}
}
var infoTransformers = new InfoTransformer {
val pid = NoPhase.id
val changesBaseClasses = true
def transform(sym: Symbol, tpe: Type): Type = tpe
}
val phaseWithId: Array[Phase]
}