summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-07-09 12:33:50 +0000
committerMartin Odersky <odersky@gmail.com>2003-07-09 12:33:50 +0000
commitb5f8932a9bf6314f12d11aa9cd96b3c6bfaed035 (patch)
tree25316166894b0a4b6dc5ee9f02cfa867f7879984 /sources/scalac
parentc3a8d9f14385b2c1f03c3bd3d563427af3d2278b (diff)
downloadscala-b5f8932a9bf6314f12d11aa9cd96b3c6bfaed035.tar.gz
scala-b5f8932a9bf6314f12d11aa9cd96b3c6bfaed035.tar.bz2
scala-b5f8932a9bf6314f12d11aa9cd96b3c6bfaed035.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/ast/parser/Parser.java8
-rw-r--r--sources/scalac/typechecker/Analyzer.java7
-rw-r--r--sources/scalac/typechecker/RefCheck.java6
3 files changed, 18 insertions, 3 deletions
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 51abeb52cf..87c8989f33 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -1603,10 +1603,12 @@ public class Parser implements Tokens {
if (s.token == EQUALS || restype == Tree.Empty) {
accept(EQUALS);
return make.DefDef(
- pos, mods, name, tparams, vparams, restype, constrExpr());
+ pos, mods | Modifiers.FINAL, name,
+ tparams, vparams, restype, constrExpr());
} else
- return make.DefDef(pos, mods | Modifiers.DEFERRED, name,
- tparams, vparams, restype, Tree.Empty);
+ return make.DefDef(
+ pos, mods | Modifiers.FINAL | Modifiers.DEFERRED, name,
+ tparams, vparams, restype, Tree.Empty);
}
/** TypeDef ::= Id `=' Type
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index 35e1a9550c..0dfba6795a 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -258,6 +258,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
void validate(Symbol sym) {
checkNoConflict(sym, DEFERRED, PRIVATE);
checkNoConflict(sym, FINAL, SEALED);
+ checkNoConflict(sym, FINAL, PRIVATE);
checkNoConflict(sym, PRIVATE, PROTECTED);
checkNoConflict(sym, PRIVATE, OVERRIDE);
checkNoConflict(sym, DEFERRED, FINAL);
@@ -751,6 +752,12 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
private Symbol enterSym(Tree tree, Symbol sym) {
//if (global.debug) System.out.println("entering " + sym);//DEBUG
sym.setInfo(new LazyTreeType(tree));
+ Symbol owner = sym.owner();
+ if (sym.kind == VAL && !sym.isConstructor() &&
+ (sym.flags & (PRIVATE | SEALED)) == 0 &&
+ owner != null && owner.kind == CLASS &&
+ (owner.flags & FINAL) != 0)
+ sym.flags |= FINAL;
sym = enterInScope(sym);
tree.setSymbol(sym);
return sym;
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index b47569282f..adb5cdd40b 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -830,6 +830,12 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
validateVariance(sym, sym.type(), CoVariance);
return super.transform(tree);
+ case ValDef(_, _, _, _):
+ validateVariance(
+ sym, sym.type(),
+ ((sym.flags & MUTABLE) != 0) ? NoVariance : CoVariance);
+ return super.transform(tree);
+
case TypeDef(_, _, _, _):
if (sym.kind == ALIAS) {
validateVariance(sym, sym.info(), NoVariance);