@@ -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