@@ -32,7 +32,6 @@ import org.scalajs.ir.{Position, Version}
32
32
/** Desugars a linking unit. */
33
33
final class Desugarer (config : CommonPhaseConfig , checkIRFor : Option [CheckingPhase ]) {
34
34
import Desugarer ._
35
- import Transients ._
36
35
37
36
private val desugarTransformer = new DesugarTransformer (config.coreSpec)
38
37
@@ -62,16 +61,19 @@ final class Desugarer(config: CommonPhaseConfig, checkIRFor: Option[CheckingPhas
62
61
import linkedClass ._
63
62
64
63
val newMethods = methods.mapConserve { method =>
65
- desugarTransformer.transformMethodDef(method)
64
+ if (! desugaringInfo.methods(method.flags.namespace.ordinal).contains(method.methodName))
65
+ method
66
+ else
67
+ desugarTransformer.transformMethodDef(method)
66
68
}
67
69
68
- val newJSConstructorDef = jsConstructorDef.mapConserve { jsCtor =>
69
- desugarTransformer.transformJSConstructorDef(jsCtor)
70
- }
70
+ val newJSConstructorDef =
71
+ if ( ! desugaringInfo.exportedMembers) jsConstructorDef
72
+ else jsConstructorDef.map(desugarTransformer.transformJSConstructorDef(_))
71
73
72
- val newExportedMembers = exportedMembers.mapConserve { jsMethodProp =>
73
- desugarTransformer.transformJSMethodPropDef(jsMethodProp)
74
- }
74
+ val newExportedMembers =
75
+ if ( ! desugaringInfo.exportedMembers) exportedMembers
76
+ else exportedMembers.map(desugarTransformer.transformJSMethodPropDef(_))
75
77
76
78
if ((newMethods eq methods) && (newJSConstructorDef eq jsConstructorDef) &&
77
79
(newExportedMembers eq exportedMembers)) {
@@ -102,50 +104,31 @@ final class Desugarer(config: CommonPhaseConfig, checkIRFor: Option[CheckingPhas
102
104
staticDependencies,
103
105
externalDependencies,
104
106
dynamicDependencies,
107
+ LinkedClass .DesugaringInfo .Empty ,
105
108
version
106
109
)
107
110
}
108
111
}
109
112
110
113
private def desugarTopLevelExport (tle : LinkedTopLevelExport ): LinkedTopLevelExport = {
111
114
import tle ._
112
- val newTree = desugarTransformer.transformTopLevelExportDef(tree)
113
- if (newTree eq tree)
115
+ if (! tle.needsDesugaring) {
114
116
tle
115
- else
116
- new LinkedTopLevelExport (owningClass, newTree, staticDependencies, externalDependencies)
117
+ } else {
118
+ val newTree = desugarTransformer.transformTopLevelExportDef(tree)
119
+ new LinkedTopLevelExport (owningClass, newTree, staticDependencies,
120
+ externalDependencies, needsDesugaring = false )
121
+ }
117
122
}
118
123
}
119
124
120
125
private [linker] object Desugarer {
121
126
122
- object Transients {
123
- final case class Desugar (body : Tree ) extends Transient .Value {
124
- val tpe = body.tpe
125
-
126
- def traverse (traverser : Traverser ): Unit =
127
- traverser.traverse(body)
128
-
129
- def transform (transformer : Transformer )(implicit pos : Position ): Tree =
130
- Transient (Desugar (transformer.transform(body)))
131
-
132
- def printIR (out : IRTreePrinter ): Unit = {
133
- out.print(" desugar " )
134
- out.print(body)
135
- }
136
- }
137
- }
138
-
139
- import Transients ._
140
-
141
127
private final class DesugarTransformer (coreSpec : CoreSpec )
142
128
extends ClassTransformer {
143
129
144
130
override def transform (tree : Tree ): Tree = {
145
131
tree match {
146
- case Transient (Desugar (body)) =>
147
- transform(body)
148
-
149
132
case prop : LinkTimeProperty =>
150
133
coreSpec.linkTimeProperties.transformLinkTimeProperty(prop)
151
134
@@ -160,84 +143,35 @@ private[linker] object Desugarer {
160
143
*/
161
144
162
145
override def transformMethodDef (methodDef : MethodDef ): MethodDef = {
163
- methodDef.body match {
164
- case Some (Transient (Desugar (_))) =>
165
- val newMethodDef = super .transformMethodDef(methodDef)
166
- newMethodDef.copy()(newMethodDef.optimizerHints, methodDef.version)(newMethodDef.pos)
167
- case _ =>
168
- methodDef
169
- }
146
+ val newMethodDef = super .transformMethodDef(methodDef)
147
+ newMethodDef.copy()(newMethodDef.optimizerHints, methodDef.version)(newMethodDef.pos)
170
148
}
171
149
172
150
override def transformJSConstructorDef (jsConstructor : JSConstructorDef ): JSConstructorDef = {
173
- /* We cheat here. A JSConstructorBody has a mandatory super call,
174
- * statically separated from the other statements. Therefore we cannot
175
- * wrap the entire body with a `Desugar` node. Instead, we put a
176
- * `Desugar` node at the beginning of the body, but it still signals that
177
- * we should transform the whole body.
178
- */
179
- jsConstructor.body.beforeSuper match {
180
- case Transient (Desugar (_)) :: _ =>
181
- val newJSConstructor = super .transformJSConstructorDef(jsConstructor)
182
- newJSConstructor.copy()(newJSConstructor.optimizerHints, jsConstructor.version)(
183
- newJSConstructor.pos)
184
- case _ =>
185
- jsConstructor
186
- }
151
+ val newJSConstructor = super .transformJSConstructorDef(jsConstructor)
152
+ newJSConstructor.copy()(newJSConstructor.optimizerHints, jsConstructor.version)(
153
+ newJSConstructor.pos)
187
154
}
188
155
189
156
override def transformJSMethodDef (jsMethodDef : JSMethodDef ): JSMethodDef = {
190
- jsMethodDef.body match {
191
- case Transient (Desugar (_)) =>
192
- val newJSMethodDef = super .transformJSMethodDef(jsMethodDef)
193
- newJSMethodDef.copy()(newJSMethodDef.optimizerHints, jsMethodDef.version)(
194
- newJSMethodDef.pos)
195
- case _ =>
196
- jsMethodDef
197
- }
157
+ val newJSMethodDef = super .transformJSMethodDef(jsMethodDef)
158
+ newJSMethodDef.copy()(newJSMethodDef.optimizerHints, jsMethodDef.version)(
159
+ newJSMethodDef.pos)
198
160
}
199
161
200
162
override def transformJSPropertyDef (jsPropertyDef : JSPropertyDef ): JSPropertyDef = {
201
- val needsDesugaring = jsPropertyDef match {
202
- case JSPropertyDef (_, _, Some (Transient (Desugar (_))), _) => true
203
- case JSPropertyDef (_, _, _, Some ((_, Transient (Desugar (_))))) => true
204
- case _ => false
205
- }
206
- if (needsDesugaring) {
207
- val newJSPropertyDef = super .transformJSPropertyDef(jsPropertyDef)
208
- newJSPropertyDef.copy()(jsPropertyDef.version)(newJSPropertyDef.pos)
209
- } else {
210
- jsPropertyDef
211
- }
163
+ val newJSPropertyDef = super .transformJSPropertyDef(jsPropertyDef)
164
+ newJSPropertyDef.copy()(jsPropertyDef.version)(newJSPropertyDef.pos)
212
165
}
213
166
214
167
override def transformTopLevelExportDef (exportDef : TopLevelExportDef ): TopLevelExportDef = {
215
168
exportDef match {
216
169
case TopLevelMethodExportDef (exportName, jsMethodDef) =>
217
170
val newJSMethodDef = transformJSMethodDef(jsMethodDef)
218
- if (newJSMethodDef eq jsMethodDef)
219
- exportDef
220
- else
221
- TopLevelMethodExportDef (exportName, newJSMethodDef)(exportDef.pos)
222
-
171
+ TopLevelMethodExportDef (exportName, newJSMethodDef)(exportDef.pos)
223
172
case _ =>
224
173
exportDef
225
174
}
226
175
}
227
176
}
228
-
229
- private implicit class OptionMapConserve [+ A <: AnyRef ](private val self : Option [A ])
230
- extends AnyVal {
231
-
232
- def mapConserve [B >: A <: AnyRef ](f : A => B ): Option [B ] = self match {
233
- case None =>
234
- None
235
- case Some (value) =>
236
- val newValue = f(value)
237
- if (newValue eq value)
238
- self
239
- else
240
- Some (newValue)
241
- }
242
- }
243
177
}
0 commit comments