Skip to content

Commit 48562d1

Browse files
committed
Try to not add a transformer
1 parent 1890bc6 commit 48562d1

File tree

3 files changed

+29
-38
lines changed

3 files changed

+29
-38
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,10 @@ class TreeUnpickler(reader: TastyReader,
11941194
res.withAttachment(SuppressedApplyToNone, ())
11951195
else res
11961196

1197+
def simplifyLub(tree: Tree): Tree =
1198+
tree.overwriteType(tree.tpe.simplified)
1199+
tree
1200+
11971201
def readLengthTerm(): Tree = {
11981202
val end = readEnd()
11991203
val result =
@@ -1232,34 +1236,37 @@ class TreeUnpickler(reader: TastyReader,
12321236
val expansion = exprReader.readTerm() // need bindings in scope, so needs to be read before
12331237
Inlined(call, bindings, expansion)
12341238
case IF =>
1235-
if (nextByte == INLINE) {
1236-
readByte()
1237-
InlineIf(readTerm(), readTerm(), readTerm())
1238-
}
1239-
else
1240-
If(readTerm(), readTerm(), readTerm())
1239+
simplifyLub(
1240+
if (nextByte == INLINE) {
1241+
readByte()
1242+
InlineIf(readTerm(), readTerm(), readTerm())
1243+
}
1244+
else
1245+
If(readTerm(), readTerm(), readTerm()))
12411246
case LAMBDA =>
12421247
val meth = readTerm()
12431248
val tpt = ifBefore(end)(readTpt(), EmptyTree)
12441249
Closure(Nil, meth, tpt)
12451250
case MATCH =>
1246-
if (nextByte == IMPLICIT) {
1247-
readByte()
1248-
InlineMatch(EmptyTree, readCases(end))
1249-
}
1250-
else if (nextByte == INLINE) {
1251-
readByte()
1252-
InlineMatch(readTerm(), readCases(end))
1253-
}
1254-
else Match(readTerm(), readCases(end))
1251+
simplifyLub(
1252+
if (nextByte == IMPLICIT) {
1253+
readByte()
1254+
InlineMatch(EmptyTree, readCases(end))
1255+
}
1256+
else if (nextByte == INLINE) {
1257+
readByte()
1258+
InlineMatch(readTerm(), readCases(end))
1259+
}
1260+
else Match(readTerm(), readCases(end)))
12551261
case RETURN =>
12561262
val from = readSymRef()
12571263
val expr = ifBefore(end)(readTerm(), EmptyTree)
12581264
Return(expr, Ident(from.termRef))
12591265
case WHILE =>
12601266
WhileDo(readTerm(), readTerm())
12611267
case TRY =>
1262-
Try(readTerm(), readCases(end), ifBefore(end)(readTerm(), EmptyTree))
1268+
simplifyLub(
1269+
Try(readTerm(), readCases(end), ifBefore(end)(readTerm(), EmptyTree)))
12631270
case SELECTouter =>
12641271
val levels = readNat()
12651272
readTerm().outerSelect(levels, SkolemType(readType()))

compiler/src/dotty/tools/dotc/transform/Pickler.scala

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import Phases._
1212
import Symbols._
1313
import Flags.Module
1414
import reporting.{ThrowingReporter, Profile}
15-
import typer.Nullables
1615
import collection.mutable
1716
import scala.concurrent.{Future, Await, ExecutionContext}
1817
import scala.concurrent.duration.Duration
@@ -50,8 +49,6 @@ class Pickler extends Phase {
5049
private val beforePickling = new mutable.HashMap[ClassSymbol, String]
5150
private val picklers = new mutable.HashMap[ClassSymbol, TastyPickler]
5251

53-
private val typeSimplifier = new TypeSimplifyTransformer
54-
5552
/** Drop any elements of this list that are linked module classes of other elements in the list */
5653
private def dropCompanionModuleClasses(clss: List[ClassSymbol])(using Context): List[ClassSymbol] = {
5754
val companionModuleClasses =
@@ -69,7 +66,7 @@ class Pickler extends Phase {
6966
do
7067
val pickler = new TastyPickler(cls)
7168
if ctx.settings.YtestPickler.value then
72-
beforePickling(cls) = typeSimplifier.transform(tree).show
69+
beforePickling(cls) = tree.show
7370
picklers(cls) = pickler
7471
val treePkl = new TreePickler(pickler)
7572
treePkl.pickle(tree :: Nil)
@@ -138,7 +135,7 @@ class Pickler extends Phase {
138135
}
139136
pickling.println("************* entered toplevel ***********")
140137
for ((cls, unpickler) <- unpicklers) {
141-
val unpickled = typeSimplifier.transform(unpickler.rootTrees)
138+
val unpickled = unpickler.rootTrees
142139
testSame(i"$unpickled%\n%", beforePickling(cls), cls)
143140
}
144141
}
@@ -154,21 +151,4 @@ class Pickler extends Phase {
154151
|
155152
| diff before-pickling.txt after-pickling.txt""".stripMargin)
156153
end testSame
157-
158-
// Overwrite types of If, Match, and Try nodes with simplified types
159-
// to avoid inconsistencies in unsafe nulls
160-
class TypeSimplifyTransformer extends TreeMapWithPreciseStatContexts:
161-
override def transform(tree: Tree)(using Context): Tree =
162-
try tree match
163-
case _: If | _: Match | _: Try if Nullables.unsafeNullsEnabled =>
164-
val newTree = super.transform(tree)
165-
newTree.overwriteType(newTree.tpe.simplified)
166-
newTree
167-
case _ =>
168-
super.transform(tree)
169-
catch
170-
case ex: TypeError =>
171-
report.error(ex, tree.srcPos)
172-
tree
173-
end TypeSimplifyTransformer
174154
}

compiler/src/dotty/tools/dotc/transform/PostTyper.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,10 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
458458
)
459459
case Block(_, Closure(_, _, tpt)) if ExpandSAMs.needsWrapperClass(tpt.tpe) =>
460460
superAcc.withInvalidCurrentClass(super.transform(tree))
461+
case _: If | _: Match | _: Try =>
462+
val newTree = super.transform(tree)
463+
newTree.overwriteType(newTree.tpe.simplified)
464+
newTree
461465
case tree =>
462466
super.transform(tree)
463467
}

0 commit comments

Comments
 (0)