trees.scala

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

SCALA
1,693
字号
    def Select(tree: Tree, qualifier: Tree, selector: Name) =      new Select(qualifier, selector).copyAttrs(tree)    def Ident(tree: Tree, name: Name) =      new Ident(name).copyAttrs(tree)    def Literal(tree: Tree, value: Constant) =      new Literal(value).copyAttrs(tree)    def TypeTree(tree: Tree) =      new TypeTree().copyAttrs(tree)    def Annotated(tree: Tree, annot: Annotation, arg: Tree) =      new Annotated(annot, arg).copyAttrs(tree)    def SingletonTypeTree(tree: Tree, ref: Tree) =      new SingletonTypeTree(ref).copyAttrs(tree)    def SelectFromTypeTree(tree: Tree, qualifier: Tree, selector: Name) =      new SelectFromTypeTree(qualifier, selector).copyAttrs(tree)    def CompoundTypeTree(tree: Tree, templ: Template) =      new CompoundTypeTree(templ).copyAttrs(tree)    def AppliedTypeTree(tree: Tree, tpt: Tree, args: List[Tree]) =      new AppliedTypeTree(tpt, args).copyAttrs(tree)    def TypeBoundsTree(tree: Tree, lo: Tree, hi: Tree) =      new TypeBoundsTree(lo, hi).copyAttrs(tree)    def ExistentialTypeTree(tree: Tree, tpt: Tree, whereClauses: List[Tree]) =      new ExistentialTypeTree(tpt, whereClauses).copyAttrs(tree)  }  class LazyTreeCopier(copy: TreeCopier) extends TreeCopier {    def this() = this(new StrictTreeCopier)    def ClassDef(tree: Tree, mods: Modifiers, name: Name, tparams: List[TypeDef], impl: Template) = tree match {      case t @ ClassDef(mods0, name0, tparams0, impl0)      if (mods0 == mods && (name0 == name) && (tparams0 == tparams) && (impl0 == impl)) => t      case _ => copy.ClassDef(tree, mods, name, tparams, impl)    }    def PackageDef(tree: Tree, name: Name, stats: List[Tree]) = tree match {      case t @ PackageDef(name0, stats0)      if (name0 == name) && (stats0 == stats) => t      case _ => copy.PackageDef(tree, name, stats)    }    def ModuleDef(tree: Tree, mods: Modifiers, name: Name, impl: Template) = tree match {      case t @ ModuleDef(mods0, name0, impl0)      if (mods0 == mods) && (name0 == name) && (impl0 == impl) => t      case _ => copy.ModuleDef(tree, mods, name, impl)    }    def ValDef(tree: Tree, mods: Modifiers, name: Name, tpt: Tree, rhs: Tree) = tree match {      case t @ ValDef(mods0, name0, tpt0, rhs0)      if (mods0 == mods) && (name0 == name) && (tpt0 == tpt) && (rhs0 == rhs) => t      case _ => copy.ValDef(tree, mods, name, tpt, rhs)    }    def DefDef(tree: Tree, mods: Modifiers, name: Name, tparams: List[TypeDef], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree) = tree match {      case t @ DefDef(mods0, name0, tparams0, vparamss0, tpt0, rhs0)      if (mods0 == mods) && (name0 == name) && (tparams0 == tparams) &&         (vparamss0 == vparamss) && (tpt0 == tpt) && (rhs == rhs0) => t      case _ => copy.DefDef(tree, mods, name, tparams, vparamss, tpt, rhs)    }    def TypeDef(tree: Tree, mods: Modifiers, name: Name, tparams: List[TypeDef], rhs: Tree) = tree match {      case t @ TypeDef(mods0, name0, tparams0, rhs0)      if (mods0 == mods) && (name0 == name) && (tparams0 == tparams) && (rhs0 == rhs) => t      case _ => copy.TypeDef(tree, mods, name, tparams, rhs)    }    def LabelDef(tree: Tree, name: Name, params: List[Ident], rhs: Tree) = tree match {      case t @ LabelDef(name0, params0, rhs0)      if (name0 == name) && (params0 == params) && (rhs0 == rhs) => t      case _ => copy.LabelDef(tree, name, params, rhs)    }    def Import(tree: Tree, expr: Tree, selectors: List[(Name, Name)]) = tree match {      case t @ Import(expr0, selectors0)      if (expr0 == expr) && (selectors0 == selectors) => t      case _ => copy.Import(tree, expr, selectors)    }    def Annotation(tree: Tree, constr: Tree, elements: List[Tree]) = tree match {      case t @ Annotation(constr0, elements0)      if (constr0 == constr) && (elements0 == elements) => t      case _ => copy.Annotation(tree, constr, elements)    }    def DocDef(tree: Tree, comment: String, definition: Tree) = tree match {      case t @ DocDef(comment0, definition0)      if (comment0 == comment) && (definition0 == definition) => t      case _ => copy.DocDef(tree, comment, definition)    }    def Template(tree: Tree, parents: List[Tree], self: ValDef, body: List[Tree]) = tree match {      case t @ Template(parents0, self0, body0)      if (parents0 == parents) && (self0 == self) && (body0 == body) => t      case _ => copy.Template(tree, parents, self, body)    }    def Block(tree: Tree, stats: List[Tree], expr: Tree) = tree match {      case t @ Block(stats0, expr0)      if ((stats0 == stats) && (expr0 == expr)) => t      case _ => copy.Block(tree, stats, expr)    }    def CaseDef(tree: Tree, pat: Tree, guard: Tree, body: Tree) = tree match {      case t @ CaseDef(pat0, guard0, body0)      if (pat0 == pat) && (guard0 == guard) && (body0 == body) => t      case _ => copy.CaseDef(tree, pat, guard, body)    }    def Sequence(tree: Tree, trees: List[Tree]) = tree match {      case t @ Sequence(trees0)      if trees0 == trees => t      case _ => copy.Sequence(tree, trees)    }    def Alternative(tree: Tree, trees: List[Tree]) = tree match {      case t @ Alternative(trees0)      if trees0 == trees => t      case _ => copy.Alternative(tree, trees)    }    def Star(tree: Tree, elem: Tree) = tree match {      case t @ Star(elem0)      if elem0 == elem => t      case _ => copy.Star(tree, elem)    }    def Bind(tree: Tree, name: Name, body: Tree) = tree match {      case t @ Bind(name0, body0)      if (name0 == name) && (body0 == body) => t      case _ => copy.Bind(tree, name, body)    }    def UnApply(tree: Tree, fun: Tree, args: List[Tree]) = tree match {      case t @ UnApply(fun0, args0)      if (fun0 == fun) && (args0 == args) => t      case _ => copy.UnApply(tree, fun, args)    }    def ArrayValue(tree: Tree, elemtpt: Tree, trees: List[Tree]) = tree match {      case t @ ArrayValue(elemtpt0, trees0)      if (elemtpt0 == elemtpt) && (trees0 == trees) => t      case _ => copy.ArrayValue(tree, elemtpt, trees)    }    def Function(tree: Tree, vparams: List[ValDef], body: Tree) = tree match {      case t @ Function(vparams0, body0)      if (vparams0 == vparams) && (body0 == body) => t      case _ => copy.Function(tree, vparams, body)    }    def Assign(tree: Tree, lhs: Tree, rhs: Tree) = tree match {      case t @ Assign(lhs0, rhs0)      if (lhs0 == lhs) && (rhs0 == rhs) => t      case _ => copy.Assign(tree, lhs, rhs)    }    def If(tree: Tree, cond: Tree, thenp: Tree, elsep: Tree) = tree match {      case t @ If(cond0, thenp0, elsep0)       if (cond0 == cond) && (thenp0 == thenp) && (elsep0 == elsep) => t      case _ => copy.If(tree, cond, thenp, elsep)    }    def Match(tree: Tree, selector: Tree, cases: List[CaseDef]) =  tree match {      case t @ Match(selector0, cases0)      if (selector0 == selector) && (cases0 == cases) => t      case _ => copy.Match(tree, selector, cases)    }    def Return(tree: Tree, expr: Tree) = tree match {      case t @ Return(expr0)      if expr0 == expr => t      case _ => copy.Return(tree, expr)    }    def Try(tree: Tree, block: Tree, catches: List[CaseDef], finalizer: Tree) = tree match {      case t @ Try(block0, catches0, finalizer0)      if (block0 == block) && (catches0 == catches) && (finalizer0 == finalizer) => t      case _ => copy.Try(tree, block, catches, finalizer)    }    def Throw(tree: Tree, expr: Tree) = tree match {      case t @ Throw(expr0)      if expr0 == expr => t      case _ => copy.Throw(tree, expr)    }    def New(tree: Tree, tpt: Tree) = tree match {      case t @ New(tpt0)      if tpt0 == tpt => t      case _ => copy.New(tree, tpt)    }    def Typed(tree: Tree, expr: Tree, tpt: Tree) = tree match {      case t @ Typed(expr0, tpt0)      if (expr0 == expr) && (tpt0 == tpt) => t      case _ => copy.Typed(tree, expr, tpt)    }    def TypeApply(tree: Tree, fun: Tree, args: List[Tree]) = tree match {      case t @ TypeApply(fun0, args0)      if (fun0 == fun) && (args0 == args) => t      case _ => copy.TypeApply(tree, fun, args)    }    def Apply(tree: Tree, fun: Tree, args: List[Tree]) = tree match {      case t @ Apply(fun0, args0)      if (fun0 == fun) && (args0 == args) => t      case _ => copy.Apply(tree, fun, args)    }    def ApplyDynamic(tree: Tree, qual: Tree, args: List[Tree]) = tree match {      case t @ ApplyDynamic(qual0, args0)      if (qual0 == qual) && (args0 == args) => t      case _ => copy.ApplyDynamic(tree, qual, args)    }    def Super(tree: Tree, qual: Name, mix: Name) = tree match {      case t @ Super(qual0, mix0)      if (qual0 == qual) && (mix0 == mix) => t      case _ => copy.Super(tree, qual, mix)    }    def This(tree: Tree, qual: Name) = tree match {      case t @ This(qual0)      if qual0 == qual => t      case _ => copy.This(tree, qual)    }    def Select(tree: Tree, qualifier: Tree, selector: Name) = tree match {      case t @ Select(qualifier0, selector0)      if (qualifier0 == qualifier) && (selector0 == selector) => t      case _ => copy.Select(tree, qualifier, selector)    }    def Ident(tree: Tree, name: Name) = tree match {      case t @ Ident(name0)      if name0 == name => t      case _ => copy.Ident(tree, name)    }    def Literal(tree: Tree, value: Constant) = tree match {      case t @ Literal(value0)      if value0 == value => t      case _ => copy.Literal(tree, value)    }    def TypeTree(tree: Tree) = tree match {      case t @ TypeTree() => t      case _ => copy.TypeTree(tree)    }    def Annotated(tree: Tree, annot: Annotation, arg: Tree) = tree match {      case t @ Annotated(annot0, arg0)      if (annot0==annot) => t      case _ => copy.Annotated(tree, annot, arg)    }    def SingletonTypeTree(tree: Tree, ref: Tree) = tree match {      case t @ SingletonTypeTree(ref0)      if ref0 == ref => t      case _ => copy.SingletonTypeTree(tree, ref)    }    def SelectFromTypeTree(tree: Tree, qualifier: Tree, selector: Name) = tree match {      case t @ SelectFromTypeTree(qualifier0, selector0)      if (qualifier0 == qualifier) && (selector0 == selector) => t      case _ => copy.SelectFromTypeTree(tree, qualifier, selector)    }    def CompoundTypeTree(tree: Tree, templ: Template) = tree match {      case t @ CompoundTypeTree(templ0)      if templ0 == templ => t      case _ => copy.CompoundTypeTree(tree, templ)    }    def AppliedTypeTree(tree: Tree, tpt: Tree, args: List[Tree]) = tree match {      case t @ AppliedTypeTree(tpt0, args0)      if (tpt0 == tpt) && (args0 == args) => t      case _ => copy.AppliedTypeTree(tree, tpt, args)    }    def TypeBoundsTree(tree: Tree, lo: Tree, hi: Tree) = tree match {      case t @ TypeBoundsTree(lo0, hi0)      if (lo0 == lo) && (hi0 == hi) => t      case _ => copy.TypeBoundsTree(tree, lo, hi)    }    def ExistentialTypeTree(tree: Tree, tpt: Tree, whereClauses: List[Tree]) = tree match {      case t @ ExistentialTypeTree(tpt0, whereClauses0)      if (tpt0 == tpt) && (whereClauses0 == whereClauses) => t      case _ => copy.ExistentialTypeTree(tree, tpt, whereClauses)    }  }  abstract class Transformer {    val copy: TreeCopier = new LazyTreeCopier    protected var currentOwner: Symbol = definitions.RootClass    protected def currentMethod = currentOwner.enclMethod    protected def currentClass = currentOwner.enclClass    protected def currentPackage = currentOwner.toplevelClass.owner    def transform(tree: Tree): Tree = tree match {      case EmptyTree =>        tree      case PackageDef(name, stats) =>        atOwner(tree.symbol.moduleClass) {          copy.PackageDef(tree, name, transformStats(stats, currentOwner))        }      case ClassDef(mods, name, tparams, impl) =>        atOwner(tree.symbol) {          copy.ClassDef(tree, mods, name, transformTypeDefs(tparams), transformTemplate(impl))        }      case ModuleDef(mods, name, impl) =>        atOwner(tree.symbol.moduleClass) {          copy.ModuleDef(tree, mods, name, transformTemplate(impl))        }      case ValDef(mods, name, tpt, rhs) =>        atOwner(tree.symbol) {          copy.ValDef(tree, mods, name, transform(tpt), transform(rhs))        }      case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>        atOwner(tree.symbol) {          copy.DefDef(            tree, mods, name, transformTypeDefs(tparams), transformValDefss(vparamss), transform(tpt), transform(rhs))        }      case TypeDef(mods, name, tparams, rhs) =>        atOwner(tree.symbol) {          copy.TypeDef(tree, mods, name, transformTypeDefs(tparams), transform(rhs))        }      case LabelDef(name, params, rhs) =>        copy.LabelDef(tree, name, transformIdents(params), transform(rhs)) //bq: Martin, once, atOwner(...) works, also change `LamdaLifter.proxy'      case Import(expr, selectors) =>        copy.Import(tree, transform(expr), selectors)      case Annotation(constr, elements) =>        copy.Annotation(tree, transform(constr), transformTrees(elements))      case DocDef(comment, definition) =>        copy.DocDef(tree, comment, transform(definition))      case Template(parents, self, body) =>        copy.Template(tree, transformTrees(parents), transformValDef(self), transformStats(body, tree.symbol))      case Block(stats, expr) =>        copy.Block(tree, transformStats(stats, currentOwner), transform(expr))      case CaseDef(pat, guard, body) =>        copy.CaseDef(tree, transform(pat), transform(guard), transform(body))      case Sequence(trees) =>        copy.Sequence(tree, transformTrees(trees))      case Alternative(trees) =>        copy.Alternative(tree, transformTrees(trees))      case Star(elem) =>        copy.Star(tree, transform(elem))      case Bind(name, body) =>        copy.Bind(tree, name, transform(body))      case UnApply(fun, args) =>        copy.UnApply(tree, fun, transformTrees(args)) // bq: see test/.../unapplyContexts2.scala      case ArrayValue(elemtpt, trees) =>        copy.ArrayValue(tree, transform(elemtpt), transformTrees(trees))      case Function(vparams, body) =>        atOwner(tree.symbol) {          copy.Function(tree, transformValDefs(vparams), transform(body))        }      case Assign(lhs, rhs) =>        copy.Assign(tree, transform(lhs), transform(rhs))      case If(cond, thenp, elsep) =>        copy.If(tree, transform(cond), transform(thenp), transform(elsep))      case Match(selector, cases) =>        copy.Match(tree, transform(selector), transformCaseDefs(cases))      case Return(expr) =>        copy.Return(tree, transform(expr))      case Try(block, catches, finalizer) =>        copy.Try(tree, transform(block), transformCaseDefs(catches), transform(finalizer))      case Throw(expr) =>        copy.Throw(tree, transform(expr))      case New(tpt) =>        copy.New(tree, transform(tpt))      case Typed(expr, tpt) =>        copy.Typed(tree, transform(expr), transform(tpt))      case TypeApply(fun, args) =>        copy.TypeApply(tree, transform(fun), transformTrees(args))      case Apply(fun, args) =>        copy.Apply(tree, transform(fun), transformTrees(args))      case ApplyDynamic(qual, args) =>        copy.ApplyDynamic(tree, transform(qual), transformTrees(args))      case Super(qual, mix) =>        copy.Super(tree, qual, mix)      case This(qual) =>        copy.This(tree, qual)      case Select(qualifier, selector) =>

⌨️ 快捷键说明

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