blob: 404e03e57294bc8a7f1bcc0e305aaf8b32876afc (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/* NSC -- new scala compiler
* Copyright 2005 LAMP/EPFL
* @author
*/
// $Id$
package scala.tools.nsc.transform;
/** A sample transform.
*/
abstract class SampleTransform extends Transform {
// inherits abstract value `global' and class `Phase' from Transform
import global._; // the global environment
import definitions._; // standard classes and methods
import typer.{typed, atOwner}; // methods to type trees
import posAssigner.atPos; // for filling in tree positions
/** the following two members override abstract members in Transform */
val phaseName: String = "sample-phase";
protected def newTransformer(unit: CompilationUnit): Transformer = new SampleTransformer(unit);
class SampleTransformer(unit: CompilationUnit) extends Transformer {
override def transform(tree: Tree): Tree = {
val tree1 = super.transform(tree); // transformers always maintain `currentOwner'.
tree1 match {
case Block(List(), expr) => // a simple optimization
expr
case Block(defs, sup @ Super(qual, mix)) => // A hypthothetic transformation, which replaces
// {super} by {super.sample}
copy.Block( // `copy' is the usual lazy tree copier
tree1, defs,
typed( // `typed' assigns types to its tree argument
atPos(tree1.pos)( // `atPos' fills in position of its tree argument
Select( // The `Select' factory method is defined in class `Trees'
sup,
currentOwner.newValue( // creates a new term symbol owned by `currentowner'
tree1.pos,
newTermName("sample")))))) // The standard term name creator
case _ =>
tree1
}
}
}
}
|