@@ -20,8 +20,98 @@ object Expr {
2020  def  apply [T ](x : T ):  Expr [T ] = 
2121    throw  new  Error (" Internal error: this method call should have been replaced by the compiler" 
2222
23-   implicit  class  AsFunction [T , U ](private  val  f :  Expr [T  =>  U ]) extends  AnyVal  {
24-     def  apply (x : Expr [T ]):  Expr [U ] =  new  Exprs .FunctionAppliedTo [T , U ](f, x)
23+   //  TODO simplify using new extension methods
24+ 
25+   implicit  class  AsFunction0 [R ](private  val  f :  Expr [() =>  R ]) extends  AnyVal  {
26+     def  apply ():  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array .empty)
27+   }
28+ 
29+   implicit  class  AsFunction1 [T1 , R ](private  val  f :  Expr [(T1 ) =>  R ]) extends  AnyVal  {
30+     def  apply (x1 : Expr [T1 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1))
31+   }
32+ 
33+   implicit  class  AsFunction2 [T1 , T2 , R ](private  val  f :  Expr [(T1 , T2 ) =>  R ]) extends  AnyVal  {
34+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2))
35+   }
36+ 
37+   implicit  class  AsFunction3 [T1 , T2 , T3 , R ](private  val  f :  Expr [(T1 , T2 , T3 ) =>  R ]) extends  AnyVal  {
38+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3))
39+   }
40+ 
41+   implicit  class  AsFunction4 [T1 , T2 , T3 , T4 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 ) =>  R ]) extends  AnyVal  {
42+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4))
43+   }
44+ 
45+   implicit  class  AsFunction5 [T1 , T2 , T3 , T4 , T5 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 ) =>  R ]) extends  AnyVal  {
46+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5))
47+   }
48+ 
49+   implicit  class  AsFunction6 [T1 , T2 , T3 , T4 , T5 , T6 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 ) =>  R ]) extends  AnyVal  {
50+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6))
51+   }
52+ 
53+   implicit  class  AsFunction7 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 ) =>  R ]) extends  AnyVal  {
54+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7))
55+   }
56+ 
57+   implicit  class  AsFunction8 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ) =>  R ]) extends  AnyVal  {
58+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8))
59+   }
60+ 
61+   implicit  class  AsFunction9 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ) =>  R ]) extends  AnyVal  {
62+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9))
63+   }
64+ 
65+   implicit  class  AsFunction10 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ) =>  R ]) extends  AnyVal  {
66+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10))
67+   }
68+ 
69+   implicit  class  AsFunction11 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ) =>  R ]) extends  AnyVal  {
70+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11))
71+   }
72+ 
73+   implicit  class  AsFunction12 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ) =>  R ]) extends  AnyVal  {
74+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12))
75+   }
76+ 
77+   implicit  class  AsFunction13 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ) =>  R ]) extends  AnyVal  {
78+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13))
79+   }
80+ 
81+   implicit  class  AsFunction14 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ) =>  R ]) extends  AnyVal  {
82+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14))
83+   }
84+ 
85+   implicit  class  AsFunction15 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ) =>  R ]) extends  AnyVal  {
86+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15))
87+   }
88+ 
89+   implicit  class  AsFunction16 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ) =>  R ]) extends  AnyVal  {
90+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16))
91+   }
92+ 
93+   implicit  class  AsFunction17 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ) =>  R ]) extends  AnyVal  {
94+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ], x17 : Expr [T17 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17))
95+   }
96+ 
97+   implicit  class  AsFunction18 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ) =>  R ]) extends  AnyVal  {
98+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ], x17 : Expr [T17 ], x18 : Expr [T18 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18))
99+   }
100+ 
101+   implicit  class  AsFunction19 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ) =>  R ]) extends  AnyVal  {
102+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ], x17 : Expr [T17 ], x18 : Expr [T18 ], x19 : Expr [T19 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19))
103+   }
104+ 
105+   implicit  class  AsFunction20 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ) =>  R ]) extends  AnyVal  {
106+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ], x17 : Expr [T17 ], x18 : Expr [T18 ], x19 : Expr [T19 ], x20 : Expr [T20 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20))
107+   }
108+ 
109+   implicit  class  AsFunction21 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ) =>  R ]) extends  AnyVal  {
110+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ], x17 : Expr [T17 ], x18 : Expr [T18 ], x19 : Expr [T19 ], x20 : Expr [T20 ], x21 : Expr [T21 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21))
111+   }
112+ 
113+   implicit  class  AsFunction22 [T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , R ](private  val  f :  Expr [(T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ) =>  R ]) extends  AnyVal  {
114+     def  apply (x1 : Expr [T1 ], x2 : Expr [T2 ], x3 : Expr [T3 ], x4 : Expr [T4 ], x5 : Expr [T5 ], x6 : Expr [T6 ], x7 : Expr [T7 ], x8 : Expr [T8 ], x9 : Expr [T9 ], x10 : Expr [T10 ], x11 : Expr [T11 ], x12 : Expr [T12 ], x13 : Expr [T13 ], x14 : Expr [T14 ], x15 : Expr [T15 ], x16 : Expr [T16 ], x17 : Expr [T17 ], x18 : Expr [T18 ], x19 : Expr [T19 ], x20 : Expr [T20 ], x21 : Expr [T21 ], x22 : Expr [T22 ]):  Expr [R ] =  new  Exprs .FunctionAppliedTo [R ](f, Array (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22))
25115  }
26116
27117}
@@ -53,8 +143,11 @@ object Exprs {
53143    override  def  toString :  String  =  s " Expr(<tasty tree>) " 
54144  }
55145
56-   /**  An Expr representing `'{(~f).apply(~x)}` but it is beta-reduced when the closure is known */  
57-   final  class  FunctionAppliedTo [T , + U ](val  f :  Expr [T  =>  U ], val  x :  Expr [T ]) extends  Expr [U ] {
58-     override  def  toString :  String  =  s " Expr( $f <applied to>  $x) " 
146+   //  TODO Use a List in FunctionAppliedTo(val f: Expr[_], val args: List[Expr[_]])
147+   //  FIXME: Having the List in the code above trigers an assertion error while testing dotty.tools.dotc.reporting.ErrorMessagesTests.i3187
148+   //         This test does redefine `scala.collection`. Further investigation is needed.
149+   /**  An Expr representing `'{(~f).apply(~x1, ..., ~xn)}` but it is beta-reduced when the closure is known */  
150+   final  class  FunctionAppliedTo [+ R ](val  f :  Expr [_], val  args :  Array [Expr [_]]) extends  Expr [R ] {
151+     override  def  toString :  String  =  s " Expr( $f <applied to>  ${args.toList}) " 
59152  }
60153}
0 commit comments