pickler.scala

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

SCALA
963
字号
        case name: Name =>          writeName(name)          if (name.isTermName) TERMname else TYPEname        case NoSymbol =>          NONEsym        case sym: Symbol if !isLocal(sym) =>          val tag =            if (sym.isModuleClass) {              writeRef(sym.name.toTermName); EXTMODCLASSref            } else {              writeRef(sym.name); EXTref            }          if (!sym.owner.isRoot) writeRef(sym.owner)          tag        case sym: ClassSymbol =>          val posOffset = writeSymInfo(sym)          if (sym.thisSym.tpe != sym.tpe) writeRef(sym.typeOfThis)          CLASSsym + posOffset        case sym: TypeSymbol =>          val posOffset = writeSymInfo(sym)          (if (sym.isAbstractType) TYPEsym else ALIASsym) + posOffset        case sym: TermSymbol =>          val posOffset = writeSymInfo(sym)          if (sym.alias != NoSymbol) writeRef(sym.alias)          (if (sym.isModule) MODULEsym else VALsym) + posOffset        case NoType =>          NOtpe        case NoPrefix =>          NOPREFIXtpe        case ThisType(sym) =>          writeRef(sym); THIStpe        case SingleType(pre, sym) =>          writeRef(pre); writeRef(sym); SINGLEtpe        case ConstantType(value) =>          writeRef(value); CONSTANTtpe        case TypeRef(pre, sym, args) =>          writeRef(pre); writeRef(sym); writeRefs(args); TYPEREFtpe        case TypeBounds(lo, hi) =>          writeRef(lo); writeRef(hi); TYPEBOUNDStpe        case tp @ RefinedType(parents, decls) =>          writeRef(tp.typeSymbol); writeRefs(parents); REFINEDtpe        case ClassInfoType(parents, decls, clazz) =>          writeRef(clazz); writeRefs(parents); CLASSINFOtpe        case MethodType(formals, restpe) =>          writeRef(restpe); writeRefs(formals)          if (entry.isInstanceOf[ImplicitMethodType]) IMPLICITMETHODtpe          else METHODtpe        case PolyType(tparams, restpe) =>          writeRef(restpe); writeRefs(tparams); POLYtpe        case ExistentialType(tparams, restpe) =>          writeRef(restpe); writeRefs(tparams); EXISTENTIALtpe        case DeBruijnIndex(l, i) =>          writeNat(l); writeNat(i); DEBRUIJNINDEXtpe        case c @ Constant(_) =>          if (c.tag == BooleanTag) writeLong(if (c.booleanValue) 1 else 0)          else if (ByteTag <= c.tag && c.tag <= LongTag) writeLong(c.longValue)          else if (c.tag == FloatTag) writeLong(Float.floatToIntBits(c.floatValue))          else if (c.tag == DoubleTag) writeLong(Double.doubleToLongBits(c.doubleValue))          else if (c.tag == StringTag) writeRef(newTermName(c.stringValue))          else if (c.tag == ClassTag) writeRef(c.typeValue)          LITERAL + c.tag        case AnnotatedType(attribs, tp, selfsym) => 	  if (settings.selfInAnnots.value) {	    writeRef(tp)	    writeRef(selfsym)	    writeRefs(attribs)	    ANNOTATEDWSELFtpe	  } else {            writeRef(tp)            writeRefs(attribs)            ANNOTATEDtpe	  }        case (target: Symbol, attr @ AnnotationInfo(atp, args, assocs)) =>          writeRef(target)          writeRef(atp)          for (c <- args) writeRef(c)          for ((name, c) <- assocs) { writeRef(name); writeRef(c) }          ATTRIBUTE        case (target: Symbol, children: List[_]) =>          writeRef(target)          for (c <- children) writeRef(c.asInstanceOf[Symbol])          CHILDREN	case EmptyTree =>	  writeNat(EMPTYtree)	  TREE	case tree@PackageDef(name, stats) =>	  writeNat(PACKAGEtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(tree.mods)	  writeRef(name)          writeRefs(stats)	  TREE	case tree@ClassDef(mods, name, tparams, impl) =>	  writeNat(CLASStree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(mods)	  writeRef(name)          writeRef(impl)	  writeRefs(tparams)	  TREE	  	case tree@ModuleDef(mods, name, impl) =>	  writeNat(MODULEtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(mods)	  writeRef(name)	  writeRef(impl)	  TREE  	case tree@ValDef(mods, name, tpt, rhs) =>          writeNat(VALDEFtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(mods)	  writeRef(name)	  writeRef(tpt)	  writeRef(rhs)	  TREE		case tree@DefDef(mods, name, tparams, vparamss, tpt, rhs) =>          writeNat(DEFDEFtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(mods)	  writeRef(name)	  writeNat(tparams.length)	  writeRefs(tparams)	  writeNat(vparamss.length)	  for(vparams <- vparamss) {	    writeNat(vparams.length)	    writeRefs(vparams)	  }	  writeRef(tpt)	  writeRef(rhs)	  TREE  	case tree@TypeDef(mods, name, tparams, rhs) =>	  writeNat(TYPEDEFtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(mods)	  writeRef(name)	  writeRef(rhs)	  writeRefs(tparams)	  TREE	case tree@LabelDef(name, params, rhs) =>	  writeNat(LABELtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(rhs)	  writeRefs(params)	  TREE	case tree@Import(expr, selectors) =>	  writeNat(IMPORTtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(expr)	  for ((from, to) <- selectors) {	    writeRef(from)	    writeRef(to)	  }	  TREE	case tree@Annotation(constr, elements) =>                            	  writeNat(ANNOTATIONtree)	  writeRef(tree.tpe)	  writeRef(constr)	  writeRefs(elements)	  TREE	case tree@DocDef(comment, definition) =>          writeNat(DOCDEFtree)	  writeRef(tree.tpe)	  writeRef(Constant(comment))	  writeRef(definition)	  TREE	case tree@Template(parents, self, body) =>          writeNat(TEMPLATEtree)	  writeRef(tree.tpe)          writeRef(tree.symbol)          writeNat(parents.length)	  writeRefs(parents)	  writeRef(self)	  writeRefs(body)	  TREE	case tree@Block(stats, expr) =>          writeNat(BLOCKtree)	  writeRef(tree.tpe)	  writeRef(expr)	  writeRefs(stats)	  TREE	case tree@CaseDef(pat, guard, body) =>	  writeNat(CASEtree)	  writeRef(tree.tpe)	  writeRef(pat)	  writeRef(guard)	  writeRef(body)	  TREE	case tree@Sequence(trees) =>          writeNat(SEQUENCEtree)	  writeRef(tree.tpe)	  writeRefs(trees)	  TREE	case tree@Alternative(trees) =>	  writeNat(ALTERNATIVEtree)	  writeRef(tree.tpe)	  writeRefs(trees)	  TREE	case tree@Star(elem) =>          writeNat(STARtree)	  writeRef(tree.tpe)	  writeRef(elem)	  TREE	case tree@Bind(name, body) =>	  writeNat(BINDtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(name)	  writeRef(body)	  TREE	case tree@UnApply(fun: Tree, args) =>	  writeNat(UNAPPLYtree)	  writeRef(tree.tpe)	  writeRef(fun)	  writeRefs(args)	  TREE	case tree@ArrayValue(elemtpt, trees) =>	  writeNat(ARRAYVALUEtree)	  writeRef(tree.tpe)	  writeRef(elemtpt)	  writeRefs(trees)	  TREE	case tree@Function(vparams, body) =>          writeNat(FUNCTIONtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(body)	  writeRefs(vparams)	  TREE	case tree@Assign(lhs, rhs) =>          writeNat(ASSIGNtree)	  writeRef(tree.tpe)	  writeRef(lhs)	  writeRef(rhs)	  TREE	case tree@If(cond, thenp, elsep) =>          writeNat(IFtree)          writeRef(tree.tpe)	  writeRef(cond)	  writeRef(thenp)	  writeRef(elsep)	  TREE	case tree@Match(selector, cases) =>          writeNat(MATCHtree)	  writeRef(tree.tpe)	  writeRef(selector)	  writeRefs(cases)	  TREE	case tree@Return(expr) =>	  writeNat(RETURNtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(expr)	  TREE	case tree@Try(block, catches, finalizer) =>          writeNat(TREtree)	  writeRef(tree.tpe)	  writeRef(block)	  writeRef(finalizer)	  writeRefs(catches)	  TREE	case tree@Throw(expr) =>	  writeNat(THROWtree)	  writeRef(tree.tpe)	  writeRef(expr)	  TREE	case tree@New(tpt) =>	  writeNat(NEWtree)	  writeRef(tree.tpe)	  writeRef(tpt)	  TREE  	case tree@Typed(expr, tpt) =>	  writeNat(TYPEDtree)	  writeRef(tree.tpe)	  writeRef(expr)	  writeRef(tpt)	  TREE	case tree@TypeApply(fun, args) =>	  writeNat(TYPEAPPLYtree)	  writeRef(tree.tpe)	  writeRef(fun)	  writeRefs(args)	  TREE	  	case tree@Apply(fun, args) =>	  writeNat(APPLYtree)	  writeRef(tree.tpe)	  writeRef(fun)	  writeRefs(args)	  TREE	case tree@ApplyDynamic(qual, args) =>	  writeNat(APPLYDYNAMICtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(qual)	  writeRefs(args)	  TREE	case tree@Super(qual, mix) =>	  writeNat(SUPERtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(qual)	  writeRef(mix)	  TREE        case tree@This(qual) =>	  writeNat(THIStree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(qual)	  TREE        case tree@Select(qualifier, selector) =>	  writeNat(SELECTtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(qualifier)	  writeRef(selector)	  TREE	case tree@Ident(name) =>	  writeNat(IDENTtree)	  writeRef(tree.tpe)	  writeRef(tree.symbol)	  writeRef(name)	  TREE	case tree@Literal(value) =>	  writeNat(LITERALtree)	  writeRef(tree.tpe)	  writeRef(value)	  TREE	case tree@TypeTree() =>	  writeNat(TYPEtree)	  writeRef(tree.tpe)	  TREE	case tree@Annotated(annot, arg) =>	  writeNat(ANNOTATEDtree)	  writeRef(tree.tpe)	  writeRef(annot)	  writeRef(arg)	  TREE	case tree@SingletonTypeTree(ref) =>	  writeNat(SINGLETONTYPEtree)	  writeRef(tree.tpe)	  writeRef(ref)	  TREE	case tree@SelectFromTypeTree(qualifier, selector) =>	  writeNat(SELECTFROMTYPEtree)	  writeRef(tree.tpe)	  writeRef(qualifier)	  writeRef(selector)	  TREE	case tree@CompoundTypeTree(templ: Template) =>	  writeNat(COMPOUNDTYPEtree)	  writeRef(tree.tpe)	  writeRef(templ)	  TREE	case tree@AppliedTypeTree(tpt, args) =>	  writeNat(APPLIEDTYPEtree)	  writeRef(tree.tpe)	  writeRef(tpt)	  writeRefs(args)	  TREE	case tree@TypeBoundsTree(lo, hi) =>	  writeNat(TYPEBOUNDStree)	  writeRef(tree.tpe)	  writeRef(lo)	  writeRef(hi)	  TREE	case tree@ExistentialTypeTree(tpt, whereClauses) =>	  writeNat(EXISTENTIALTYPEtree)	  writeRef(tree.tpe)	  writeRef(tpt)	  writeRefs(whereClauses)	  TREE	case Modifiers(flags, privateWithin, annotations) =>	  writeNat((flags >> 32).toInt)	  writeNat((flags & 0xFFFFFFFF).toInt)	  writeRef(privateWithin)          writeRefs(annotations)	  MODIFIERS        case AnnotationInfo(atp, args, assocs) =>          writeRef(atp)          writeNat(args.length)          for (arg <- args) writeRef(arg)          for ((name, arg) <- assocs) {            writeRef(name);            writeRef(arg)          }          ANNOTINFO	case arg:AnnotationArgument =>	  arg.constant match {	    case Some(c) => writeBody(c)	    case None => writeBody(arg.intTree)	  }        case _ =>          throw new FatalError("bad entry: " + entry + " " + entry.getClass)      }      val startpos = writeIndex      writeByte(0); writeByte(0)      patchNat(startpos, writeBody(entry))      patchNat(startpos + 1, writeIndex - (startpos + 2))    }    /** Write byte array */    def finish {      assert(writeIndex == 0)      writeNat(MajorVersion)      writeNat(MinorVersion)      writeNat(ep)      if (settings.debug.value) log("" + ep + " entries")//debug      for (i <- 0 until ep) writeEntry(entries(i))      if (settings.Xshowcls.value == rootName.toString) {        readIndex = 0        ShowPickled.printFile(this, Console.out)      }    }    override def toString() = "" + rootName + " in " + rootOwner  }}

⌨️ 快捷键说明

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