diff options
author | Martin Odersky <odersky@gmail.com> | 2003-03-12 09:52:16 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-03-12 09:52:16 +0000 |
commit | 0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c (patch) | |
tree | 3e97518ea344b50802339ab2002ca20583f0cb00 /sources/scalac | |
parent | 86beea21be94408044884415bbafcad5e0574c66 (diff) | |
download | scala-0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c.tar.gz scala-0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c.tar.bz2 scala-0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/ast/printer/TextTreePrinter.java | 1 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 33 | ||||
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 42 | ||||
-rw-r--r-- | sources/scalac/typechecker/ImportList.java | 14 |
4 files changed, 68 insertions, 22 deletions
diff --git a/sources/scalac/ast/printer/TextTreePrinter.java b/sources/scalac/ast/printer/TextTreePrinter.java index b41642af07..a56f1e43c7 100644 --- a/sources/scalac/ast/printer/TextTreePrinter.java +++ b/sources/scalac/ast/printer/TextTreePrinter.java @@ -324,6 +324,7 @@ public class TextTreePrinter implements TreePrinter { print(KW_IMPORT); print(Text.Space); print(expr); + print(TXT_DOT); print(TXT_LEFT_BRACE); for (int i = 0; i < selectors.length; i = i + 2) { if (i > 0) print(TXT_COMMA_SP); diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index 3874954d30..ad862d5cf4 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -121,7 +121,7 @@ public class Type implements Modifiers, Kinds, TypeTags { } public static Type typeRef(Type pre, Symbol sym, Type[] args) { - if (pre.isStable() || pre == ErrorType) + if (pre.isLegalPrefix() || pre == ErrorType) return TypeRef(pre, sym, args); else if (sym.kind == ALIAS) return pre.memberInfo(sym); @@ -458,6 +458,22 @@ public class Type implements Modifiers, Kinds, TypeTags { } } + /** Is this type a legal prefix? + */ + public boolean isLegalPrefix() { + switch (unalias()) { + case ThisType(_): + case SingleType(_, _): + return true; + case TypeRef(_, Symbol sym, _): + return sym.kind == CLASS && + ((sym.flags & JAVA) != 0 || + (sym.flags & (TRAIT | ABSTRACTCLASS)) == 0); + default: + return false; + } + } + /** Is this type a reference to an object type? */ public boolean isObjectType() { @@ -895,7 +911,8 @@ public class Type implements Modifiers, Kinds, TypeTags { Type toPrefix(Type pre, Symbol clazz) { if (pre == NoType || clazz.kind != CLASS) return this; - else if (pre.widen().symbol().isSubClass(symbol())) + else if (symbol().isSubClass(clazz) && + pre.widen().symbol().isSubClass(symbol())) return pre; else return toPrefix(pre.baseType(clazz).prefix(), clazz.owner()); @@ -1218,15 +1235,7 @@ public class Type implements Modifiers, Kinds, TypeTags { case NoType: return false; - case ThisType(Symbol sym1): - switch (this) { - case ThisType(Symbol sym): - return sym.isSubClass(sym1); - case SingleType(_, _): - return this.isSameAs(that); - } - break; - + case ThisType(_): case SingleType(_, _): switch (this) { case ThisType(_): @@ -1238,7 +1247,7 @@ public class Type implements Modifiers, Kinds, TypeTags { case TypeRef(Type pre1, Symbol sym1, Type[] args1): switch (this) { case TypeRef(Type pre, Symbol sym, Type[] args): - if (sym == sym1 && pre.isSubType(pre1) && isSubArgs(args, args1)) + if (sym == sym1 && pre.isSameAs(pre1) && isSubArgs(args, args1)) return true; break; } diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index f6400b3872..a89da81175 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -481,16 +481,17 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { try { return checkNoEscapeMap.apply(tp); } catch (Type.Error ex) { - error(pos, ex.msg); + error(pos, ex.msg + " as part of " + tp.unalias()); return Type.ErrorType; } } //where private Type.Map checkNoEscapeMap = new Type.Map() { public Type apply(Type t) { - switch (t.unalias()) { - case TypeRef(ThisType(_), Symbol sym, Type[] args): - checkNoEscape(t, sym); + switch (t) { + case TypeRef(Type pre, Symbol sym, Type[] args): + if (sym.kind == ALIAS) return apply(t.unalias()); + else if (pre instanceof Type.ThisType) checkNoEscape(t, sym); break; case SingleType(ThisType(_), Symbol sym): checkNoEscape(t, sym); @@ -636,6 +637,36 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { // Entering Symbols ---------------------------------------------------------- + Tree transformPackageId(Tree tree) { + switch (tree) { + case Ident(Name name): + return tree + .setSymbol(packageSymbol(tree.pos, definitions.ROOT, name)) + .setType(tree.symbol().type()); + case Select(Tree qual, Name name): + Tree qual1 = transformPackageId(qual); + return copy.Select(tree, qual1, name) + .setSymbol(packageSymbol(tree.pos, qual1.symbol(), name)) + .setType(tree.symbol().type()); + default: + return transform(tree); + } + } + + Symbol packageSymbol(int pos, Symbol base, Name name) { + Symbol p = base.members().lookup(name); + if (p.kind == NONE) { + p = TermSymbol.newModule( + Position.NOPOS, name, base.moduleClass(), JAVA | PACKAGE); + p.moduleClass().setInfo(Type.compoundType(Type.EMPTY_ARRAY, new Scope(), p)); + base.members().enter(p); + } else if (!p.isPackage()) { + error(pos, "package and class with same name"); + p = Symbol.ERROR; + } + return p; + } + /** If `tree' is a definition, create a symbol for it with a lazily * constructed type, and enter into current scope. */ @@ -648,8 +679,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { case Template(_, Tree[] body): pushContext(tree, context.owner, context.scope); context.imports = null; - ((PackageDef) tree).packaged = packaged = - transform(packaged, QUALmode); + ((PackageDef) tree).packaged = packaged = transformPackageId(packaged); popContext(); Symbol pkg = checkStable(packaged).symbol(); if (pkg != null && pkg.kind != ERROR) { diff --git a/sources/scalac/typechecker/ImportList.java b/sources/scalac/typechecker/ImportList.java index 9e7e79110d..ba45996570 100644 --- a/sources/scalac/typechecker/ImportList.java +++ b/sources/scalac/typechecker/ImportList.java @@ -49,12 +49,18 @@ class ImportList { switch (tree) { case Import(Tree expr, Name[] selectors): for (int i = 0; i < selectors.length; i = i + 2) { - if (i + 1 < selectors.length && name == selectors[i + 1]) - return t.lookupNonPrivate(selectors[i]); - else if (name == selectors[i]) + if (i + 1 < selectors.length && name.toTermName() == selectors[i + 1]) { + if (name.isTypeName()) + return t.lookupNonPrivate(selectors[i].toTypeName()); + else if (name.isConstrName()) + return t.lookupNonPrivate(selectors[i].toConstrName()); + else + return t.lookupNonPrivate(selectors[i]); + } else if (name.toTermName() == selectors[i]) { renamed = true; - else if (selectors[i] == Names.WILDCARD && !renamed) + } else if (selectors[i] == Names.WILDCARD && !renamed) { return t.lookupNonPrivate(name); + } } return Symbol.NONE; default: |