From 74a2351508b63734acd86f1b247696b093730e0e Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 9 Jan 2004 18:04:18 +0000 Subject: *** empty log message *** --- sources/scalac/ast/TreeGen.java | 4 +-- sources/scalac/ast/parser/Parser.java | 24 ++++++++++----- sources/scalac/symtab/Definitions.java | 2 +- sources/scalac/symtab/Type.java | 16 ++++++---- .../scalac/symtab/classfile/CLRPackageParser.java | 1 - sources/scalac/typechecker/RefCheck.java | 35 ++++++++++++++-------- sources/scalac/util/Names.java | 3 +- 7 files changed, 54 insertions(+), 31 deletions(-) (limited to 'sources/scalac') 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 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"); -- cgit v1.2.3