summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-07-30 14:51:58 +0000
committerpaltherr <paltherr@epfl.ch>2003-07-30 14:51:58 +0000
commit728ab1f19fd79630b4c0919b960dad9ecf6055f1 (patch)
treea24abf1d22c8ed7eb22c7bc2d3b283797f1ab0aa /sources
parent8684be678d835f938a063ce9887370058254a22d (diff)
downloadscala-728ab1f19fd79630b4c0919b960dad9ecf6055f1.tar.gz
scala-728ab1f19fd79630b4c0919b960dad9ecf6055f1.tar.bz2
scala-728ab1f19fd79630b4c0919b960dad9ecf6055f1.zip
- Repolaced Tree argument of This and Super nod...
- Repolaced Tree argument of This and Super nodes by a Name argument
Diffstat (limited to 'sources')
-rw-r--r--sources/meta/scalac/ast/Tree.java8
-rw-r--r--sources/scalac/ast/TreeGen.java9
-rw-r--r--sources/scalac/ast/TreeInfo.java4
-rw-r--r--sources/scalac/ast/parser/Parser.java23
-rw-r--r--sources/scalac/ast/printer/TextTreePrinter.java13
-rw-r--r--sources/scalac/backend/msil/GenMSIL.java2
-rw-r--r--sources/scalac/checkers/CheckTypes.java2
-rw-r--r--sources/scalac/transformer/AddConstructors.java5
-rw-r--r--sources/scalac/transformer/AddInterfaces.java4
-rw-r--r--sources/scalac/transformer/ExplicitOuterClasses.java10
-rw-r--r--sources/scalac/typechecker/Analyzer.java106
-rw-r--r--sources/scalac/typechecker/DeSugarize.java2
12 files changed, 76 insertions, 112 deletions
diff --git a/sources/meta/scalac/ast/Tree.java b/sources/meta/scalac/ast/Tree.java
index cd666809c5..10948ef5d1 100644
--- a/sources/meta/scalac/ast/Tree.java
+++ b/sources/meta/scalac/ast/Tree.java
@@ -92,8 +92,8 @@ public class Tree {
n_Typed = node("Typed" , Term, NoSym),
n_TypeApply = node("TypeApply" , Term, NoSym),
n_Apply = node("Apply" , Term, NoSym),
- n_Super = node("Super" , Term, NoSym),
- n_This = node("This" , Term, NoSym),
+ n_Super = node("Super" , Term, HasSym),
+ n_This = node("This" , Term, HasSym),
n_Select = node("Select" , Test, HasSym),
n_Ident = node("Ident" , Test, HasSym),
n_Literal = node("Literal" , Term, NoSym),
@@ -283,12 +283,12 @@ public class Tree {
n_Super.
setDescription("Super reference").
setRange(Phase.PARSER, Phase.END).
- addField(t_TypeTree, "qualifier");
+ addField(t_TypeName, "qualifier", SymName);
n_This.
setDescription("Self reference").
setRange(Phase.PARSER, Phase.END).
- addField(t_TypeTree, "qualifier");
+ addField(t_TypeName, "qualifier", SymName);
n_Select.
setDescription("Designator").
diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java
index c3b22d9ac1..f890a63a61 100644
--- a/sources/scalac/ast/TreeGen.java
+++ b/sources/scalac/ast/TreeGen.java
@@ -108,7 +108,7 @@ public class TreeGen implements Kinds, Modifiers {
public Tree mkStableId(int pos, Type pre) {
switch (pre.expandModuleThis()) {
case ThisType(Symbol sym):
- return make.This(pos, Ident(pos, sym)).setType(pre);
+ return This(pos, sym);
case SingleType(Type pre1, Symbol sym):
return mkStable(mkRef(pos, pre1, sym));
default:
@@ -462,14 +462,13 @@ public class TreeGen implements Kinds, Modifiers {
/** Build and attribute this node with given symbol.
*/
public Tree This(int pos, Symbol sym) {
- Type type = sym.thisType();
- return make.This(pos, TypeTerm(pos, type)).setType(type);
+ return make.This(pos, sym).setType(sym.thisType());
}
/** Build and attribute super node with given type.
*/
- public Tree Super(int pos, Type type) {
- return make.Super(pos, TypeTerm(pos, type)).setType(type);
+ public Tree Super(int pos, Symbol sym) {
+ return make.Super(pos, sym).setType(sym.thisType());
}
/** Build and attribute value/variable/let definition node whose signature
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
index 7a0618c6b8..9c71e165f6 100644
--- a/sources/scalac/ast/TreeInfo.java
+++ b/sources/scalac/ast/TreeInfo.java
@@ -138,8 +138,8 @@ public class TreeInfo {
*/
public static boolean isSelf(Tree tree, Symbol enclClass) {
switch (tree) {
- case This(Tree qual):
- return qual.symbol() == enclClass;
+ case This(_):
+ return tree.symbol() == enclClass;
default:
return false;
}
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 00670ab8fc..3d88b2decf 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -424,7 +424,7 @@ public class Parser implements Tokens {
break;
case Apply(Tree fn, Tree[] args):
switch (fn) {
- case This(Tree.Empty):
+ case This(TypeNames.EMPTY):
return make.Apply(
t.pos, make.Ident(t.pos, constrname), args);
}
@@ -515,26 +515,27 @@ public class Parser implements Tokens {
Tree stableRef(boolean thisOK, boolean typeOK) {
Tree t;
if (s.token == THIS) {
- t = make.This(s.skipToken(), Tree.Empty);
+ t = make.This(s.skipToken(), TypeNames.EMPTY);
if (!thisOK || s.token == DOT)
t = selectors(accept(DOT), t, typeOK);
} else if (s.token == SUPER) {
- t = make.Super(s.skipToken(), Tree.Empty);
+ t = make.Super(s.skipToken(), TypeNames.EMPTY);
t = make.Select(accept(DOT), t, ident());
if (s.token == DOT)
t = selectors(s.skipToken(), t, typeOK);
} else {
- t = make.Ident(s.pos, ident());
+ Ident i = make.Ident(s.pos, ident());
+ t = i;
if (s.token == DOT) {
int pos = s.skipToken();
if (s.token == THIS) {
s.nextToken();
- t = make.This(pos, convertToTypeId(t));
+ t = make.This(i.pos, i.name.toTypeName());
if (!thisOK || s.token == DOT)
t = selectors(accept(DOT), t, typeOK);
} else if (s.token == SUPER) {
s.nextToken();
- t = make.Super(pos, convertToTypeId(t));
+ t = make.Super(i.pos, i.name.toTypeName());
t = make.Select(accept(DOT), t, ident());
if (s.token == DOT)
t = selectors(s.skipToken(), t, typeOK);
@@ -1495,18 +1496,20 @@ public class Parser implements Tokens {
int startpos = s.pos;
int pos;
if (s.token == THIS) {
- t = make.This(s.skipToken(), Tree.Empty);
+ t = make.This(s.skipToken(), TypeNames.EMPTY);
t = make.Select(accept(DOT), t, ident());
pos = accept(DOT);
} else {
- t = make.Ident(s.pos, ident());
+ Ident i = make.Ident(s.pos, ident());
pos = accept(DOT);
if (s.token == THIS) {
s.nextToken();
- t = make.This(pos, convertToTypeId(t));
+ t = make.This(i.pos, i.name.toTypeName());
t = make.Select(accept(DOT), t, ident());
pos = accept(DOT);
- }
+ } else {
+ t = i;
+ }
}
while (true) {
if (s.token == USCORE) {
diff --git a/sources/scalac/ast/printer/TextTreePrinter.java b/sources/scalac/ast/printer/TextTreePrinter.java
index dd46c8a710..8773c7e72e 100644
--- a/sources/scalac/ast/printer/TextTreePrinter.java
+++ b/sources/scalac/ast/printer/TextTreePrinter.java
@@ -15,6 +15,7 @@ import scalac.util.Debug;
import scalac.Global;
import scalac.Unit;
import scalac.util.Name;
+import scalac.util.TypeNames;
import java.io.*;
import java.util.*;
@@ -479,18 +480,18 @@ public class TextTreePrinter implements TreePrinter {
printType(tree);
break;
- case Super(Tree qualifier):
- if (qualifier != Tree.Empty) {
- print(qualifier);
+ case Super(Name name):
+ if (name != TypeNames.EMPTY) {
+ printSymbolUse(tree.symbol(), name);
print(TXT_DOT);
}
print(KW_SUPER);
printType(tree);
break;
- case This(Tree qualifier):
- if (qualifier != Tree.Empty) {
- print(qualifier);
+ case This(Name name):
+ if (name != TypeNames.EMPTY) {
+ printSymbolUse(tree.symbol(), name);
print(TXT_DOT);
}
print(KW_THIS);
diff --git a/sources/scalac/backend/msil/GenMSIL.java b/sources/scalac/backend/msil/GenMSIL.java
index 157440c074..ad8d26082c 100644
--- a/sources/scalac/backend/msil/GenMSIL.java
+++ b/sources/scalac/backend/msil/GenMSIL.java
@@ -586,7 +586,7 @@ public class GenMSIL /*implements Modifiers */ {
case This(_):
return items.SelfItem(tc.getType(currentClass));
- case Super(Tree tpe):
+ case Super(_):
//logErr("Not implemented yet: Super(" + Debug.show(sym) + ")");
//log("gen.Super(_): Super.symbol() = " + dumpSym(sym));
//log("gen.Super(tpe): tpe.symbol() = " + dumpSym(tpe.symbol()));
diff --git a/sources/scalac/checkers/CheckTypes.java b/sources/scalac/checkers/CheckTypes.java
index 631738ec7c..890bd23f7f 100644
--- a/sources/scalac/checkers/CheckTypes.java
+++ b/sources/scalac/checkers/CheckTypes.java
@@ -63,8 +63,6 @@ public class CheckTypes extends Checker {
checkIsTypeTerm(tree, tpe); break;
case Typed(_, Tree tpe):
checkIsTypeTerm(tree, tpe); break;
- case Super(Tree qualifier):
- checkIsTypeTerm(tree, qualifier); break;
}
}
}
diff --git a/sources/scalac/transformer/AddConstructors.java b/sources/scalac/transformer/AddConstructors.java
index 0879b2ea91..bf7cd290c5 100644
--- a/sources/scalac/transformer/AddConstructors.java
+++ b/sources/scalac/transformer/AddConstructors.java
@@ -161,13 +161,12 @@ public class AddConstructors extends Transformer {
}
// inline the call to the super constructor
- Type superType = treeSym.parents()[0];
- if ( !forINT || !superType.symbol().isJava()) {
+ if ( !forINT || !treeSym.parents()[0].symbol().isJava()) {
switch (baseClasses[0]) {
case Apply(Tree fun, Tree[] args):
int pos = baseClasses[0].pos;
Tree superConstr = gen.Select
- (gen.Super(pos, superType),
+ (gen.Super(pos, treeSym),
getConstructor(fun.symbol()));
constrBody.add(gen.Apply(superConstr, transform(args)));
break;
diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java
index b6fa5422e2..3d11c5b019 100644
--- a/sources/scalac/transformer/AddInterfaces.java
+++ b/sources/scalac/transformer/AddInterfaces.java
@@ -146,9 +146,9 @@ class AddInterfaces extends Transformer {
return newTree;
}
- case This(Ident qualifier): {
+ case This(_): {
// Use class symbol for references to "this".
- Symbol classThisSym = phase.getClassSymbol(qualifier.symbol());
+ Symbol classThisSym = phase.getClassSymbol(tree.symbol());
return gen.This(tree.pos, classThisSym);
}
diff --git a/sources/scalac/transformer/ExplicitOuterClasses.java b/sources/scalac/transformer/ExplicitOuterClasses.java
index 1bb6288cf6..d60507288c 100644
--- a/sources/scalac/transformer/ExplicitOuterClasses.java
+++ b/sources/scalac/transformer/ExplicitOuterClasses.java
@@ -153,7 +153,7 @@ public class ExplicitOuterClasses extends Transformer {
for (int i = 0; i < argsSym.length; ++i)
args[i] = gen.mkRef(argsSym[i].pos, argsSym[i]);
Tree fwdBody =
- gen.Apply(gen.Select(gen.Super(classSym.pos, classSym.type()),
+ gen.Apply(gen.Select(gen.Super(classSym.pos, classSym),
funSym),
args);
@@ -193,20 +193,20 @@ public class ExplicitOuterClasses extends Transformer {
}
}
- case This(Tree qualifier): {
+ case This(_): {
// If "this" refers to some outer class, replace it by
// explicit reference to it.
- int level = qualifier.hasSymbol() ? outerLevel(qualifier.symbol()) : 0;
+ int level = outerLevel(tree.symbol());
if (level > 0)
return outerRef(level);
else
return super.transform(tree);
}
- case Select(Super(Tree qualifier), Name selector): {
+ case Select(Super(_), Name selector): {
// If "super" refers to an outer class, access the value
// (a method) through outer link(s).
- int level = outerLevel(qualifier.type.symbol());
+ int level = outerLevel(((Select)tree).qualifier.symbol());
if (level > 0)
return gen.Select(outerRef(level),
outerSuperSym(level, tree.symbol()));
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index 79b1a0900e..5e4684b423 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -1100,7 +1100,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
Tree makeStableId(int pos, Type tp) {
if (tp.symbol().isCompoundSym())
- return make.This(pos, Tree.Empty).setType(tp);
+ return gen.This(pos, tp.symbol());
else
return gen.mkStableId(pos, tp);
}
@@ -1234,11 +1234,14 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
} else if ((mode & QUALmode) == 0) {
// check that packages and static modules are not used as values
- Symbol sym = tree.symbol();
- if (tree.isTerm() &&
- sym != null && sym.kind != ERROR && !sym.isValue()) {
- error(tree.pos, tree.symbol() + " is not a value");
- }
+ switch (tree) {
+ case Ident(_):
+ case Select(_, _):
+ Symbol sym = tree.symbol();
+ if (sym != null && sym.kind != ERROR && !sym.isValue()) {
+ error(tree.pos, tree.symbol() + " is not a value");
+ }
+ }
}
}
@@ -2133,56 +2136,19 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
infer.applyErrorMsg(
"", fn1, " cannot be applied to ", argtypes, pt));
- case Super(Tree qual):
- Symbol clazz;
- Tree qual1;
- if (qual == Tree.Empty) {
- clazz = context.enclClass.owner;
- if (clazz != null) {
- qual1 = gen.Ident(tree.pos, clazz);
- } else {
- return error(
- tree.pos,
- "super can be used only in a class, object, or template");
- }
- } else {
- qual1 = transform(qual, TYPEmode | FUNmode);
- clazz = qualifyingClass(qual1);
- if (clazz.kind == CLASS && !(qual1 instanceof Tree.Ident))
- qual1 = gen.Ident(tree.pos, clazz);
- }
- switch (clazz.info()) {
- case CompoundType(Type[] parents, _):
- return copy.Super(tree, qual1)
- .setType(Type.compoundType(parents, Scope.EMPTY).symbol().thisType());
- case ErrorType:
- return tree.setType(Type.ErrorType);
- default:
- return error(qual.pos, "class identifier expected");
- }
+ case Super(Name name):
+ Symbol clazz = qualifyingClass(tree, name);
+ tree.setSymbol(clazz);
+ if (clazz == Symbol.ERROR) return tree.setType(Type.ErrorType);
+ return tree.setType(Type.compoundType(clazz.parents(), Scope.EMPTY).symbol().thisType());
- case This(Tree qual):
- Symbol clazz;
- Tree tree1;
- if (qual == Tree.Empty) {
- clazz = context.enclClass.owner;
- if (clazz != null) {
- tree1 = makeStableId(tree.pos, clazz.thisType());
- } else {
- return error(
- tree.pos, tree +
- " can be used only in a class, object, or template");
- }
- } else {
- Tree qual1 = transform(qual, TYPEmode | FUNmode);
- clazz = qualifyingClass(qual1);
- if (clazz.kind == CLASS && !(qual1 instanceof Tree.Ident))
- qual1 = gen.Ident(tree.pos, clazz);
- tree1 = copy.This(tree, qual1);
- }
- return tree1.setType(
- (pt != null && pt.isStable() || (mode & QUALmode) != 0)
- ? clazz.thisType() : clazz.typeOfThis());
+ case This(Name name):
+ Symbol clazz = qualifyingClass(tree, name);
+ tree.setSymbol(clazz);
+ if (clazz == Symbol.ERROR) return tree.setType(Type.ErrorType);
+ return tree.setType(
+ (pt != null && pt.isStable() || (mode & QUALmode) != 0)
+ ? clazz.thisType() : clazz.typeOfThis());
case Select(Tree qual, Name name):
int qualmode = EXPRmode | POLYmode | QUALmode;
@@ -2288,22 +2254,20 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
}
//where
- private Symbol qualifyingClass(Tree qual) {
- Tree qual1 = transform(qual, TYPEmode | FUNmode);
- Symbol clazz = qual1.symbol();
- if (clazz.kind == CLASS) {
- Context clazzContext = context.outerContext(clazz);
- if (clazzContext != Context.NONE) {
- return clazz;
- } else {
- error(qual.pos, clazz.name + " is not an enclosing class");
- return Symbol.NONE;
- }
- } else {
- error(qual.pos, "class identifier expected");
- return Symbol.NONE;
- }
-
+ private Symbol qualifyingClass(Tree tree, Name name) {
+ if (name == TypeNames.EMPTY) {
+ Symbol clazz = context.enclClass.owner;
+ if (clazz != null) return clazz;
+ error(tree.pos, tree +
+ " can be used only in a class, object, or template");
+ } else {
+ for (Context i = context; i != Context.NONE; i = i.outer) {
+ Symbol sym = i.owner;
+ if (sym.kind == CLASS && sym.name == name) return sym;
+ }
+ error(tree.pos, name + " is not an enclosing class");
+ }
+ return Symbol.ERROR;
}
// ///////////////
diff --git a/sources/scalac/typechecker/DeSugarize.java b/sources/scalac/typechecker/DeSugarize.java
index e5634390e4..dc7e01378d 100644
--- a/sources/scalac/typechecker/DeSugarize.java
+++ b/sources/scalac/typechecker/DeSugarize.java
@@ -331,7 +331,7 @@ public class DeSugarize implements Kinds, Modifiers {
case Ident(Name name):
return
make.Select(tree.pos,
- make.This(tree.pos, Tree.Empty).setType(currentclazz.type()),
+ gen.This(tree.pos, currentclazz),
name).setSymbol(tree.symbol()).setType(tree.type);
case TypeApply(Tree fn, Tree[] args):
return copy.TypeApply(tree, postMatch(fn, currentclazz), args);