Trees

object Trees
class Object
trait Matchable
class Any

Type members

Classlikes

sealed abstract class AnyFieldDef extends MemberDef
sealed case class Apply(flags: ApplyFlags, receiver: Tree, method: MethodIdent, args: List[Tree])(tpe: Type)(pos: Position) extends Tree

Apply an instance method with dynamic dispatch (the default).

Apply an instance method with dynamic dispatch (the default).

sealed case class ApplyDynamicImport(flags: ApplyFlags, className: ClassName, method: MethodIdent, args: List[Tree])(pos: Position) extends Tree

Apply a static method via dynamic import.

Apply a static method via dynamic import.

final class ApplyFlags extends AnyVal
Companion
object
object ApplyFlags
Companion
class
sealed case class ApplyStatic(flags: ApplyFlags, className: ClassName, method: MethodIdent, args: List[Tree])(tpe: Type)(pos: Position) extends Tree

Apply a static method.

Apply a static method.

sealed case class ApplyStatically(flags: ApplyFlags, receiver: Tree, className: ClassName, method: MethodIdent, args: List[Tree])(tpe: Type)(pos: Position) extends Tree

Apply an instance method with static dispatch (e.g., super calls).

Apply an instance method with static dispatch (e.g., super calls).

sealed case class ArrayLength(array: Tree)(pos: Position) extends Tree
sealed case class ArraySelect(array: Tree, index: Tree)(tpe: Type)(pos: Position) extends AssignLhs
sealed case class ArrayValue(typeRef: ArrayTypeRef, elems: List[Tree])(pos: Position) extends Tree
sealed case class AsInstanceOf(expr: Tree, tpe: Type)(pos: Position) extends Tree
sealed case class Assign(lhs: AssignLhs, rhs: Tree)(pos: Position) extends Tree
sealed trait AssignLhs extends Tree
sealed case class BinaryOp(op: Code, lhs: Tree, rhs: Tree)(pos: Position) extends Tree

Binary operation (always preserves pureness).

Binary operation (always preserves pureness).

Companion
object
object BinaryOp
Companion
class
sealed class Block extends Tree
Companion
object
object Block
Companion
class
sealed case class BooleanLiteral(value: Boolean)(pos: Position) extends Literal
sealed case class ByteLiteral(value: Byte)(pos: Position) extends Literal
sealed case class CharLiteral(value: Char)(pos: Position) extends Literal
final class ClassDef(val name: ClassIdent, val originalName: OriginalName, val kind: ClassKind, val jsClassCaptures: Option[List[ParamDef]], val superClass: Option[ClassIdent], val interfaces: List[ClassIdent], val jsSuperClass: Option[Tree], val jsNativeLoadSpec: Option[JSNativeLoadSpec], val memberDefs: List[MemberDef], val topLevelExportDefs: List[TopLevelExportDef])(val optimizerHints: OptimizerHints)(val pos: Position) extends IRNode
Companion
object
object ClassDef
Companion
class
sealed case class ClassIdent(name: ClassName)(pos: Position) extends IRNode
sealed case class ClassOf(typeRef: TypeRef)(pos: Position) extends Literal
sealed case class Clone(expr: Tree)(pos: Position) extends Tree
sealed case class Closure(arrow: Boolean, captureParams: List[ParamDef], params: List[ParamDef], restParam: Option[ParamDef], body: Tree, captureValues: List[Tree])(pos: Position) extends Tree

Closure with explicit captures.

Closure with explicit captures.

Value Params
arrow

If true, the closure is an Arrow Function (=>), which does not have an this parameter, and cannot be constructed (called with new). If false, it is a regular Function (function).

sealed case class CreateJSClass(className: ClassName, captureValues: List[Tree])(pos: Position) extends Tree

Creates a JavaScript class value.

Creates a JavaScript class value.

Value Params
captureValues

Actual values for the captured parameters (in the ClassDef's jsClassCaptures.get)

className

Reference to the ClassDef for the class definition, which must have jsClassCaptures.nonEmpty

sealed case class Debugger(pos: Position) extends Tree
sealed case class DoWhile(body: Tree, cond: Tree)(pos: Position) extends Tree
sealed case class DoubleLiteral(value: Double)(pos: Position) extends Literal
sealed case class FieldDef(flags: MemberFlags, name: FieldIdent, originalName: OriginalName, ftpe: Type)(pos: Position) extends AnyFieldDef
sealed case class FieldIdent(name: FieldName)(pos: Position) extends IRNode
sealed case class FloatLiteral(value: Float)(pos: Position) extends Literal
sealed case class ForIn(obj: Tree, keyVar: LocalIdent, keyVarOriginalName: OriginalName, body: Tree)(pos: Position) extends Tree
sealed case class GetClass(expr: Tree)(pos: Position) extends Tree
sealed abstract class IRNode

Base class for all nodes in the IR.

Base class for all nodes in the IR.

Usually, one of the direct subclasses of IRNode should be used instead.

sealed case class IdentityHashCode(expr: Tree)(pos: Position) extends Tree
sealed case class If(cond: Tree, thenp: Tree, elsep: Tree)(tpe: Type)(pos: Position) extends Tree
sealed case class IntLiteral(value: Int)(pos: Position) extends Literal
sealed case class IsInstanceOf(expr: Tree, testType: Type)(pos: Position) extends Tree
sealed case class JSArrayConstr(items: List[TreeOrJSSpread])(pos: Position) extends Tree
sealed case class JSBinaryOp(op: Code, lhs: Tree, rhs: Tree)(pos: Position) extends Tree

Binary operation (always preserves pureness).

Binary operation (always preserves pureness).

Operations which do not preserve pureness are not allowed in this tree. These are notably +=, -=, *=, /= and %=

Companion
object
object JSBinaryOp
Companion
class
sealed case class JSDelete(qualifier: Tree, item: Tree)(pos: Position) extends Tree

delete qualifier[item]

delete qualifier[item]

sealed case class JSFieldDef(flags: MemberFlags, name: Tree, ftpe: Type)(pos: Position) extends AnyFieldDef
sealed case class JSFunctionApply(fun: Tree, args: List[TreeOrJSSpread])(pos: Position) extends Tree
sealed case class JSGlobalRef(name: String)(pos: Position) extends AssignLhs
Companion
object
object JSGlobalRef
Companion
class
sealed case class JSImportCall(arg: Tree)(pos: Position) extends Tree

JavaScript dynamic import of the form import(arg).

JavaScript dynamic import of the form import(arg).

This form is its own node, rather than using something like

JSFunctionApply(JSImport())

because import is not a first-class term in JavaScript. ImportCall is a dedicated syntactic form that cannot be dissociated.

sealed case class JSLinkingInfo(pos: Position) extends Tree
sealed case class JSMethodApply(receiver: Tree, method: Tree, args: List[TreeOrJSSpread])(pos: Position) extends Tree
sealed case class JSMethodDef(flags: MemberFlags, name: Tree, args: List[ParamDef], restParam: Option[ParamDef], body: Tree)(optimizerHints: OptimizerHints, hash: Option[TreeHash])(pos: Position) extends JSMethodPropDef
sealed abstract class JSMethodPropDef extends MemberDef
sealed abstract class JSNativeLoadSpec

Loading specification for a native JS class or object.

Loading specification for a native JS class or object.

Companion
object
Companion
class
sealed case class JSNativeMemberDef(flags: MemberFlags, name: MethodIdent, jsNativeLoadSpec: JSNativeLoadSpec)(pos: Position) extends MemberDef
sealed case class JSNew(ctor: Tree, args: List[TreeOrJSSpread])(pos: Position) extends Tree
sealed case class JSObjectConstr(fields: List[(Tree, Tree)])(pos: Position) extends Tree
sealed case class JSPrivateSelect(qualifier: Tree, className: ClassName, field: FieldIdent)(pos: Position) extends AssignLhs
sealed case class JSPropertyDef(flags: MemberFlags, name: Tree, getterBody: Option[Tree], setterArgAndBody: Option[(ParamDef, Tree)])(pos: Position) extends JSMethodPropDef
sealed case class JSSelect(qualifier: Tree, item: Tree)(pos: Position) extends AssignLhs
sealed case class JSSpread(items: Tree)(pos: Position) extends IRNode with TreeOrJSSpread

...items, the "spread" operator of ECMAScript 6.

...items, the "spread" operator of ECMAScript 6.

Value Params
items

An Array whose items will be spread (not an arbitrary iterable)

sealed case class JSSuperConstructorCall(args: List[TreeOrJSSpread])(pos: Position) extends Tree

Super constructor call in the constructor of a non-native JS class.

Super constructor call in the constructor of a non-native JS class.

Exactly one such node must appear in the constructor of a non-native JS class, at the top-level (possibly as a direct child of a top-level Block). Any other use of this node is invalid.

Statements before this node, as well as the args, cannot contain any This() node. Statements after this node can use This().

After the execution of this node, it is guaranteed that all fields declared in the current class have been created and initialized. Up to that point, accessing any field declared in this class (e.g., through an overridden method called from the super constructor) is undefined behavior.

All in all, the shape of a constructor is therefore:

{
  statementsNotUsingThis();
  JSSuperConstructorCall(...argsNotUsingThis);
  statementsThatMayUseThis()
}

which currently translates to something of the following shape:

{
  statementsNotUsingThis();
  super(...argsNotUsingThis);
  this.privateField1 = 0;
  this["publicField2"] = false;
  statementsThatMayUseThis()
}
sealed case class JSSuperMethodCall(superClass: Tree, receiver: Tree, method: Tree, args: List[TreeOrJSSpread])(pos: Position) extends Tree

Calls a method inherited from the given superClass on receiver.

Calls a method inherited from the given superClass on receiver.

Intuitively, this corresponds to

superClass.prototype[method].call(receiver, ...args)

but retains more structure at the IR level than using an explicit encoding of the above expression.

Given the non-native JS classes

class Bar extends js.Object
class Foo extends Bar

The node

JSSuperBrackerCall(LoadJSConstructor(ClassName("Bar")), receiver, method, args)

which is printed as

super(constructorOf[Bar])::receiver[method](...args)

has the following semantics:

Bar.prototype[method].call(receiver, ...args)

If this happens to be located in an instance method of Foo, and receiver happens to be This(), this is equivalent to the ES6 statement

super[method](...args)
sealed case class JSSuperSelect(superClass: Tree, receiver: Tree, item: Tree)(pos: Position) extends AssignLhs

Selects a property inherited from the given superClass on receiver.

Selects a property inherited from the given superClass on receiver.

Given the non-native JS classes

class Bar extends js.Object
class Foo extends Bar

The node

JSSuperBrackerSelect(LoadJSConstructor(ClassName("Bar")), qualifier, item)

which is printed as

super(constructorOf[Bar])::qualifier[item]

has the semantics of an ES6 super reference

super[item]

as if it were in an instance method of Foo with qualifier as the this value.

sealed case class JSTypeOfGlobalRef(globalRef: JSGlobalRef)(pos: Position) extends Tree
sealed case class JSUnaryOp(op: Code, lhs: Tree)(pos: Position) extends Tree

Unary operation (always preserves pureness).

Unary operation (always preserves pureness).

Operations which do not preserve pureness are not allowed in this tree. These are notably ++ and --

Companion
object
object JSUnaryOp
Companion
class
sealed case class LabelIdent(name: LabelName)(pos: Position) extends IRNode
sealed case class Labeled(label: LabelIdent, tpe: Type, body: Tree)(pos: Position) extends Tree
sealed trait Literal extends Tree

Marker for literals. Literals are always pure.

Marker for literals. Literals are always pure.

sealed case class LoadJSConstructor(className: ClassName)(pos: Position) extends Tree

Loads the constructor of a JS class (native or not).

Loads the constructor of a JS class (native or not).

className must represent a non-trait JS class (native or not).

This is used typically to instantiate a JS class, and most importantly if it is a non-native JS class. Given the class

class Foo(x: Int) extends js.Object

The instantiation new Foo(1) would be represented as

JSNew(LoadJSConstructor(ClassName("Foo")), List(IntLiteral(1)))

This node is also useful to encode o.isInstanceOf[Foo]:

JSBinaryOp(instanceof, o, LoadJSConstructor(ClassName("Foo")))

If Foo is non-native, the presence of this node makes it instantiable, and therefore reachable.

sealed case class LoadJSModule(className: ClassName)(pos: Position) extends Tree

Like LoadModule but for a JS module class.

Like LoadModule but for a JS module class.

sealed case class LoadModule(className: ClassName)(pos: Position) extends Tree
sealed case class LocalIdent(name: LocalName)(pos: Position) extends IRNode
sealed case class LongLiteral(value: Long)(pos: Position) extends Literal
sealed case class Match(selector: Tree, cases: List[(List[IntLiteral], Tree)], default: Tree)(tpe: Type)(pos: Position) extends Tree

A break-free switch (without fallthrough behavior). Unlike a JavaScript switch, it can be used in expression position. It supports alternatives explicitly (hence the List[IntLiteral] in cases), whereas in a switch one would use the fallthrough behavior to implement alternatives. (This is not a pattern matching construct like in Scala.)

A break-free switch (without fallthrough behavior). Unlike a JavaScript switch, it can be used in expression position. It supports alternatives explicitly (hence the List[IntLiteral] in cases), whereas in a switch one would use the fallthrough behavior to implement alternatives. (This is not a pattern matching construct like in Scala.)

sealed abstract class MemberDef extends IRNode

Any member of a ClassDef.

Any member of a ClassDef.

Partitioned into AnyFieldDef, MethodDef and JSMethodPropDef.

final class MemberFlags extends AnyVal
Companion
object
object MemberFlags
Companion
class
final class MemberNamespace extends AnyVal
Companion
object
Companion
class
sealed case class MethodDef(flags: MemberFlags, name: MethodIdent, originalName: OriginalName, args: List[ParamDef], resultType: Type, body: Option[Tree])(optimizerHints: OptimizerHints, hash: Option[TreeHash])(pos: Position) extends MemberDef
sealed case class MethodIdent(name: MethodName)(pos: Position) extends IRNode
sealed case class New(className: ClassName, ctor: MethodIdent, args: List[Tree])(pos: Position) extends Tree
sealed case class NewArray(typeRef: ArrayTypeRef, lengths: List[Tree])(pos: Position) extends Tree
sealed case class Null(pos: Position) extends Literal
final class OptimizerHints extends AnyVal
Companion
object
Companion
class
sealed case class ParamDef(name: LocalIdent, originalName: OriginalName, ptpe: Type, mutable: Boolean)(pos: Position) extends IRNode
sealed case class RecordSelect(record: Tree, field: FieldIdent)(tpe: Type)(pos: Position) extends AssignLhs
sealed case class RecordValue(tpe: RecordType, elems: List[Tree])(pos: Position) extends Tree
sealed case class Return(expr: Tree, label: LabelIdent)(pos: Position) extends Tree
sealed case class Select(qualifier: Tree, className: ClassName, field: FieldIdent)(tpe: Type)(pos: Position) extends AssignLhs
sealed case class SelectJSNativeMember(className: ClassName, member: MethodIdent)(pos: Position) extends Tree
sealed case class SelectStatic(className: ClassName, field: FieldIdent)(tpe: Type)(pos: Position) extends AssignLhs
sealed case class ShortLiteral(value: Short)(pos: Position) extends Literal
sealed case class Skip(pos: Position) extends Tree
sealed case class StoreModule(className: ClassName, value: Tree)(pos: Position) extends Tree
sealed case class StringLiteral(value: String)(pos: Position) extends Literal
sealed case class This(tpe: Type)(pos: Position) extends Tree
sealed case class Throw(expr: Tree)(pos: Position) extends Tree
sealed abstract class TopLevelExportDef extends IRNode
Companion
object
Companion
class
sealed case class TopLevelFieldExportDef(moduleID: String, exportName: String, field: FieldIdent)(pos: Position) extends TopLevelExportDef
sealed case class TopLevelJSClassExportDef(moduleID: String, exportName: String)(pos: Position) extends TopLevelExportDef
sealed case class TopLevelMethodExportDef(moduleID: String, methodDef: JSMethodDef)(pos: Position) extends TopLevelExportDef
sealed case class TopLevelModuleExportDef(moduleID: String, exportName: String)(pos: Position) extends TopLevelExportDef

Export for a top-level object.

Export for a top-level object.

This exports the singleton instance of the containing module class. The instance is initialized during ES module instantiation.

sealed case class Transient(value: Value)(pos: Position) extends Tree

A transient node for custom purposes.

A transient node for custom purposes.

A transient node is never a valid input to the Serializers nor to the linker, but can be used in a transient state for internal purposes.

Value Params
value

The payload of the transient node, without any specified meaning.

Companion
object
object Transient
Companion
class
sealed abstract class Tree extends IRNode with TreeOrJSSpread

Node for a statement or expression in the IR.

Node for a statement or expression in the IR.

final class TreeHash(val hash: Array[Byte])

A hash of a tree (usually a MethodDef).

A hash of a tree (usually a MethodDef).

Contains a SHA-1 hash.

sealed trait TreeOrJSSpread extends IRNode

Either a Tree or a JSSpread.

Either a Tree or a JSSpread.

This is the type of actual arguments to JS applications.

sealed case class TryCatch(block: Tree, errVar: LocalIdent, errVarOriginalName: OriginalName, handler: Tree)(tpe: Type)(pos: Position) extends Tree
sealed case class TryFinally(block: Tree, finalizer: Tree)(pos: Position) extends Tree
sealed case class UnaryOp(op: Code, lhs: Tree)(pos: Position) extends Tree

Unary operation (always preserves pureness).

Unary operation (always preserves pureness).

Companion
object
object UnaryOp
Companion
class
sealed case class Undefined(pos: Position) extends Literal
sealed case class VarDef(name: LocalIdent, originalName: OriginalName, vtpe: Type, mutable: Boolean, rhs: Tree)(pos: Position) extends Tree
sealed case class VarRef(ident: LocalIdent)(tpe: Type)(pos: Position) extends AssignLhs
sealed case class While(cond: Tree, body: Tree)(pos: Position) extends Tree

Value members

Concrete methods

Tests whether the given name is a valid JavaScript identifier name.

Tests whether the given name is a valid JavaScript identifier name.

This test does not exclude keywords.