@@ -124,55 +124,54 @@ class ExpandSAMs extends MiniPhase:
124124 val parents = List (
125125 defn.AbstractPartialFunctionClass .typeRef.appliedTo(anonTpe.firstParamTypes.head, anonTpe.resultType),
126126 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- }
153127
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+ }
162153
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+ }
170162
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+ }
176175 }
177176
178177 private def checkRefinements (tpe : Type , tree : Tree )(using Context ): Type = tpe.dealias match {
@@ -184,4 +183,3 @@ class ExpandSAMs extends MiniPhase:
184183 tpe
185184 }
186185end ExpandSAMs
187-
0 commit comments