Skip to content

Commit fef4ddf

Browse files
committed
Resolving cases for def-tree
1 parent 0f1586d commit fef4ddf

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

compiler/src/dotty/tools/dotc/transform/init/Semantic.scala

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -790,13 +790,11 @@ class Semantic {
790790
Result(value, Nil)
791791

792792
case Block(stats, expr) =>
793-
val (ress, env2) = eval(stats, thisV, klass)
794-
withEnv(env2) {
795-
eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
796-
}
793+
val ress = eval(stats, thisV, klass)
794+
eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
797795

798796
case If(cond, thenp, elsep) =>
799-
val (ress, env2) = eval(cond :: thenp :: elsep :: Nil, thisV, klass)
797+
val ress = eval(cond :: thenp :: elsep :: Nil, thisV, klass)
800798
val value = ress.map(_.value).join
801799
val errors = ress.flatMap(_.errors)
802800
Result(value, errors)
@@ -807,7 +805,7 @@ class Semantic {
807805

808806
case Match(selector, cases) =>
809807
val res1 = eval(selector, thisV, klass).ensureHot("The value to be matched needs to be fully initialized", selector)
810-
val (ress, env) = eval(cases.map(_.body), thisV, klass)
808+
val ress = eval(cases.map(_.body), thisV, klass)
811809
val value = ress.map(_.value).join
812810
val errors = res1.errors ++ ress.flatMap(_.errors)
813811
Result(value, errors)
@@ -816,15 +814,15 @@ class Semantic {
816814
eval(expr, thisV, klass).ensureHot("return expression may only be initialized value", expr)
817815

818816
case WhileDo(cond, body) =>
819-
val (ress, env2) = eval(cond :: body :: Nil, thisV, klass)
817+
val ress = eval(cond :: body :: Nil, thisV, klass)
820818
Result(Hot, ress.flatMap(_.errors))
821819

822820
case Labeled(_, expr) =>
823821
eval(expr, thisV, klass)
824822

825823
case Try(block, cases, finalizer) =>
826824
val res1 = eval(block, thisV, klass)
827-
val (ress, env2) = eval(cases.map(_.body), thisV, klass)
825+
val ress = eval(cases.map(_.body), thisV, klass)
828826
val errors = ress.flatMap(_.errors)
829827
val resValue = ress.map(_.value).join
830828
if finalizer.isEmpty then
@@ -840,7 +838,7 @@ class Semantic {
840838
Result(Hot, ress.flatMap(_.errors))
841839

842840
case Inlined(call, bindings, expansion) =>
843-
val (ress, env2) = eval(bindings, thisV, klass)
841+
val ress = eval(bindings, thisV, klass)
844842
eval(expansion, thisV, klass) ++ ress.flatMap(_.errors)
845843

846844
case Thicket(List()) =>
@@ -896,10 +894,27 @@ class Semantic {
896894
// It's always safe to approximate them with `Cold`.
897895
Result(Cold, Nil)
898896
else
899-
// resolve this for local variable
900-
val enclosingClass = sym.owner.enclosingClass.asClass
901-
val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
902-
897+
sym.defTree match {
898+
case vdef: ValDef => {
899+
// resolve this for local variable
900+
val enclosingClass = sym.owner.enclosingClass.asClass
901+
val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
902+
thisValue2 match {
903+
case Hot => Result(Hot, Errors.empty)
904+
case Cold => {
905+
val error = AccessCold(sym, source, trace.toVector)
906+
Result(Hot, error :: Nil)
907+
}
908+
case addr: Addr => {
909+
val res = eval(vdef.rhs, addr, klass)
910+
if res.value.promote("Try promote", source).isEmpty then Result(Hot, Errors.empty) else res
911+
}
912+
case _ => ???
913+
}
914+
}
915+
case _ => default()
916+
}
917+
903918
case tmref: TermRef =>
904919
cases(tmref.prefix, thisV, klass, source).select(tmref.symbol, source)
905920

@@ -994,7 +1009,7 @@ class Semantic {
9941009
// parents
9951010
def initParent(parent: Tree, tasks: Tasks)(using Env) = parent match {
9961011
case tree @ Block(stats, NewExpr(tref, New(tpt), ctor, argss)) => // can happen
997-
eval(stats, thisV, klass)._1.foreach { res => errorBuffer ++= res.errors }
1012+
eval(stats, thisV, klass).foreach { res => errorBuffer ++= res.errors }
9981013
val (errors, args) = evalArgs(argss.flatten, thisV, klass)
9991014
errorBuffer ++= errors
10001015
superCall(tref, ctor, args, tree, tasks)

0 commit comments

Comments
 (0)