summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-12-19 22:02:51 +0000
committerpaltherr <paltherr@epfl.ch>2003-12-19 22:02:51 +0000
commit2eed730f5fa149b88b00b7559959d6ae82acd519 (patch)
treee76666f1894f09228c4d6762a219a7c2502dfac1
parent77895f73d55e3fecf26c680fb936bfc3f2b8598d (diff)
downloadscala-2eed730f5fa149b88b00b7559959d6ae82acd519.tar.gz
scala-2eed730f5fa149b88b00b7559959d6ae82acd519.tar.bz2
scala-2eed730f5fa149b88b00b7559959d6ae82acd519.zip
- Added support for initializers
-rw-r--r--sources/scalac/transformer/ExpandMixins.java18
1 files changed, 18 insertions, 0 deletions
diff --git a/sources/scalac/transformer/ExpandMixins.java b/sources/scalac/transformer/ExpandMixins.java
index 295c3273b2..ded85488db 100644
--- a/sources/scalac/transformer/ExpandMixins.java
+++ b/sources/scalac/transformer/ExpandMixins.java
@@ -22,6 +22,7 @@ import scalac.ast.Tree;
import scalac.ast.Tree.Template;
import scalac.ast.TreeList;
import scalac.ast.TreeGen;
+import scalac.ast.TreeInfo;
import scalac.ast.GenTreeCloner;
import scalac.ast.TreeSymbolCloner;
import scalac.ast.Transformer;
@@ -173,6 +174,9 @@ superFixer.transform(template.body))));
boolean shadowed = name == null &&
members.lookup(member.name) != Symbol.NONE;
Symbol clone = cloner.cloneSymbol(member, shadowed);
+ if (member.isInitializer() && name == null)
+ clone.name = Name.fromString(
+ "$init$" + clone.name.toString().substring(6));
if (name != null)
clone.name = name;
else
@@ -206,6 +210,8 @@ superFixer.transform(template.body))));
private final GenTreeCloner mixinMemberCloner;
private class MixinMemberCloner extends GenTreeCloner {
+ private boolean initializer;
+
public MixinMemberCloner(ClassExpander expander) {
super(expander.global, expander.map, expander.cloner);
}
@@ -213,6 +219,7 @@ superFixer.transform(template.body))));
public Symbol getSymbolFor(Tree tree) {
switch (tree) {
case Select(Super(_, _), _):
+ if (tree.symbol().isInitializer()) return tree.symbol();
// !!! check
global.nextPhase();
Symbol symbol = tree.symbol().overridingSymbol(parents[0]);
@@ -228,6 +235,17 @@ superFixer.transform(template.body))));
}
public Tree transform(Tree tree) {
+ switch (tree) {
+ case DefDef(_, _, _, _, _, _):
+ if (getSymbolFor(tree).isInitializer()) initializer = true;
+ tree = super.transform(tree);
+ initializer = false;
+ return tree;
+ case Apply(Select(Super(_, _), _), _):
+ if (TreeInfo.methSymbol(tree).isInitializer() && !initializer)
+ return Tree.Empty;
+ break;
+ }
if (tree.hasSymbol() && tree.symbol().isParameter()) {
Symbol symbol = getSymbolFor(tree);
if (!symbol.isParameter()) {