abstract class Tree extends Product
Tree is the basis for scala's abstract syntax. The nodes are implemented as case classes, and the parameters which initialize a given tree are immutable: however Trees have several mutable fields which are manipulated in the course of typechecking, including pos, symbol, and tpe.
Newly instantiated trees have tpe set to null (though it
may be set immediately thereafter depending on how it is
constructed.) When a tree is passed to the typer, typically via
typer.typed(tree)
, under normal circumstances the tpe must be
null or the typer will ignore it. Furthermore, the typer is not
required to return the same tree it was passed.
Trees can be easily traversed with e.g. foreach on the root node; for a more nuanced traversal, subclass Traverser. Transformations can be considerably trickier: see the numerous subclasses of Transformer found around the compiler.
Copying Trees should be done with care depending on whether it need be done lazily or strictly (see LazyTreeCopier and StrictTreeCopier) and on whether the contents of the mutable fields should be copied. The tree copiers will copy the mutable attributes to the new tree; calling Tree#duplicate will copy symbol and tpe, but all the positions will be focused.
Trees can be coarsely divided into four mutually exclusive categories:
- TermTrees, representing terms
- TypTrees, representing types. Note that is
TypTree
, notTypeTree
. - SymTrees, which may represent types or terms.
- Other Trees, which have none of those as parents.
SymTrees include important nodes Ident and Select, which are used as both terms and types; they are distinguishable based on whether the Name is a TermName or TypeName. The correct way for to test for a type or a term (on any Tree) are the isTerm/isType methods on Tree.
"Others" are mostly syntactic or short-lived constructs. Examples include CaseDef, which wraps individual match cases: they are neither terms nor types, nor do they carry a symbol. Another example is Parens, which is eliminated during parsing.
- Alphabetic
- By Inheritance
- Tree
- Product
- Equals
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
- new Tree()
Abstract Value Members
Concrete Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
children: List[Universe.Tree]
The direct child trees of this tree.
The direct child trees of this tree. EmptyTrees are always omitted. Lists are flattened.
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
defineType(tp: Universe.Type): Tree.this.type
Like
setType
, but if this is a previously empty TypeTree that fact is remembered so that resetAllAttrs will snap back.Like
setType
, but if this is a previously empty TypeTree that fact is remembered so that resetAllAttrs will snap back.Attempting to elaborate on the above, I find: If defineType is called on a TypeTree whose type field is null or NoType, this is recorded as "wasEmpty = true". That value is used in ResetAttrsTraverser, which nulls out the type field of TypeTrees for which wasEmpty is true, leaving the others alone.
resetAllAttrs is used in situations where some speculative typing of a tree takes place, fails, and the tree needs to be returned to its former state to try again. So according to me: using
defineType
instead ofsetType
is how you communicate that the type being set does not depend on any previous state, and therefore should be abandoned if the current line of type inquiry doesn't work out. -
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(that: Any): Boolean
- Definition Classes
- Tree → Equals → AnyRef → Any
- def equalsStructure(that: Universe.Tree): Boolean
- def equalsStructure0(that: Universe.Tree)(f: (Universe.Tree, Universe.Tree) ⇒ Boolean): Boolean
-
def
exists(p: (Universe.Tree) ⇒ Boolean): Boolean
Is there part of this tree which satisfies predicate
p
? -
def
filter(f: (Universe.Tree) ⇒ Boolean): List[Universe.Tree]
Find all subtrees matching predicate
p
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
find(p: (Universe.Tree) ⇒ Boolean): Option[Universe.Tree]
Returns optionally first tree (in a preorder traversal) which satisfies predicate
p
, or None if none exists. -
def
foreach(f: (Universe.Tree) ⇒ Unit): Unit
Apply
f
to each subtree -
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- def hasSymbol: Boolean
- def hasSymbolWhich(f: (Universe.Symbol) ⇒ Boolean): Boolean
-
def
hashCode(): Int
- Definition Classes
- Tree → AnyRef → Any
- val id: Int
- def isDef: Boolean
- def isEmpty: Boolean
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
def
isTerm: Boolean
The canonical way to test if a Tree represents a term.
-
def
isType: Boolean
The canonical way to test if a Tree represents a type.
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- def pos: Position
- def pos_=(pos: Position): Unit
-
def
productIterator: Iterator[Any]
- Definition Classes
- Product
-
def
productPrefix: String
- Definition Classes
- Product
- def setPos(pos: Position): Tree.this.type
- def setSymbol(sym: Universe.Symbol): Tree.this.type
-
def
setType(tp: Universe.Type): Tree.this.type
Set tpe to give
tp
and return this. -
def
symbol: Universe.Symbol
Note that symbol is fixed as null at this level.
Note that symbol is fixed as null at this level. In SymTrees, it is overridden and implemented with a var, initialized to NoSymbol.
Trees which are not SymTrees but which carry symbols do so by overriding
def symbol
to forward it elsewhere. Examples:Super(qual, _) // has qual's symbol Apply(fun, args) // has fun's symbol TypeApply(fun, args) // has fun's symbol AppliedTypeTree(tpt, args) // has tpt's symbol TypeTree(tpe) // has tpe's typeSymbol, if tpe != null
Attempting to set the symbol of a Tree which does not support it will induce an exception.
- def symbol_=(sym: Universe.Symbol): Unit
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
- def tpe: Universe.Type
- def tpe_=(t: Universe.Type): Unit
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )