
scala.tools.nsc.transform.Statics.scala Maven / Gradle / Ivy
package scala.tools.nsc
package transform
abstract class Statics extends Transform with ast.TreeDSL {
import global._
trait StaticsTransformer extends Transformer {
/** generate a static constructor with symbol fields inits, or an augmented existing static ctor
*/
def staticConstructor(body: List[Tree], localTyper: analyzer.Typer, pos: Position)(newStaticInits: List[Tree]): Tree =
body.collectFirst {
// If there already was a static ctor - augment existing one
// currently, however, static ctors aren't being generated anywhere else (!!!)
case ctor@DefDef(_, nme.CONSTRUCTOR, _, _, _, _) if ctor.symbol.hasStaticFlag =>
// modify existing static ctor
deriveDefDef(ctor) {
case block@Block(stats, expr) =>
// need to add inits to existing block
treeCopy.Block(block, newStaticInits ::: stats, expr)
case term: TermTree =>
// need to create a new block with inits and the old term
treeCopy.Block(term, newStaticInits, term)
}
} getOrElse {
// create new static ctor
val staticCtorSym = currentClass.newStaticConstructor(pos)
val rhs = Block(newStaticInits, Literal(Constant(())))
localTyper.typedPos(pos)(DefDef(staticCtorSym, rhs))
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy