summaryrefslogtreecommitdiff
path: root/sources/scalac/typechecker/Analyzer.java
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-09-10 13:50:32 +0000
committerMartin Odersky <odersky@gmail.com>2003-09-10 13:50:32 +0000
commit957c42dadf55e3b67511077acfc4dd05e9a76b1d (patch)
tree2d2e3e6f8b0c903963d5b3a228bcaa0172dc4041 /sources/scalac/typechecker/Analyzer.java
parent86451906a534a8a09eafde0f35591071f0f0d5a3 (diff)
downloadscala-957c42dadf55e3b67511077acfc4dd05e9a76b1d.tar.gz
scala-957c42dadf55e3b67511077acfc4dd05e9a76b1d.tar.bz2
scala-957c42dadf55e3b67511077acfc4dd05e9a76b1d.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/typechecker/Analyzer.java')
-rw-r--r--sources/scalac/typechecker/Analyzer.java25
1 files changed, 17 insertions, 8 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index fc53218f5e..99629712a9 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -1117,7 +1117,10 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
} catch (Type.Error ex) {
reportTypeError(tree.pos, ex);
tree.type = Type.ErrorType;
- if (tree.hasSymbol() && tree.symbol() == null) tree.setSymbol(Symbol.ERROR);
+ if (tree.hasSymbol()) {
+ if (tree.symbol() != null) tree.symbol().setInfo(Type.ErrorType);
+ else tree.setSymbol(Symbol.ERROR);
+ }
}
this.unit = savedUnit;
@@ -1235,7 +1238,8 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
if (clazz.isCaseClass()) {
// set type to instantiated case class constructor
- tree.type = clazz.primaryConstructor().type();
+ tree.type = tree.type.prefix().memberType(
+ clazz.primaryConstructor());
switch (tree.type) {
case PolyType(Symbol[] tparams, Type restp):
try {
@@ -2031,7 +2035,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
return error(tree.pos, "method with return needs result type");
} else {
Symbol enclFun = context.owner.enclMethod();
- if (enclFun.kind == VAL) {
+ if (enclFun.kind == VAL && !enclFun.isConstructor()) {
Tree expr1 = transform(
expr, EXPRmode, enclFun.type().resultType());
return copy.Return(tree, expr1)
@@ -2178,7 +2182,12 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
assert tsym.isType() : tsym;
switch (fn1.type.unalias()) {
case TypeRef(Type pre, Symbol c, Type[] argtypes):
- if (c.kind == CLASS) {
+ if (c.kind != CLASS) {
+ error(tree.pos,
+ tsym + " is not a class; cannot be instantiated");
+ } else if (!pre.isStable()) {
+ error(tree.pos, pre + " is not a legal prefix for a constructor");
+ } else {
c.initialize();
Symbol constr = c.allConstructors();
Tree fn0 = fn1;
@@ -2206,9 +2215,6 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
//System.out.println(TreeInfo.methSymbol(fn1) + ":" + tp + " --> " + fn1.type + " of " + fn1);//DEBUG
selfcc = TreeInfo.isSelfConstrCall(fn0);
- } else {
- error(tree.pos,
- tsym + " is not a class; cannot be instantiated");
}
break;
default:
@@ -2475,7 +2481,10 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
} catch (Type.Error ex) {
reportTypeError(tree.pos, ex);
tree.type = Type.ErrorType;
- if (tree.hasSymbol() && tree.symbol() == null) tree.setSymbol(Symbol.ERROR);
+ if (tree.hasSymbol()) {
+ if (tree.symbol() != null) tree.symbol().setInfo(Type.ErrorType);
+ else tree.setSymbol(Symbol.ERROR);
+ }
return tree;
}
}