diff options
author | Martin Odersky <odersky@gmail.com> | 2015-08-23 23:09:15 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-08-23 23:09:15 +0200 |
commit | 5710272caea25014ac36517543a85f07c5f801d1 (patch) | |
tree | fc2b43f46e28cf31919359a50f87866503bf2cde | |
parent | c0001fb3b3dfee3b16af608983a328df9c39b900 (diff) | |
download | dotty-5710272caea25014ac36517543a85f07c5f801d1.tar.gz dotty-5710272caea25014ac36517543a85f07c5f801d1.tar.bz2 dotty-5710272caea25014ac36517543a85f07c5f801d1.zip |
Make final vals have constant types if rhs is a constant.
This duplicates scalac behavior. Awaiting inline, this is a stopgap because we need this to work
for the bootstrap. Once we have inline (and a migration tool that rewrites final to final inline)
we can migrate this functionality over to inline values.
-rw-r--r-- | src/dotty/tools/dotc/typer/Namer.scala | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala index f6a0c8cc3..0e8b4d8cf 100644 --- a/src/dotty/tools/dotc/typer/Namer.scala +++ b/src/dotty/tools/dotc/typer/Namer.scala @@ -706,10 +706,18 @@ class Namer { typer: Typer => // println(s"final inherited for $sym: ${inherited.toString}") !!! // println(s"owner = ${sym.owner}, decls = ${sym.owner.info.decls.show}") + def isInline = sym.is(Final, butNot = Method) + def widenRhs(tp: Type): Type = tp match { + case tp: TermRef => widenRhs(tp.underlying) + case tp: ExprType => widenRhs(tp.resultType) + case tp: ConstantType if isInline => tp + case _ => tp.widen.approximateUnion + } val rhsCtx = ctx.addMode(Mode.InferringReturnType) - def rhsType = ctx.deskolemize( - typedAheadExpr(mdef.rhs, rhsProto)(rhsCtx).tpe.widen.approximateUnion) - def lhsType = fullyDefinedType(rhsType, "right-hand side", mdef.pos) + def rhsType = typedAheadExpr(mdef.rhs, rhsProto)(rhsCtx).tpe + def cookedRhsType = ctx.deskolemize(widenRhs(rhsType)) + def lhsType = fullyDefinedType(cookedRhsType, "right-hand side", mdef.pos) + //if (sym.name.toString == "y") println(i"rhs = $rhsType, cooked = $cookedRhsType") if (inherited.exists) inherited else { if (sym is Implicit) { |