diff options
author | Martin Odersky <odersky@gmail.com> | 2007-04-04 16:30:11 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-04-04 16:30:11 +0000 |
commit | 51d9edec14b5c56f6fc4d283fa27fb7c7d782249 (patch) | |
tree | 2ba1165c504cac44b3b1545b8b1274ccf2b05ff9 /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | 7f3c7c392467b128af32d416edf521f468caf34c (diff) | |
download | scala-51d9edec14b5c56f6fc4d283fa27fb7c7d782249.tar.gz scala-51d9edec14b5c56f6fc4d283fa27fb7c7d782249.tar.bz2 scala-51d9edec14b5c56f6fc4d283fa27fb7c7d782249.zip |
explicit supercalls + new style for syntax + ba...
explicit supercalls + new style for syntax + backquoted ids in patterns
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 084ed5df2e..b54d378eb7 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -416,6 +416,15 @@ trait Typers requires Analyzer { } } + /** The typer for an expression, depending on where we are. If we are before a superclass + * call, this is a typer over a constructor context; otherwise it is the current typer. + */ + def exprTyper(inConstr: boolean): Typer = + if (inConstr) newTyper(context.makeConstructorContext) else this + + def valDefRhsTyper(vdef: ValDef): Typer = + newTyper(context.make(vdef, vdef.symbol)).exprTyper(vdef.mods hasFlag PRESUPER) + /** <p> * Post-process an identifier or selection node, performing the following: * </p> @@ -994,7 +1003,7 @@ trait Typers requires Analyzer { error(vdef.pos, "local variables must be initialized") vdef.rhs } else { - newTyper(context.make(vdef, sym)).transformedOrTyped(vdef.rhs, tpt1.tpe) + valDefRhsTyper(vdef).transformedOrTyped(vdef.rhs, tpt1.tpe) } copy.ValDef(vdef, vdef.mods, vdef.name, tpt1, checkDead(rhs1)) setType NoType } @@ -1365,11 +1374,8 @@ trait Typers requires Analyzer { checkNoDoubleDefs(List.mapConserve(stats)(typedStat)) } - def typedArg(arg: Tree, mode: int, newmode: int, pt: Type): Tree = { - val argTyper = if ((mode & SCCmode) != 0) newTyper(context.makeConstructorContext) - else this - checkDead(argTyper.typed(arg, mode & stickyModes | newmode, pt)) - } + def typedArg(arg: Tree, mode: int, newmode: int, pt: Type): Tree = + checkDead(exprTyper((mode & SCCmode) != 0).typed(arg, mode & stickyModes | newmode, pt)) def typedArgs(args: List[Tree], mode: int) = List.mapConserve(args)(arg => typedArg(arg, mode, 0, WildcardType)) |