@@ -74,38 +74,38 @@ class ExpandSAMs extends MiniPhase {
7474 val isDefinedAtFn = overrideSym(defn.PartialFunction_isDefinedAt )
7575 val applyOrElseFn = overrideSym(defn.PartialFunction_applyOrElse )
7676
77+ def translateMatch (tree : Match , pfParam : Symbol , cases : List [CaseDef ], defaultValue : Tree ) = {
78+ val selector = tree.selector
79+ val selectorTpe = selector.tpe.widen
80+ val defaultSym = ctx.newSymbol(pfParam.owner, nme.WILDCARD , Synthetic , selectorTpe)
81+ val defaultCase =
82+ CaseDef (
83+ Bind (defaultSym, Underscore (selectorTpe)),
84+ EmptyTree ,
85+ defaultValue)
86+ val unchecked = Annotated (selector, New (ref(defn.UncheckedAnnotType )))
87+ cpy.Match (tree)(unchecked, cases :+ defaultCase)
88+ .subst(param.symbol :: Nil , pfParam :: Nil )
89+ // Needed because a partial function can be written as:
90+ // param => param match { case "foo" if foo(param) => param }
91+ // And we need to update all references to 'param'
92+ }
93+
7794 def isDefinedAtRhs (paramRefss : List [List [Tree ]]) = {
7895 val tru = Literal (Constant (true ))
7996 def translateCase (cdef : CaseDef ) =
8097 cpy.CaseDef (cdef)(body = tru).changeOwner(anonSym, isDefinedAtFn)
8198 val paramRef = paramRefss.head.head
8299 val defaultValue = Literal (Constant (false ))
83- translateMatch(pf, paramRef, pf.cases.map(translateCase), defaultValue)
100+ translateMatch(pf, paramRef.symbol , pf.cases.map(translateCase), defaultValue)
84101 }
85102
86103 def applyOrElseRhs (paramRefss : List [List [Tree ]]) = {
87104 val List (paramRef, defaultRef) = paramRefss.head
88105 def translateCase (cdef : CaseDef ) =
89106 cdef.changeOwner(anonSym, applyOrElseFn)
90107 val defaultValue = defaultRef.select(nme.apply).appliedTo(paramRef)
91- translateMatch(pf, paramRef, pf.cases.map(translateCase), defaultValue)
92- }
93-
94- def translateMatch (tree : Match , selector : Tree , cases : List [CaseDef ], defaultValue : Tree ) = {
95- assert(tree.selector.symbol == param.symbol)
96- val selectorTpe = selector.tpe.widen
97- val defaultSym = ctx.newSymbol(selector.symbol.owner, nme.WILDCARD , Synthetic , selectorTpe)
98- val defaultCase =
99- CaseDef (
100- Bind (defaultSym, Underscore (selectorTpe)),
101- EmptyTree ,
102- defaultValue)
103- val unchecked = Annotated (selector, New (ref(defn.UncheckedAnnotType )))
104- cpy.Match (tree)(unchecked, cases :+ defaultCase)
105- .subst(param.symbol :: Nil , selector.symbol :: Nil )
106- // Needed because a partial function can be written as:
107- // param => param match { case "foo" if foo(param) => param }
108- // And we need to update all references to 'param'
108+ translateMatch(pf, paramRef.symbol, pf.cases.map(translateCase), defaultValue)
109109 }
110110
111111 val isDefinedAtDef = transformFollowingDeep(DefDef (isDefinedAtFn, isDefinedAtRhs(_)))
0 commit comments