@@ -20,8 +20,98 @@ object Expr {
20
20
def apply [T ](x : T ): Expr [T ] =
21
21
throw new Error (" Internal error: this method call should have been replaced by the compiler" )
22
22
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))
25
115
}
26
116
27
117
}
@@ -53,8 +143,11 @@ object Exprs {
53
143
override def toString : String = s " Expr(<tasty tree>) "
54
144
}
55
145
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}) "
59
152
}
60
153
}
0 commit comments