@@ -12,6 +12,7 @@ import Phases._
12
12
import Symbols ._
13
13
import Flags .Module
14
14
import reporting .{ThrowingReporter , Profile }
15
+ import typer .Nullables
15
16
import collection .mutable
16
17
import scala .concurrent .{Future , Await , ExecutionContext }
17
18
import scala .concurrent .duration .Duration
@@ -60,13 +61,15 @@ class Pickler extends Phase {
60
61
val unit = ctx.compilationUnit
61
62
pickling.println(i " unpickling in run ${ctx.runId}" )
62
63
64
+ val typeSimplifier = new TypeSimplifyTransformer
65
+
63
66
for
64
67
cls <- dropCompanionModuleClasses(topLevelClasses(unit.tpdTree))
65
68
tree <- sliceTopLevel(unit.tpdTree, cls)
66
69
do
67
70
val pickler = new TastyPickler (cls)
68
71
if ctx.settings.YtestPickler .value then
69
- beforePickling(cls) = tree.show
72
+ beforePickling(cls) = typeSimplifier.transform( tree) .show
70
73
picklers(cls) = pickler
71
74
val treePkl = new TreePickler (pickler)
72
75
treePkl.pickle(tree :: Nil )
@@ -134,8 +137,11 @@ class Pickler extends Phase {
134
137
cls -> unpickler
135
138
}
136
139
pickling.println(" ************* entered toplevel ***********" )
140
+
141
+ val typeSimplifier = new TypeSimplifyTransformer
142
+
137
143
for ((cls, unpickler) <- unpicklers) {
138
- val unpickled = unpickler.rootTrees
144
+ val unpickled = typeSimplifier.transform( unpickler.rootTrees)
139
145
testSame(i " $unpickled% \n % " , beforePickling(cls), cls)
140
146
}
141
147
}
@@ -151,4 +157,21 @@ class Pickler extends Phase {
151
157
|
152
158
| diff before-pickling.txt after-pickling.txt """ .stripMargin)
153
159
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
154
177
}
0 commit comments