summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-03-12 09:52:16 +0000
committerMartin Odersky <odersky@gmail.com>2003-03-12 09:52:16 +0000
commit0f07bf588cd02d7b0ac4776d78d9c3fc7428e96c (patch)
tree3e97518ea344b50802339ab2002ca20583f0cb00 /sources/scalac
parent86beea21be94408044884415bbafcad5e0574c66 (diff)
downloadscala-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.java1
-rw-r--r--sources/scalac/symtab/Type.java33
-rw-r--r--sources/scalac/typechecker/Analyzer.java42
-rw-r--r--sources/scalac/typechecker/ImportList.java14
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: