summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-01-09 18:04:18 +0000
committerMartin Odersky <odersky@gmail.com>2004-01-09 18:04:18 +0000
commit74a2351508b63734acd86f1b247696b093730e0e (patch)
tree97c5fb40c88cff5de3deda83a1e2ae47c8bf07a5 /sources/scalac
parent6a29f17c212f5980dea3e8973a024804b446ccdb (diff)
downloadscala-74a2351508b63734acd86f1b247696b093730e0e.tar.gz
scala-74a2351508b63734acd86f1b247696b093730e0e.tar.bz2
scala-74a2351508b63734acd86f1b247696b093730e0e.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/ast/TreeGen.java4
-rw-r--r--sources/scalac/ast/parser/Parser.java24
-rw-r--r--sources/scalac/symtab/Definitions.java2
-rw-r--r--sources/scalac/symtab/Type.java16
-rw-r--r--sources/scalac/symtab/classfile/CLRPackageParser.java1
-rw-r--r--sources/scalac/typechecker/RefCheck.java35
-rw-r--r--sources/scalac/util/Names.java3
7 files changed, 54 insertions, 31 deletions
diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java
index 1c49620c0f..f9c4e9399d 100644
--- a/sources/scalac/ast/TreeGen.java
+++ b/sources/scalac/ast/TreeGen.java
@@ -1165,7 +1165,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
argtypes[i] = params[i].type();
}
Type[] parentTypes = {
- definitions.OBJECT_TYPE(),
+ definitions.ANYREF_TYPE(),
definitions.FUNCTION_TYPE(argtypes, restype) };
ClassSymbol clazz = new ClassSymbol(
pos, Names.ANON_CLASS_NAME.toTypeName(), owner, 0);
@@ -1196,7 +1196,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
ClassSymbol clazz = new ClassSymbol(
pos, Names.ANON_CLASS_NAME.toTypeName(), owner, 0);
Type[] parentTypes = {
- definitions.OBJECT_TYPE(),
+ definitions.ANYREF_TYPE(),
definitions.PARTIALFUNCTION_TYPE(pattype, restype)};
clazz.setInfo(Type.compoundType(parentTypes, new Scope(), clazz));
clazz.allConstructors().setInfo(
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 5b698764ad..d98324c970 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -275,9 +275,14 @@ public class Parser implements Tokens {
return make.Select(pos, scalaXmlDot(pos, Names.nobinding), name);
}
+ Tree scalaAnyRefConstr(int pos) {
+ return make.Apply(
+ pos, scalaDot(pos, Names.AnyRef.toTypeName()), Tree.EMPTY_ARRAY);
+ }
+
Tree scalaObjectConstr(int pos) {
return make.Apply(
- pos, scalaDot(pos, Names.Object.toTypeName()), Tree.EMPTY_ARRAY);
+ pos, scalaDot(pos, Names.ScalaObject.toTypeName()), Tree.EMPTY_ARRAY);
}
/** Create tree for for-comprehension <for (enums) do body> or
@@ -1885,22 +1890,25 @@ public class Parser implements Tokens {
*/
Template classTemplate() {
int pos = s.pos;
+ TreeList parents = new TreeList();
if (s.token == EXTENDS) {
s.nextToken();
- return template();
- } else if (s.token == WITH) {
+ parents.append(constr());
+ } else {
+ parents.append(scalaAnyRefConstr(pos));
+ }
+ parents.append(scalaObjectConstr(pos));
+ if (s.token == WITH) {
s.nextToken();
- TreeList parents = new TreeList();
- parents.append(scalaObjectConstr(pos));
- return template(parents);
+ return template(parents);
} else if (s.token == LBRACE) {
return (Template)make.Template(
- pos, new Tree[]{scalaObjectConstr(pos)}, templateBody());
+ pos, parents.toArray(), templateBody());
} else {
if (!(s.token == SEMI || s.token == COMMA || s.token == RBRACE))
syntaxError("`extends' or `{' expected", true);
return (Template)make.Template(
- pos, new Tree[]{scalaObjectConstr(pos)}, Tree.EMPTY_ARRAY);
+ pos, parents.toArray(), Tree.EMPTY_ARRAY);
}
}
diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java
index 79db92a581..8c59358a5e 100644
--- a/sources/scalac/symtab/Definitions.java
+++ b/sources/scalac/symtab/Definitions.java
@@ -491,7 +491,7 @@ public class Definitions {
DOUBLE_CLASS = getClass(Names.scala_Double);
// the scala reference classes
- OBJECT_CLASS = getClass(Names.scala_Object);
+ OBJECT_CLASS = getClass(Names.scala_ScalaObject);
STRING_CLASS = newAlias(SCALA_PACKAGE, Names.String, 0);
REF_CLASS = getClass(Names.scala_Ref);
for (int i = 1; i < TUPLE_COUNT; i++) {
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
index f0d4a7ce1f..b8b03a9ffb 100644
--- a/sources/scalac/symtab/Type.java
+++ b/sources/scalac/symtab/Type.java
@@ -754,7 +754,8 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
}
/** Is this type of the form scala.FunctionN[T_1, ..., T_n, +T] or
- * scala.Object with scala.FunctionN[T_1, ..., T_n, +T]?
+ * scala.AnyRef with scala.FunctionN[T_1, ..., T_n, +T] or
+ * java.lang.Object with scala.FunctionN[T_1, ..., T_n, +T]?
*/
public boolean isFunctionType() {
switch (this) {
@@ -764,7 +765,8 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
case CompoundType(Type[] parents, Scope members):
return members.isEmpty() &&
parents.length == 2 &&
- parents[0].symbol().fullName() == Names.scala_Object &&
+ (parents[0].symbol().fullName() == Names.java_lang_Object ||
+ parents[0].symbol().fullName() == Names.scala_AnyRef) &&
parents[1].isFunctionType();
}
return false;
@@ -850,13 +852,17 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
// take precedence over abstract ones.
int i = parts.length;
sym = Symbol.NONE;
- while (i > 0 && (sym.kind == NONE || (sym.flags & DEFERRED) != 0)) {
+ while (i > 0) {
i--;
Symbol sym1 = parts[i].lookupNonPrivate(name);
if (sym1.kind != NONE &&
(sym1.flags & PRIVATE) == 0 &&
- (sym.kind == NONE ||
- (sym1.flags & DEFERRED) == 0 ||
+ (sym.kind == NONE
+ ||
+ (sym.flags & DEFERRED) != 0 &&
+ (sym1.flags & DEFERRED) == 0
+ ||
+ (sym.flags & DEFERRED) == (sym1.flags & DEFERRED) &&
sym1.owner().isSubClass(sym.owner())))
sym = sym1;
}
diff --git a/sources/scalac/symtab/classfile/CLRPackageParser.java b/sources/scalac/symtab/classfile/CLRPackageParser.java
index bf2e6971e2..3197389979 100644
--- a/sources/scalac/symtab/classfile/CLRPackageParser.java
+++ b/sources/scalac/symtab/classfile/CLRPackageParser.java
@@ -246,7 +246,6 @@ public class CLRPackageParser extends MetadataParser {
clazz.allConstructors().setInfo(completer.staticsParser(clazz));
clazz.module().setInfo(completer.staticsParser(clazz));
members.enter(clazz);
- // ATTENTION: only if not scala.Object!
Scope.Entry e = members.lookupEntry(clazz.module().name);
if (e != Scope.Entry.NONE)
members.unlink(e);
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index afe0e0df7a..99603befd9 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -726,12 +726,16 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
}
private Tree tagMethod(ClassSymbol clazz) {
- Symbol tagSym = new TermSymbol(
- clazz.pos, Names.tag, clazz,
- clazz.isSubClass(defs.OBJECT_CLASS) ? OVERRIDE : 0)
- .setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, defs.INT_TYPE()));
- clazz.info().members().enter(tagSym);
- return gen.DefDef(tagSym, gen.mkIntLit(clazz.pos, clazz.tag()));
+ Symbol tagSym = new TermSymbol(
+ clazz.pos, Names.tag, clazz,
+ clazz.isSubClass(defs.OBJECT_CLASS) ? OVERRIDE : 0)
+ .setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, defs.INT_TYPE()));
+ clazz.info().members().enter(tagSym);
+ return gen.DefDef(
+ tagSym,
+ gen.mkIntLit(
+ clazz.pos,
+ clazz.isCaseClass() ? clazz.tag() : 0));
}
private Tree hashCodeMethod(ClassSymbol clazz) {
@@ -772,18 +776,23 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
}
// where
- private Template addCaseMethods(Template templ, Symbol sym) {
- if (sym.kind == CLASS && (sym.flags & CASE) != 0) {
- Tree[] body1 = addCaseMethods(templ.body, (ClassSymbol) sym);
- return copy.Template(templ, templ.parents, body1);
+ private Template addCaseMethods(Template templ, ClassSymbol sym) {
+ Tree[] body1;
+ if (sym.isCaseClass()) {
+ body1 = addCaseMethods(templ.body, sym);
+ } else {
+ body1 = new Tree[templ.body.length + 1];
+ System.arraycopy(templ.body, 0, body1, 0, templ.body.length);
+ body1[templ.body.length] = tagMethod(sym);
}
- return templ;
+ return copy.Template(templ, templ.parents, body1);
}
private Tree[] addCaseMethods(Tree[] stats, ClassSymbol clazz) {
TreeList ts = new TreeList();
- if (!hasImplementation(clazz, Names.toString))
+ if (!hasImplementation(clazz, Names.toString)) {
ts.append(toStringMethod(clazz));
+ }
if (!hasImplementation(clazz, Names.equals))
ts.append(equalsMethod(clazz));
if (!hasImplementation(clazz, Names.hashCode))
@@ -934,7 +943,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
validateVariance(sym, sym.info(), CoVariance);
validateVariance(sym, sym.typeOfThis(), CoVariance);
Tree tree1 = super.transform(
- copy.ClassDef(tree, tree.symbol(), tparams, vparams, tpe, addCaseMethods(templ, tree.symbol())));
+ copy.ClassDef(tree, tree.symbol(), tparams, vparams, tpe, addCaseMethods(templ, (ClassSymbol) tree.symbol())));
enclClass = enclClassPrev;
return tree1;
diff --git a/sources/scalac/util/Names.java b/sources/scalac/util/Names.java
index 912f866ada..5b284ca8e3 100644
--- a/sources/scalac/util/Names.java
+++ b/sources/scalac/util/Names.java
@@ -112,6 +112,7 @@ public class Names {
public static final Name Object = Name.fromString("Object");
public static final Name PartialFunction = Name.fromString("PartialFunction");
public static final Name Predef = Name.fromString("Predef");
+ public static final Name ScalaObject = Name.fromString("ScalaObject");
public static final Name ScalaRunTime = Name.fromString("ScalaRunTime");
public static final Name Seq = Name.fromString("Seq");
public static final Name Short = Name.fromString("Short");
@@ -181,7 +182,7 @@ public class Names {
public static final Name scala_Long = Name.fromString("scala.Long");
public static final Name scala_MatchError = Name.fromString("scala.MatchError");
public static final Name scala_Nil = Name.fromString("scala.Nil");
- public static final Name scala_Object = Name.fromString("scala.Object");
+ public static final Name scala_ScalaObject = Name.fromString("scala.ScalaObject");
public static final Name scala_PartialFunction = Name.fromString("scala.PartialFunction");
public static final Name scala_Predef = Name.fromString("scala.Predef");
public static final Name scala_Ref = Name.fromString("scala.Ref");