@@ -74,38 +74,38 @@ class ExpandSAMs extends MiniPhase {
74
74
val isDefinedAtFn = overrideSym(defn.PartialFunction_isDefinedAt )
75
75
val applyOrElseFn = overrideSym(defn.PartialFunction_applyOrElse )
76
76
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
+
77
94
def isDefinedAtRhs (paramRefss : List [List [Tree ]]) = {
78
95
val tru = Literal (Constant (true ))
79
96
def translateCase (cdef : CaseDef ) =
80
97
cpy.CaseDef (cdef)(body = tru).changeOwner(anonSym, isDefinedAtFn)
81
98
val paramRef = paramRefss.head.head
82
99
val defaultValue = Literal (Constant (false ))
83
- translateMatch(pf, paramRef, pf.cases.map(translateCase), defaultValue)
100
+ translateMatch(pf, paramRef.symbol , pf.cases.map(translateCase), defaultValue)
84
101
}
85
102
86
103
def applyOrElseRhs (paramRefss : List [List [Tree ]]) = {
87
104
val List (paramRef, defaultRef) = paramRefss.head
88
105
def translateCase (cdef : CaseDef ) =
89
106
cdef.changeOwner(anonSym, applyOrElseFn)
90
107
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)
109
109
}
110
110
111
111
val isDefinedAtDef = transformFollowingDeep(DefDef (isDefinedAtFn, isDefinedAtRhs(_)))
0 commit comments