@@ -12,6 +12,7 @@ import Phases._
1212import Symbols ._
1313import Flags .Module
1414import reporting .{ThrowingReporter , Profile }
15+ import typer .Nullables
1516import collection .mutable
1617import scala .concurrent .{Future , Await , ExecutionContext }
1718import scala .concurrent .duration .Duration
@@ -60,13 +61,15 @@ class Pickler extends Phase {
6061 val unit = ctx.compilationUnit
6162 pickling.println(i " unpickling in run ${ctx.runId}" )
6263
64+ val typeSimplifier = new TypeSimplifyTransformer
65+
6366 for
6467 cls <- dropCompanionModuleClasses(topLevelClasses(unit.tpdTree))
6568 tree <- sliceTopLevel(unit.tpdTree, cls)
6669 do
6770 val pickler = new TastyPickler (cls)
6871 if ctx.settings.YtestPickler .value then
69- beforePickling(cls) = tree.show
72+ beforePickling(cls) = typeSimplifier.transform( tree) .show
7073 picklers(cls) = pickler
7174 val treePkl = new TreePickler (pickler)
7275 treePkl.pickle(tree :: Nil )
@@ -134,8 +137,11 @@ class Pickler extends Phase {
134137 cls -> unpickler
135138 }
136139 pickling.println(" ************* entered toplevel ***********" )
140+
141+ val typeSimplifier = new TypeSimplifyTransformer
142+
137143 for ((cls, unpickler) <- unpicklers) {
138- val unpickled = unpickler.rootTrees
144+ val unpickled = typeSimplifier.transform( unpickler.rootTrees)
139145 testSame(i " $unpickled% \n % " , beforePickling(cls), cls)
140146 }
141147 }
@@ -151,4 +157,21 @@ class Pickler extends Phase {
151157 |
152158 | diff before-pickling.txt after-pickling.txt """ .stripMargin)
153159 end testSame
160+
161+ // Overwrite types of If, Match, and Try nodes with simplified types
162+ // to avoid inconsistencies in unsafe nulls
163+ class TypeSimplifyTransformer extends TreeMapWithPreciseStatContexts :
164+ override def transform (tree : Tree )(using Context ): Tree =
165+ try tree match
166+ case _ : If | _ : Match | _ : Try if Nullables .unsafeNullsEnabled =>
167+ val newTree = super .transform(tree)
168+ newTree.overwriteType(newTree.tpe.simplified)
169+ newTree
170+ case _ =>
171+ super .transform(tree)
172+ catch
173+ case ex : TypeError =>
174+ report.error(ex, tree.srcPos)
175+ tree
176+ end TypeSimplifyTransformer
154177}
0 commit comments