@@ -124,55 +124,54 @@ class ExpandSAMs extends MiniPhase:
124
124
val parents = List (
125
125
defn.AbstractPartialFunctionClass .typeRef.appliedTo(anonTpe.firstParamTypes.head, anonTpe.resultType),
126
126
defn.SerializableType )
127
- val pfSym = newNormalizedClassSymbol(anonSym.owner, tpnme.ANON_CLASS , Synthetic | Final , parents, coord = tree.span)
128
-
129
- def overrideSym (sym : Symbol ) = sym.copy(
130
- owner = pfSym,
131
- flags = Synthetic | Method | Final | Override ,
132
- info = tpe.memberInfo(sym),
133
- coord = tree.span).asTerm.entered
134
- val isDefinedAtFn = overrideSym(defn.PartialFunction_isDefinedAt )
135
- val applyOrElseFn = overrideSym(defn.PartialFunction_applyOrElse )
136
-
137
- def translateMatch (tree : Match , pfParam : Symbol , cases : List [CaseDef ], defaultValue : Tree )(using Context ) = {
138
- val selector = tree.selector
139
- val selectorTpe = selector.tpe.widen
140
- val defaultSym = newSymbol(pfParam.owner, nme.WILDCARD , SyntheticCase , selectorTpe)
141
- val defaultCase =
142
- CaseDef (
143
- Bind (defaultSym, Underscore (selectorTpe)),
144
- EmptyTree ,
145
- defaultValue)
146
- val unchecked = selector.annotated(New (ref(defn.UncheckedAnnot .typeRef)))
147
- cpy.Match (tree)(unchecked, cases :+ defaultCase)
148
- .subst(param.symbol :: Nil , pfParam :: Nil )
149
- // Needed because a partial function can be written as:
150
- // param => param match { case "foo" if foo(param) => param }
151
- // And we need to update all references to 'param'
152
- }
153
127
154
- def isDefinedAtRhs (paramRefss : List [List [Tree ]])(using Context ) = {
155
- val tru = Literal (Constant (true ))
156
- def translateCase (cdef : CaseDef ) =
157
- cpy.CaseDef (cdef)(body = tru).changeOwner(anonSym, isDefinedAtFn)
158
- val paramRef = paramRefss.head.head
159
- val defaultValue = Literal (Constant (false ))
160
- translateMatch(pfRHS, paramRef.symbol, pfRHS.cases.map(translateCase), defaultValue)
161
- }
128
+ AnonClass (anonSym.owner, parents, tree.span) { pfSym =>
129
+ def overrideSym (sym : Symbol ) = sym.copy(
130
+ owner = pfSym,
131
+ flags = Synthetic | Method | Final | Override ,
132
+ info = tpe.memberInfo(sym),
133
+ coord = tree.span).asTerm.entered
134
+ val isDefinedAtFn = overrideSym(defn.PartialFunction_isDefinedAt )
135
+ val applyOrElseFn = overrideSym(defn.PartialFunction_applyOrElse )
136
+
137
+ def translateMatch (tree : Match , pfParam : Symbol , cases : List [CaseDef ], defaultValue : Tree )(using Context ) = {
138
+ val selector = tree.selector
139
+ val selectorTpe = selector.tpe.widen
140
+ val defaultSym = newSymbol(pfParam.owner, nme.WILDCARD , SyntheticCase , selectorTpe)
141
+ val defaultCase =
142
+ CaseDef (
143
+ Bind (defaultSym, Underscore (selectorTpe)),
144
+ EmptyTree ,
145
+ defaultValue)
146
+ val unchecked = selector.annotated(New (ref(defn.UncheckedAnnot .typeRef)))
147
+ cpy.Match (tree)(unchecked, cases :+ defaultCase)
148
+ .subst(param.symbol :: Nil , pfParam :: Nil )
149
+ // Needed because a partial function can be written as:
150
+ // param => param match { case "foo" if foo(param) => param }
151
+ // And we need to update all references to 'param'
152
+ }
162
153
163
- def applyOrElseRhs (paramRefss : List [List [Tree ]])(using Context ) = {
164
- val List (paramRef, defaultRef) = paramRefss(1 )
165
- def translateCase (cdef : CaseDef ) =
166
- cdef.changeOwner(anonSym, applyOrElseFn)
167
- val defaultValue = defaultRef.select(nme.apply).appliedTo(paramRef)
168
- translateMatch(pfRHS, paramRef.symbol, pfRHS.cases.map(translateCase), defaultValue)
169
- }
154
+ def isDefinedAtRhs (paramRefss : List [List [Tree ]])(using Context ) = {
155
+ val tru = Literal (Constant (true ))
156
+ def translateCase (cdef : CaseDef ) =
157
+ cpy.CaseDef (cdef)(body = tru).changeOwner(anonSym, isDefinedAtFn)
158
+ val paramRef = paramRefss.head.head
159
+ val defaultValue = Literal (Constant (false ))
160
+ translateMatch(pfRHS, paramRef.symbol, pfRHS.cases.map(translateCase), defaultValue)
161
+ }
170
162
171
- val constr = newConstructor(pfSym, Synthetic , Nil , Nil ).entered
172
- val isDefinedAtDef = transformFollowingDeep(DefDef (isDefinedAtFn, isDefinedAtRhs(_)(using ctx.withOwner(isDefinedAtFn))))
173
- val applyOrElseDef = transformFollowingDeep(DefDef (applyOrElseFn, applyOrElseRhs(_)(using ctx.withOwner(applyOrElseFn))))
174
- val pfDef = ClassDef (pfSym, DefDef (constr), List (isDefinedAtDef, applyOrElseDef))
175
- cpy.Block (tree)(pfDef :: Nil , New (pfSym.typeRef, Nil ))
163
+ def applyOrElseRhs (paramRefss : List [List [Tree ]])(using Context ) = {
164
+ val List (paramRef, defaultRef) = paramRefss(1 )
165
+ def translateCase (cdef : CaseDef ) =
166
+ cdef.changeOwner(anonSym, applyOrElseFn)
167
+ val defaultValue = defaultRef.select(nme.apply).appliedTo(paramRef)
168
+ translateMatch(pfRHS, paramRef.symbol, pfRHS.cases.map(translateCase), defaultValue)
169
+ }
170
+
171
+ val isDefinedAtDef = transformFollowingDeep(DefDef (isDefinedAtFn, isDefinedAtRhs(_)(using ctx.withOwner(isDefinedAtFn))))
172
+ val applyOrElseDef = transformFollowingDeep(DefDef (applyOrElseFn, applyOrElseRhs(_)(using ctx.withOwner(applyOrElseFn))))
173
+ List (isDefinedAtDef, applyOrElseDef)
174
+ }
176
175
}
177
176
178
177
private def checkRefinements (tpe : Type , tree : Tree )(using Context ): Type = tpe.dealias match {
@@ -184,4 +183,3 @@ class ExpandSAMs extends MiniPhase:
184
183
tpe
185
184
}
186
185
end ExpandSAMs
187
-
0 commit comments