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>&lt;new tpt(args_1)...(args_n)&gt;</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 + -
显示快捷键?