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.java29
1 files changed, 17 insertions, 12 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index 5190f2da97..f4d2ed8fa0 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -213,9 +213,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
// Name resolution -----------------------------------------------------------
String decode(Name name) {
- if (name.isTypeName()) return "type " + name;
- else if (name.isConstrName()) return "constructor " + name;
- else return "value " + name.toString();
+ if (name.isTypeName()) return "type " + NameTransformer.decode(name);
+ else if (name.isConstrName()) return "constructor " + NameTransformer.decode(name);
+ else return "value " + NameTransformer.decode(name);
}
/** Is `sym' accessible as a member of tree `site' in current context?
@@ -692,9 +692,10 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
*/
int flip(Symbol base, Symbol tvar) {
Symbol clazz = tvar.owner().primaryConstructorClass();
- Symbol sym = clazz;
+ Symbol sym = base;
int flip = CoVariance;
while (sym != clazz && flip != AnyVariance) {
+ //System.out.println("flip: " + sym + " " + sym.isParameter());//DEBUG
if (sym.isParameter()) flip = -flip;
else if (sym.owner().kind != CLASS) flip = AnyVariance;
else if (sym.kind == ALIAS) flip = NoVariance;
@@ -723,10 +724,11 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
if (sym.variance() != 0) {
int f = flip(base, sym);
if (f != AnyVariance && sym.variance() != f * variance) {
- error(sym.pos,
+ //System.out.println("flip(" + base + "," + sym + ") = " + f);//DEBUG
+ error(base.pos,
varianceString(sym.variance()) + " " + sym +
- " occurs in " + f * variance +
- " position in type " + all);
+ " occurs in " + varianceString(f * variance) +
+ " position in type " + all + " of " + base);
}
}
validateVariance(base, all, pre, variance);
@@ -753,7 +755,8 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
void validateVariance(Symbol base, Type all, Type[] tps, int variance, Symbol[] tparams) {
for (int i = 0; i < tps.length; i++)
- validateVariance(base, all, tps[i], variance * tparams[i].variance());
+ if (tps[i] != tparams[i].type())
+ validateVariance(base, all, tps[i], variance * tparams[i].variance());
}
// Entering Symbols ----------------------------------------------------------
@@ -1108,8 +1111,6 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
// enter all members
Scope members = new Scope();
pushContext(templ, clazz, members);
- if ((clazz.flags & CASE) != 0)
- templ.body = desugarize.addCaseMethods(templ.body, clazz, parents);
templ.body = desugarize.Statements(templ.body, false);
enterSyms(templ.body);
popContext();
@@ -1954,11 +1955,15 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
case TypeDef(_, _, Tree rhs, Tree lobound):
pushContext(tree, sym, new Scope(context.scope));
int mode = TYPEmode;
- if (sym.kind == ALIAS) mode |= FUNmode;
+ int variance = CoVariance;
+ if (sym.kind == ALIAS) {
+ mode |= FUNmode;
+ variance = NoVariance;
+ }
Tree rhs1 = transform(rhs, mode);
Tree lobound1 = transform(lobound, TYPEmode);
popContext();
- validateVariance(sym, sym.info(), NoVariance);
+ validateVariance(sym, sym.info(), variance);
return copy.TypeDef(tree, sym, rhs1, lobound1)
.setType(definitions.UNIT_TYPE);