Skip to content

Commit a5bf1e2

Browse files
committed
Resolving cases for def-tree
1 parent 45ed193 commit a5bf1e2

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
@@ -799,13 +799,11 @@ class Semantic {
799799
Result(value, Nil)
800800

801801
case Block(stats, expr) =>
802-
val (ress, env2) = eval(stats, thisV, klass)
803-
withEnv(env2) {
804-
eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
805-
}
802+
val ress = eval(stats, thisV, klass)
803+
eval(expr, thisV, klass) ++ ress.flatMap(_.errors)
806804

807805
case If(cond, thenp, elsep) =>
808-
val (ress, env2) = eval(cond :: thenp :: elsep :: Nil, thisV, klass)
806+
val ress = eval(cond :: thenp :: elsep :: Nil, thisV, klass)
809807
val value = ress.map(_.value).join
810808
val errors = ress.flatMap(_.errors)
811809
Result(value, errors)
@@ -816,7 +814,7 @@ class Semantic {
816814

817815
case Match(selector, cases) =>
818816
val res1 = eval(selector, thisV, klass).ensureHot("The value to be matched needs to be fully initialized", selector)
819-
val (ress, env) = eval(cases.map(_.body), thisV, klass)
817+
val ress = eval(cases.map(_.body), thisV, klass)
820818
val value = ress.map(_.value).join
821819
val errors = res1.errors ++ ress.flatMap(_.errors)
822820
Result(value, errors)
@@ -825,15 +823,15 @@ class Semantic {
825823
eval(expr, thisV, klass).ensureHot("return expression may only be initialized value", expr)
826824

827825
case WhileDo(cond, body) =>
828-
val (ress, env2) = eval(cond :: body :: Nil, thisV, klass)
826+
val ress = eval(cond :: body :: Nil, thisV, klass)
829827
Result(Hot, ress.flatMap(_.errors))
830828

831829
case Labeled(_, expr) =>
832830
eval(expr, thisV, klass)
833831

834832
case Try(block, cases, finalizer) =>
835833
val res1 = eval(block, thisV, klass)
836-
val (ress, env2) = eval(cases.map(_.body), thisV, klass)
834+
val ress = eval(cases.map(_.body), thisV, klass)
837835
val errors = ress.flatMap(_.errors)
838836
val resValue = ress.map(_.value).join
839837
if finalizer.isEmpty then
@@ -849,7 +847,7 @@ class Semantic {
849847
Result(Hot, ress.flatMap(_.errors))
850848

851849
case Inlined(call, bindings, expansion) =>
852-
val (ress, env2) = eval(bindings, thisV, klass)
850+
val ress = eval(bindings, thisV, klass)
853851
eval(expansion, thisV, klass) ++ ress.flatMap(_.errors)
854852

855853
case Thicket(List()) =>
@@ -905,10 +903,27 @@ class Semantic {
905903
// It's always safe to approximate them with `Cold`.
906904
Result(Cold, Nil)
907905
else
908-
// resolve this for local variable
909-
val enclosingClass = sym.owner.enclosingClass.asClass
910-
val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
911-
906+
sym.defTree match {
907+
case vdef: ValDef => {
908+
// resolve this for local variable
909+
val enclosingClass = sym.owner.enclosingClass.asClass
910+
val thisValue2 = resolveThis(enclosingClass, thisV, klass, source)
911+
thisValue2 match {
912+
case Hot => Result(Hot, Errors.empty)
913+
case Cold => {
914+
val error = AccessCold(sym, source, trace.toVector)
915+
Result(Hot, error :: Nil)
916+
}
917+
case addr: Addr => {
918+
val res = eval(vdef.rhs, addr, klass)
919+
if res.value.promote("Try promote", source).isEmpty then Result(Hot, Errors.empty) else res
920+
}
921+
case _ => ???
922+
}
923+
}
924+
case _ => default()
925+
}
926+
912927
case tmref: TermRef =>
913928
cases(tmref.prefix, thisV, klass, source).select(tmref.symbol, source)
914929

@@ -1003,7 +1018,7 @@ class Semantic {
10031018
// parents
10041019
def initParent(parent: Tree, tasks: Tasks)(using Env) = parent match {
10051020
case tree @ Block(stats, NewExpr(tref, New(tpt), ctor, argss)) => // can happen
1006-
eval(stats, thisV, klass)._1.foreach { res => errorBuffer ++= res.errors }
1021+
eval(stats, thisV, klass).foreach { res => errorBuffer ++= res.errors }
10071022
val (errors, args) = evalArgs(argss.flatten, thisV, klass)
10081023
errorBuffer ++= errors
10091024
superCall(tref, ctor, args, tree, tasks)

0 commit comments

Comments
 (0)