From b5f8932a9bf6314f12d11aa9cd96b3c6bfaed035 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 9 Jul 2003 12:33:50 +0000 Subject: *** empty log message *** --- sources/scalac/ast/parser/Parser.java | 8 +++++--- sources/scalac/typechecker/Analyzer.java | 7 +++++++ sources/scalac/typechecker/RefCheck.java | 6 ++++++ 3 files changed, 18 insertions(+), 3 deletions(-) (limited to 'sources') 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); -- cgit v1.2.3