summaryrefslogtreecommitdiff
path: root/sources/scalac/typechecker/Analyzer.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/typechecker/Analyzer.java')
-rw-r--r--sources/scalac/typechecker/Analyzer.java67
1 files changed, 41 insertions, 26 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index dd8a65ff22..5434867311 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -655,7 +655,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
case DefDef(int mods, Name name, _, _, _, _):
return enterSym(tree, new TermSymbol(tree.pos, name, owner, mods));
- case TypeDef(int mods, Name name, _, _):
+ case TypeDef(int mods, Name name, _):
int kind = (mods & (DEFERRED | PARAM)) != 0 ? TYPE : ALIAS;
return enterSym(tree, new TypeSymbol(kind, tree.pos, name, owner, mods));
@@ -798,6 +798,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
case ValDef(int mods, Name name, Tree tpe, Tree rhs):
if (tpe == Tree.Empty) {
+ pushContext(tree, sym, context.scope);
if (rhs == Tree.Empty) {
if ((sym.owner().flags & ACCESSOR) != 0) {
// this is the paremeter of a variable setter method.
@@ -813,6 +814,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
((ValDef) tree).rhs = rhs = transform(rhs, EXPRmode);
owntype = rhs.type.widen();
}
+ popContext();
} else {
owntype = transform(tpe, TYPEmode).type;
}
@@ -835,7 +837,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
owntype = makeMethodType(tparamSyms, vparamSyms, restpe);
break;
- case TypeDef(int mods, Name name, Tree.TypeDef[] tparams, Tree rhs):
+ case TypeDef(int mods, Name name, Tree rhs):
//todo: alwyas have context.owner as owner.
if (sym.kind == TYPE) {
pushContext(rhs, context.owner, context.scope);
@@ -1073,8 +1075,15 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
qual.type.isStable())
symtype = Type.singleType(qual.type, sym);
//System.out.println(qual.type + ".member: " + sym + ":" + symtype);//DEBUG
- return copy.Select(tree, qual, name)
- .setSymbol(sym).setType(symtype);
+ switch (tree) {
+ case Select(_, _):
+ return copy.Select(tree, qual, name)
+ .setSymbol(sym).setType(symtype);
+ case SelectFromType(_, _):
+ return make.TypeTerm(tree.pos).setType(symtype);
+ default:
+ throw new ApplicationError();
+ }
}
}
@@ -1600,7 +1609,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
tpe1 = gen.mkType(rhs1.pos, rhs.type.widen());
// rhs already attributed by defineSym in this case
} else if (rhs != Tree.Empty) {
+ pushContext(tree, sym, context.scope);
rhs1 = transform(rhs1, EXPRmode, sym.type());
+ popContext();
}
return copy.ValDef(tree, mods, name, tpe1, rhs1)
.setType(definitions.UNIT_TYPE);
@@ -1624,15 +1635,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
return copy.DefDef(tree, mods, name, tparams1, vparams1, tpe1, rhs1)
.setType(definitions.UNIT_TYPE);
- case TypeDef(int mods, Name name, Tree.TypeDef[] tparams, Tree rhs):
+ case TypeDef(int mods, Name name, Tree rhs):
pushContext(tree, sym, new Scope(context.scope));
- reenterParams(tparams);
- Tree.TypeDef[] tparams1 = transform(tparams);
int mode = TYPEmode;
if (sym.kind == ALIAS) mode |= FUNmode;
Tree rhs1 = transform(rhs, mode);
popContext();
- return copy.TypeDef(tree, mods, name, tparams1, rhs1)
+ return copy.TypeDef(tree, mods, name, rhs1)
.setType(definitions.UNIT_TYPE);
case Import(Tree expr, Name[] selectors):
@@ -1913,9 +1922,12 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
case Literal(Object value):
return tree.setType(definitions.getType(value2TypeName(value)));
+ case TypeTerm():
+ return tree;
+
case SingletonType(Tree ref):
Tree ref1 = transform(ref, EXPRmode, Type.AnyType);
- return copy.SingletonType(tree, ref1)
+ return make.TypeTerm(tree.pos)
.setType(checkObjectType(tree.pos, ref1.type));
case SelectFromType(Tree qual, Name name):
@@ -1936,40 +1948,43 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
Tree[] refinements1 = transformStatSeq(refinements, Symbol.NONE);
checkAllOverrides(clazz);
popContext();
- return copy.CompoundType(tree, parents1, refinements1)
+ return make.TypeTerm(tree.pos)
.setType(self);
case AppliedType(Tree tpe, Tree[] args):
Tree tpe1 = transform(tpe, TYPEmode | FUNmode);
Tree[] args1 = transform(args, TYPEmode);
Type[] argtypes = Tree.typeOf(args);
- Symbol[] tparams = tpe1.type.typeParams();
+ //todo: this needs to be refined.
+ Symbol[] tparams =
+ (Type.isSameAs(tpe1.type.typeArgs(), Symbol.type(tpe1.type.typeParams())))
+ ? tpe1.type.typeParams()
+ : Symbol.EMPTY_ARRAY;
+ Type owntype = Type.ErrorType;
if (tpe1.type != Type.ErrorType) {
- if (tparams.length != args.length) {
- if (tparams.length == 0)
- return error(tree, tpe1.type +
- " does not take type parameters");
- else
- return error(tree,
- "wrong number of type arguments for " +
- tpe1.type);
- } else {
+ if (tparams.length == args.length) {
try {
if (!context.delayArgs)
infer.checkBounds(tparams, argtypes, "");
+ owntype = Type.appliedType(tpe1.type, argtypes);
} catch (Type.Error ex) {
- return error(tree, ex.msg);
+ error(tree.pos, ex.msg);
}
+ } else {
+ if (tparams.length == 0)
+ error(tree.pos, tpe1.type +
+ " does not take type parameters");
+ else
+ error(tree.pos,
+ "wrong number of type arguments for " +
+ tpe1.type);
}
- return copy.AppliedType(tree, tpe1, args1)
- .setType(Type.appliedType(tpe1.type, argtypes));
- } else {
- return tpe1;
}
+ return make.TypeTerm(tree.pos).setType(owntype);
case CovariantType(Tree tpe):
Tree tpe1 = transform(tpe, TYPEmode);
- return copy.CovariantType(tree, tpe1)
+ return make.TypeTerm(tree.pos)
.setType(Type.covarType(tpe1.type));
case FunType(_, _):