unpickler.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 790 行 · 第 1/2 页
SCALA
790 行
val tpe = if (tag != EMPTYtree) readTypeRef() else NoType tag match { case EMPTYtree => EmptyTree case PACKAGEtree => val symbol = readSymbolRef() val name = readNameRef() val stats = until(end, readTreeRef) PackageDef(name, stats) setType tpe case CLASStree => val symbol = readSymbolRef() val mods = readModifiersRef() val name = readNameRef() val impl = readTemplateRef() val tparams = until(end, readTypeDefRef) (ClassDef(mods, name, tparams, impl). setSymbol(symbol). setType(tpe)) case MODULEtree => val symbol = readSymbolRef() val mods = readModifiersRef() val name = readNameRef() val impl = readTemplateRef() (ModuleDef(mods, name, impl). setSymbol(symbol). setType(tpe)) case VALDEFtree => val symbol = readSymbolRef() val mods = readModifiersRef() val name = readNameRef() val tpt = readTreeRef() val rhs = readTreeRef() (ValDef(mods, name, tpt, rhs). setSymbol(symbol). setType(tpe)) case DEFDEFtree => val symbol = readSymbolRef() val mods = readModifiersRef() val name = readNameRef() val numTparams = readNat() val tparams = times(numTparams, readTypeDefRef) val numVparamss = readNat val vparamss = times(numVparamss, () => { val len = readNat() times(len, readValDefRef)}) val tpt = readTreeRef() val rhs = readTreeRef() (DefDef(mods, name, tparams, vparamss, tpt, rhs). setSymbol(symbol). setType(tpe)) case TYPEDEFtree => val symbol = readSymbolRef() val mods = readModifiersRef() val name = readNameRef() val rhs = readTreeRef() val tparams = until(end, readTypeDefRef) (TypeDef(mods, name, tparams, rhs). setSymbol(symbol). setType(tpe)) case LABELtree => val symbol = readSymbolRef() val rhs = readTreeRef() val params = until(end, readIdentRef) (LabelDef(name, params, rhs). setSymbol(symbol). setType(tpe)) case IMPORTtree => val symbol = readSymbolRef() val expr = readTreeRef() val selectors = until(end, () => { val from = readNameRef() val to = readNameRef() (from, to) }) (Import(expr, selectors). setSymbol(symbol). setType(tpe)) case ANNOTATIONtree => val constr = readTreeRef() val elements = until(end, readTreeRef) (Annotation(constr, elements).setType(tpe)) case DOCDEFtree => val comment = readConstantRef match { case Constant(com: String) => com case other => errorBadSignature("Document comment not a string (" + other + ")") } val definition = readTreeRef() (DocDef(comment, definition).setType(tpe)) case TEMPLATEtree => val symbol = readSymbolRef() val numParents = readNat() val parents = times(numParents, readTreeRef) val self = readValDefRef() val body = until(end, readTreeRef) (Template(parents, self, body). setSymbol(symbol). setType(tpe)) case BLOCKtree => val expr = readTreeRef() val stats = until(end, readTreeRef) Block(stats, expr).setType(tpe) case CASEtree => val pat = readTreeRef() val guard = readTreeRef() val body = readTreeRef() CaseDef(pat, guard, body).setType(tpe) case SEQUENCEtree => val trees = until(end, readTreeRef) Sequence(trees).setType(tpe) case ALTERNATIVEtree => val trees = until(end, readTreeRef) Alternative(trees).setType(tpe) case STARtree => val elem = readTreeRef() Star(elem).setType(tpe) case BINDtree => val symbol = readSymbolRef() val name = readNameRef() val body = readTreeRef() (Bind(name, body). setSymbol(symbol). setType(tpe)) case UNAPPLYtree => val fun = readTreeRef() val args = until(end, readTreeRef) (UnApply(fun: Tree, args).setType(tpe)) case ARRAYVALUEtree => val elemtpt = readTreeRef() val trees = until(end, readTreeRef) (ArrayValue(elemtpt, trees).setType(tpe)) case FUNCTIONtree => val symbol = readSymbolRef() val body = readTreeRef() val vparams = until(end, readValDefRef) (Function(vparams, body). setSymbol(symbol). setType(tpe)) case ASSIGNtree => val lhs = readTreeRef() val rhs = readTreeRef() Assign(lhs, rhs).setType(tpe) case IFtree => val cond = readTreeRef() val thenp = readTreeRef() val elsep = readTreeRef() If(cond, thenp, elsep).setType(tpe) case MATCHtree => val selector = readTreeRef() val cases = until(end, readCaseDefRef) Match(selector, cases).setType(tpe) case RETURNtree => val symbol = readSymbolRef() val expr = readTreeRef() (Return(expr). setSymbol(symbol). setType(tpe)) case TREtree => val block = readTreeRef() val finalizer = readTreeRef() val catches = until(end, readCaseDefRef) Try(block, catches, finalizer).setType(tpe) case THROWtree => val expr = readTreeRef() Throw(expr).setType(tpe) case NEWtree => val tpt = readTreeRef() New(tpt).setType(tpe) case TYPEDtree => val expr = readTreeRef() val tpt = readTreeRef() Typed(expr, tpt).setType(tpe) case TYPEAPPLYtree => val fun = readTreeRef() val args = until(end, readTreeRef) TypeApply(fun, args).setType(tpe) case APPLYtree => val fun = readTreeRef() val args = until(end, readTreeRef) Apply(fun, args).setType(tpe) case APPLYDYNAMICtree => val symbol = readSymbolRef() val qual = readTreeRef() val args = until(end, readTreeRef) ApplyDynamic(qual, args).setSymbol(symbol).setType(tpe) case SUPERtree => val symbol = readSymbolRef() val qual = readNameRef() val mix = readNameRef() Super(qual, mix).setSymbol(symbol).setType(tpe) case THIStree => val symbol = readSymbolRef() val qual = readNameRef() This(qual).setSymbol(symbol).setType(tpe) case SELECTtree => val symbol = readSymbolRef() val qualifier = readTreeRef() val selector = readNameRef() Select(qualifier, selector).setSymbol(symbol).setType(tpe) case IDENTtree => val symbol = readSymbolRef() val name = readNameRef() Ident(name).setSymbol(symbol).setType(tpe) case LITERALtree => val value = readConstantRef() Literal(value).setType(tpe) case TYPEtree => TypeTree().setType(tpe) case ANNOTATEDtree => val annot = readAnnotationTreeRef() val arg = readTreeRef() Annotated(annot, arg).setType(tpe) case SINGLETONTYPEtree => val ref = readTreeRef() SingletonTypeTree(ref).setType(tpe) case SELECTFROMTYPEtree => val qualifier = readTreeRef() val selector = readNameRef() SelectFromTypeTree(qualifier, selector).setType(tpe) case COMPOUNDTYPEtree => val templ = readTemplateRef() CompoundTypeTree(templ: Template).setType(tpe) case APPLIEDTYPEtree => val tpt = readTreeRef() val args = until(end, readTreeRef) AppliedTypeTree(tpt, args).setType(tpe) case TYPEBOUNDStree => val lo = readTreeRef() val hi = readTreeRef() TypeBoundsTree(lo, hi).setType(tpe) case EXISTENTIALTYPEtree => val tpt = readTreeRef() val whereClauses = until(end, readTreeRef) ExistentialTypeTree(tpt, whereClauses).setType(tpe) case _ => errorBadSignature("unknown tree type (" + tag + ")") } } def readModifiers(): Modifiers = { val tag = readNat() if (tag != MODIFIERS) errorBadSignature("expected a modifiers tag (" + tag + ")") val end = readNat() + readIndex val flagsHi = readNat() val flagsLo = readNat() val flags = (flagsHi.toLong << 32) + flagsLo val privateWithin = readNameRef() val annotations = until(end, readAnnotationTreeRef) Modifiers(flags, privateWithin, annotations) } /* Read a reference to a pickled item */ private def readNameRef(): Name = at(readNat(), readName) private def readSymbolRef(): Symbol = at(readNat(), readSymbol) private def readTypeRef(): Type = at(readNat(), readType) private def readConstantRef(): Constant = at(readNat(), readConstant) private def readAnnotationArgRef(): AnnotationArgument = at(readNat(), readAnnotationArg) private def readTreeAttribRef(): AnnotationInfo = at(readNat(), readTreeAttrib) private def readAnnotationTreeRef(): Annotation = at(readNat(), readAnnotationTree) private def readModifiersRef(): Modifiers = at(readNat(), readModifiers) private def readTreeRef(): Tree = at(readNat(), readTree) private def readTemplateRef(): Template = readTreeRef() match { case templ:Template => templ case other => errorBadSignature("expected a template (" + other + ")") } private def readCaseDefRef(): CaseDef = readTreeRef() match { case tree:CaseDef => tree case other => errorBadSignature("expected a case def (" + other + ")") } private def readValDefRef(): ValDef = readTreeRef() match { case tree:ValDef => tree case other => errorBadSignature("expected a ValDef (" + other + ")") } private def readIdentRef(): Ident = readTreeRef() match { case tree:Ident => tree case other => errorBadSignature("expected an Ident (" + other + ")") } private def readTypeDefRef(): TypeDef = readTreeRef() match { case tree:TypeDef => tree case other => errorBadSignature("expected an TypeDef (" + other + ")") } private def errorBadSignature(msg: String) = if (inIDE) throw new TypeError(msg) else throw new RuntimeException("malformed Scala signature of " + classRoot.name + " at " + readIndex + "; " + msg) private var printedReflectAnnotationWarning = false private def reflectAnnotationWarning() { if (!printedReflectAnnotationWarning) { global.warning( "warning: dropping a legacy format annotation in " + classRoot.name) printedReflectAnnotationWarning = true } } private class LazyTypeRef(i: Int) extends LazyType { private val definedAtRunId = currentRunId // In IDE, captures class files dependencies so they can be reloaded when their dependencies change. private val ideHook = unpickleIDEHook override def complete(sym: Symbol) : Unit = { if (sym.rawInfo != this && inIDE) return val tp = ideHook(at(i, readType)) sym setInfo tp if (!inIDE && currentRunId != definedAtRunId) sym.setInfo(adaptToNewRunMap(tp)) } override def load(sym: Symbol) { complete(sym) } } private class LazyTypeRefAndAlias(i: Int, j: Int) extends LazyTypeRef(i) { override def complete(sym: Symbol) { super.complete(sym) var alias = at(j, readSymbol) if (alias hasFlag OVERLOADED) alias = alias suchThat (alt => sym.tpe =:= sym.owner.thisType.memberType(alt)) sym.asInstanceOf[TermSymbol].setAlias(alias) } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?