trees.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 1,693 行 · 第 1/5 页
SCALA
1,693 行
* should be owned by `sym' * @param argss the supercall arguments * @param body the template statements without primary constructor * and value parameter fields. * @return ... */ def ClassDef(sym: Symbol, constrMods: Modifiers, vparamss: List[List[ValDef]], argss: List[List[Tree]], body: List[Tree]): ClassDef = ClassDef(sym, Template(sym.info.parents map TypeTree, if (sym.thisSym == sym || phase.erasedTypes) emptyValDef else ValDef(sym.thisSym), constrMods, vparamss, argss, body)) /** Singleton object definition * * @param mods * @param name * @param impl */ case class ModuleDef(mods: Modifiers, name: Name, impl: Template) extends ImplDef /** * @param sym the class symbol * @param impl ... * @return ... */ def ModuleDef(sym: Symbol, impl: Template): ModuleDef = posAssigner.atPos(sym.pos) { ModuleDef(Modifiers(sym.flags), sym.name, impl) setSymbol sym } abstract class ValOrDefDef extends MemberDef { def tpt: Tree def rhs: Tree } /** Value definition * * @param mods * @param name * @param tpt * @param rhs */ case class ValDef(mods: Modifiers, name: Name, tpt: Tree, rhs: Tree) extends ValOrDefDef { assert(tpt.isType, tpt) //assert(kindingIrrelevant(tpt.tpe) || !tpt.tpe.isHigherKinded, tpt.tpe) //@M a value definition should never be typed with a higher-kinded type (values must be classified by types with kind *) //tpt.kindStar=true //@M turn on consistency checking in Tree assert(rhs.isTerm, rhs) } def ValDef(sym: Symbol, rhs: Tree): ValDef = posAssigner.atPos(sym.pos) { ValDef(Modifiers(sym.flags), sym.name, TypeTree(sym.tpe), rhs) setSymbol sym } def ValDef(sym: Symbol): ValDef = ValDef(sym, EmptyTree) object emptyValDef extends ValDef(Modifiers(PRIVATE), nme.WILDCARD, TypeTree(NoType), EmptyTree) { override def isEmpty = true } /** Method definition * * @param mods * @param name * @param tparams * @param vparamss * @param tpt * @param rhs */ case class DefDef(mods: Modifiers, name: Name, tparams: List[TypeDef], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree) extends ValOrDefDef { assert(tpt.isType) //assert(kindingIrrelevant(tpt.tpe) || !tpt.tpe.isHigherKinded, tpt.tpe) //@M a method definition should never be typed with a higher-kinded type (values must be classified by types with kind *) //tpt.kindStar=true //@M turn on consistency checking in Tree assert(rhs.isTerm) } def DefDef(sym: Symbol, mods: Modifiers, vparamss: List[List[ValDef]], rhs: Tree): DefDef = posAssigner.atPos(sym.pos) { assert(sym != NoSymbol) DefDef(Modifiers(sym.flags), sym.name, sym.typeParams map TypeDef, vparamss, TypeTree(sym.tpe.finalResultType), rhs) setSymbol sym } def DefDef(sym: Symbol, vparamss: List[List[ValDef]], rhs: Tree): DefDef = DefDef(sym, Modifiers(sym.flags), vparamss, rhs) def DefDef(sym: Symbol, mods: Modifiers, rhs: List[List[Symbol]] => Tree): DefDef = { val vparamss = syntheticParams(sym, sym.tpe) DefDef(sym, mods, vparamss map (_.map(ValDef)), rhs(vparamss)) } def DefDef(sym: Symbol, rhs: List[List[Symbol]] => Tree): DefDef = DefDef(sym, Modifiers(sym.flags), rhs) /** Abstract type, type parameter, or type alias */ case class TypeDef(mods: Modifiers, name: Name, tparams: List[TypeDef], rhs: Tree) extends MemberDef { def namePos = pos.offset.map(n => n - name.length).getOrElse(-1) } /** A TypeDef node which defines given `sym' with given tight hand side `rhs'. */ def TypeDef(sym: Symbol, rhs: Tree): TypeDef = posAssigner.atPos(sym.pos) { TypeDef(Modifiers(sym.flags), sym.name, sym.typeParams map TypeDef, rhs) setSymbol sym } /** A TypeDef node which defines abstract type or type parameter for given `sym' */ def TypeDef(sym: Symbol): TypeDef = TypeDef(sym, TypeBoundsTree(TypeTree(sym.info.bounds.lo), TypeTree(sym.info.bounds.hi))) /** <p> * Labelled expression - the symbols in the array (must be Idents!) * are those the label takes as argument * </p> * <p> * The symbol that is given to the labeldef should have a MethodType * (as if it were a nested function) * </p> * <p> * Jumps are apply nodes attributed with label symbol, the arguments * will get assigned to the idents. * </p> * <p> * Note: on 2005-06-09 Martin, Iuli, Burak agreed to have forward * jumps within a Block. * </p> */ case class LabelDef(name: Name, params: List[Ident], rhs: Tree) extends DefTree with TermTree { assert(rhs.isTerm) } /** * @param sym the class symbol * @param params ... * @param rhs ... * @return ... */ def LabelDef(sym: Symbol, params: List[Symbol], rhs: Tree): LabelDef = posAssigner.atPos(sym.pos) { LabelDef(sym.name, params map Ident, rhs) setSymbol sym } /** Import clause * * @param expr * @param selectors */ case class Import(expr: Tree, selectors: List[(Name, Name)]) extends SymTree /** Annotation application (constructor arguments + name-value pairs) */ case class Annotation(constr: Tree, elements: List[Tree]) extends TermTree /** Documented definition, eliminated by analyzer */ case class DocDef(comment: String, definition: Tree) extends Tree { override def symbol: Symbol = definition.symbol override def symbol_=(sym: Symbol) { definition.symbol = sym } // sean: seems to be important to the IDE override def isDef = definition.isDef override def isTerm = definition.isTerm override def isType = definition.isType } /** Instantiation template * * @param parents * @param body */ case class Template(parents: List[Tree], self: ValDef, body: List[Tree]) extends SymTree { // System.err.println("TEMPLATE: " + parents) } /** * @param parents ... * @param vparamss ... * @param argss ... * @param body ... * @return ... */ def Template(parents: List[Tree], self: ValDef, constrMods: Modifiers, vparamss: List[List[ValDef]], argss: List[List[Tree]], body: List[Tree]): Template = { /** Add constructor to template */ var vparamss1 = vparamss map (vps => vps.map { vd => val ret = ValDef(Modifiers(vd.mods.flags & IMPLICIT | PARAM) withAnnotations vd.mods.annotations, vd.name, vd.tpt.duplicate, EmptyTree).setPos(vd.pos) if (inIDE && vd.symbol != NoSymbol) ret.symbol = vd.symbol ret }) val (vdefs, rest) = body span treeInfo.isPreSuper val (lvdefs, gvdefs) = List.unzip { vdefs map { case vdef @ ValDef(mods, name, tpt, rhs) => (copy.ValDef(vdef, Modifiers(PRESUPER), name, tpt, rhs), copy.ValDef(vdef, mods, name, TypeTree(), EmptyTree)) } } val constrs = if (constrMods hasFlag TRAIT) { if (body forall treeInfo.isInterfaceMember) List() else List( DefDef(NoMods, nme.MIXIN_CONSTRUCTOR, List(), List(List()), TypeTree(), Block(lvdefs, Literal(())))) } else { if (vparamss1.isEmpty || !vparamss1.head.isEmpty && (vparamss1.head.head.mods.flags & IMPLICIT) != 0) vparamss1 = List() :: vparamss1; val superRef: Tree = Select(Super(nme.EMPTY.toTypeName, nme.EMPTY.toTypeName), nme.CONSTRUCTOR) val superCall = posAssigner.atPos(parents.head.pos) { (superRef /: argss) (Apply) } List( DefDef(constrMods, nme.CONSTRUCTOR, List(), vparamss1, TypeTree(), Block(lvdefs ::: List(superCall), Literal(())))) } Template(parents, self, gvdefs ::: List.flatten(vparamss) ::: constrs ::: rest) } /** Block of expressions (semicolon separated expressions) */ case class Block(stats: List[Tree], expr: Tree) extends TermTree /** Case clause in a pattern match, eliminated by TransMatch * (except for occurences in switch statements) */ case class CaseDef(pat: Tree, guard: Tree, body: Tree) extends Tree /** casedef shorthand */ def CaseDef(pat: Tree, body: Tree): CaseDef = CaseDef(pat, EmptyTree, body) /** Sequence of patterns (comma separated expressions), eliminated by the * <code>TransMatch</code> phase. */ case class Sequence(trees: List[Tree]) extends TermTree /** Alternatives of patterns, eliminated by TransMatch, except for * occurences in encoded Switch stmt (=remaining Match(CaseDef(...)) */ case class Alternative(trees: List[Tree]) extends TermTree /** Repetition of pattern, eliminated by TransMatch */ case class Star(elem: Tree) extends TermTree /** Bind of a variable to a rhs pattern, eliminated by TransMatch * * @param name * @param body */ case class Bind(name: Name, body: Tree) extends DefTree { override def isTerm = name.isTermName override def isType = name.isTypeName } def Bind(sym: Symbol, body: Tree): Bind = Bind(sym.name, body) setSymbol sym case class UnApply(fun: Tree, args: List[Tree]) extends TermTree /** Array of expressions, needs to be translated in backend, */ case class ArrayValue(elemtpt: Tree, elems: List[Tree]) extends TermTree /** Anonymous function, eliminated by analyzer */ case class Function(vparams: List[ValDef], body: Tree) extends TermTree with SymTree /** Assignment */ case class Assign(lhs: Tree, rhs: Tree) extends TermTree /** Conditional expression */ case class If(cond: Tree, thenp: Tree, elsep: Tree) extends TermTree /** <p> * Pattern matching expression (before <code>TransMatch</code>) * Switch statements (after TransMatch) * </p> * <p> * After <code>TransMatch</code>, cases will satisfy the following * constraints: * </p> * <ul> * <li>all guards are EmptyTree,</li> * <li>all patterns will be either <code>Literal(Constant(x:Int))</code> * or <code>Alternative(lit|...|lit)</code></li> * <li>except for an "otherwise" branch, which has pattern * <code>Ident(nme.WILDCARD)</code></li> * </ul> */ case class Match(selector: Tree, cases: List[CaseDef]) extends TermTree /** Return expression */ case class Return(expr: Tree) extends TermTree with SymTree case class Try(block: Tree, catches: List[CaseDef], finalizer: Tree) extends TermTree /** Throw expression */ case class Throw(expr: Tree) extends TermTree /** Object instantiation * One should always use factory method below to build a user level new. * * @param tpt a class type */ case class New(tpt: Tree) extends TermTree { assert(tpt.isType) } /** Factory method for object creation <code><new tpt(args_1)...(args_n)></code>. * * @param tpt ... * @param argss ... * @return ... */ def New(tpt: Tree, argss: List[List[Tree]]): Tree = { assert(!argss.isEmpty) val superRef: Tree = Select(New(tpt), nme.CONSTRUCTOR)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?