@@ -1255,6 +1255,24 @@ class Typer extends Namer
1255
1255
if (bounds != null ) sym.info = bounds
1256
1256
}
1257
1257
b
1258
+ case t : UnApply if t.symbol.is(Inline ) =>
1259
+ // An inline unapply `P.unapply` in a plattern `P(x1,x2,...)` is transformed into
1260
+ // `{ class $anon { def unapply(x1: T1, x2: T2, ...): R = P.unapply(x1, x2, ...) }; new $anon }.unapply`
1261
+ // and the call `P.unapply(x1, x2, ...)` is inlined.
1262
+ val sym = t.symbol
1263
+ val cls = ctx.newNormalizedClassSymbol(ctx.owner, tpnme.ANON_CLASS , Synthetic | Final , List (defn.ObjectType ), coord = sym.coord)
1264
+ val constr = ctx.newConstructor(cls, Synthetic , Nil , Nil , coord = sym.coord).entered
1265
+ val unappplySym = ctx.newSymbol(cls, sym.name.toTermName, Synthetic | Method , sym.info, coord = sym.coord).entered
1266
+ val unapply = polyDefDef(unappplySym, targs => argss =>
1267
+ Inliner .inlineCall(ref(sym).appliedToTypes(targs).appliedToArgss(argss).withSpan(t.span))
1268
+ )
1269
+ val cdef = ClassDef (cls, DefDef (constr), List (unapply))
1270
+ val newUnapply = Block (cdef :: Nil , New (cls.typeRef, Nil ))
1271
+ val targs = t.fun match
1272
+ case TypeApply (_, targs) => targs
1273
+ case _ => Nil
1274
+ val newFun = newUnapply.select(unappplySym).appliedToTypeTrees(targs).withSpan(t.span)
1275
+ cpy.UnApply (t)(newFun, t.implicits, t.patterns)
1258
1276
case t => t
1259
1277
}
1260
1278
}
0 commit comments