@@ -1645,15 +1645,15 @@ object Serializers {
1645
1645
* We must replace those occurrences with a `Class_name` as well.
1646
1646
*/
1647
1647
val transformer = new Transformers .Transformer {
1648
- override def transform (tree : Tree , isStat : Boolean ): Tree = tree match {
1648
+ override def transform (tree : Tree ): Tree = tree match {
1649
1649
case JSSelect (_, StringLiteral (" name" )) =>
1650
1650
implicit val pos = tree.pos
1651
1651
UnaryOp (UnaryOp .Class_name , thisJLClass)
1652
1652
case _ =>
1653
- super .transform(tree, isStat )
1653
+ super .transform(tree)
1654
1654
}
1655
1655
}
1656
- transformer.transform(method.body.get, isStat = method.resultType == VoidType )
1656
+ transformer.transform(method.body.get)
1657
1657
}
1658
1658
1659
1659
val newOptimizerHints =
@@ -2065,40 +2065,69 @@ object Serializers {
2065
2065
JSNativeMemberDef (flags, name, jsNativeLoadSpec)
2066
2066
}
2067
2067
2068
- private def bodyHack5 (body : Tree , isStat : Boolean ): Tree = {
2069
- if (! hacks.use5) {
2070
- body
2071
- } else {
2072
- /* #4442 and #4601: Patch Labeled, If, Match and TryCatch nodes in
2073
- * statement position to have type VoidType. These 4 nodes are the
2074
- * control structures whose result type is explicitly specified (and
2075
- * not derived from their children like Block or TryFinally, or
2076
- * constant like While).
2077
- */
2078
- new Transformers .Transformer {
2079
- override def transform (tree : Tree , isStat : Boolean ): Tree = {
2080
- val newTree = super .transform(tree, isStat)
2081
- if (isStat && newTree.tpe != VoidType ) {
2082
- newTree match {
2083
- case Labeled (label, _, body) =>
2084
- Labeled (label, VoidType , body)(newTree.pos)
2085
- case If (cond, thenp, elsep) =>
2086
- If (cond, thenp, elsep)(VoidType )(newTree.pos)
2087
- case Match (selector, cases, default) =>
2088
- Match (selector, cases, default)(VoidType )(newTree.pos)
2089
- case TryCatch (block, errVar, errVarOriginalName, handler) =>
2090
- TryCatch (block, errVar, errVarOriginalName, handler)(VoidType )(newTree.pos)
2091
- case _ =>
2092
- newTree
2093
- }
2094
- } else {
2095
- newTree
2096
- }
2097
- }
2098
- }.transform(body, isStat)
2068
+ /* #4442 and #4601: Patch Labeled, If, Match and TryCatch nodes in
2069
+ * statement position to have type VoidType. These 4 nodes are the
2070
+ * control structures whose result type is explicitly specified (and
2071
+ * not derived from their children like Block or TryFinally, or
2072
+ * constant like While).
2073
+ */
2074
+ private object BodyHack5Transformer extends Transformers .Transformer {
2075
+ def transformStat (tree : Tree ): Tree = {
2076
+ implicit val pos = tree.pos
2077
+
2078
+ tree match {
2079
+ // Nodes that we actually need to alter
2080
+ case Labeled (label, _, body) =>
2081
+ Labeled (label, VoidType , transformStat(body))
2082
+ case If (cond, thenp, elsep) =>
2083
+ If (transform(cond), transformStat(thenp), transformStat(elsep))(VoidType )
2084
+ case Match (selector, cases, default) =>
2085
+ Match (transform(selector), cases.map(c => (c._1, transformStat(c._2))),
2086
+ transformStat(default))(VoidType )
2087
+ case TryCatch (block, errVar, errVarOriginalName, handler) =>
2088
+ TryCatch (transformStat(block), errVar, errVarOriginalName,
2089
+ transformStat(handler))(VoidType )
2090
+
2091
+ // Nodes for which we need to forward the statement position
2092
+ case Block (stats) =>
2093
+ Block (stats.map(transformStat(_)))
2094
+ case TryFinally (block, finalizer) =>
2095
+ Block (transformStat(block), transformStat(finalizer))
2096
+
2097
+ // For everything else, delegate to transform
2098
+ case _ =>
2099
+ transform(tree)
2100
+ }
2099
2101
}
2102
+
2103
+ override def transform (tree : Tree ): Tree = {
2104
+ implicit val pos = tree.pos
2105
+
2106
+ tree match {
2107
+ // Nodes that force a statement position for some of their parts
2108
+ case Block (stats) =>
2109
+ Block (stats.init.map(transformStat(_)), transform(stats.last))
2110
+ case While (cond, body) =>
2111
+ While (transform(cond), transformStat(body))
2112
+ case ForIn (obj, keyVar, keyVarOriginalName, body) =>
2113
+ ForIn (transform(obj), keyVar, keyVarOriginalName, transformStat(body))
2114
+ case TryFinally (block, finalizer) =>
2115
+ TryFinally (transform(block), transformStat(finalizer))
2116
+
2117
+ case _ =>
2118
+ super .transform(tree)
2119
+ }
2120
+ }
2121
+
2122
+ def transform (tree : Tree , isStat : Boolean ): Tree =
2123
+ if (isStat) transformStat(tree)
2124
+ else transform(tree)
2100
2125
}
2101
2126
2127
+ private def bodyHack5 (body : Tree , isStat : Boolean ): Tree =
2128
+ if (! hacks.use5) body
2129
+ else BodyHack5Transformer .transform(body, isStat)
2130
+
2102
2131
private def bodyHack5Expr (body : Tree ): Tree = bodyHack5(body, isStat = false )
2103
2132
2104
2133
def readTopLevelExportDef (): TopLevelExportDef = {
0 commit comments