@@ -20,6 +20,7 @@ class TokenTreeBuilderParsingTest extends haxe.unit.TestCase {
2020 assertCodeParses (ISSUE_256 );
2121 assertCodeParses (DOLLAR_TOKEN_AS_VAR_NAME );
2222 assertCodeParses (REFERENCE_CONSTRUCTOR );
23+ assertCodeParses (SHORT_LAMBDA );
2324 }
2425
2526 public function assertCodeParses (code : String , ? pos : PosInfos ) {
@@ -170,4 +171,150 @@ abstract TokenTreeBuilderParsingTests(String) to String {
170171 var constructor = SomeClass.new;
171172 }" ;
172173
174+ var SHORT_LAMBDA = "
175+ class TestArrowFunctions extends Test {
176+
177+ var f0_0: Void -> Int;
178+ var f0_1: Void -> W;
179+
180+ var f1_0: Int->Int;
181+ var f1_1: ?Int->Int;
182+
183+ var f2_0: Int->Int;
184+
185+ var f3_0: Int->Int->Int;
186+ var f3_1: ?Int->String->Int;
187+ var f3_2: Int->?Int->Int;
188+
189+ var f4: Int->(Int->Int);
190+ var f5: Int->Int->(Int->Int);
191+ var f6_a: Int->(Int->(Int->Int));
192+ var f6_b: Int->(Int->(Int->Int));
193+ var f7: (Int->Int)->(Int->Int);
194+ var f8: Int -> String;
195+
196+ var arr: Array<Int->Int> = [];
197+ var map: Map<Int,Int->Int> = new Map();
198+ var obj: { f : Int->Int };
199+
200+ var v0: Int;
201+ var v1: String;
202+
203+ var maybe : Void -> Bool;
204+
205+ function testSyntax(){
206+
207+ // skipping hl for now due to variance errors:
208+ // Don't know how to cast ref(i32) to null(i32) see issue #6210
209+ #if !(hl || as3)
210+
211+ maybe = () -> Math.random() > 0.5;
212+
213+ v0 = (123);
214+ v0 = (123:Int);
215+
216+ f0_0 = function () return 1;
217+ f0_0 = () -> 1;
218+
219+ f0_0 = (() -> 1);
220+ f0_0 = (() -> 1:Void->Int);
221+ f0_0 = cast (() -> 1:Void->Int);
222+
223+ v0 = f0_0();
224+
225+ f0_1 = function () : W return 1;
226+ v1 = f0_1();
227+
228+ f0_1 = () -> (1:W);
229+ v1 = f0_1();
230+
231+ f1_0 = function (a:Int) return a;
232+ f1_1 = function (?a:Int) return a;
233+
234+ f1_0 = a -> a;
235+ v0 = f1_0(1);
236+
237+ f1_1 = (?a) -> a;
238+ v0 = f1_1(1);
239+
240+ f1_1 = (?a:Int) -> a;
241+ v0 = f1_1(1);
242+
243+ f1_1 = (a:Int=1) -> a;
244+ v0 = f1_1();
245+
246+ f1_1 = (?a:Int=1) -> a;
247+ v0 = f1_1();
248+
249+ f1_1 = function (a=2) return a;
250+ eq(f1_1(),2);
251+
252+ f1_1 = (a=2) -> a;
253+ eq(f1_1(),2);
254+
255+ f3_0 = function (a:Int, b:Int) return a + b;
256+ f3_1 = function (?a:Int, b:String) return a + b.length;
257+ f3_2 = function (a:Int, ?b:Int) return a + b;
258+
259+ f3_0 = (a:Int, b:Int) -> a + b;
260+ f3_1 = (?a:Int, b:String) -> a + b.length;
261+ f3_2 = (a:Int, ?b:Int) -> a + b;
262+
263+ #if !flash
264+ f3_1 = function (a=1, b:String) return a + b.length;
265+ eq(f3_1('--'),3);
266+
267+ f3_1 = function (?a:Int=1, b:String) return a + b.length;
268+ eq(f3_1('--'),3);
269+
270+ f3_2 = function (a:Int, b=2) return a + b;
271+ eq(f3_2(1),3);
272+
273+ f3_1 = (a=1, b:String) -> a + b.length;
274+ eq(f3_1('--'),3);
275+
276+ f3_1 = (a:Int=1, b:String) -> a + b.length;
277+ eq(f3_1('--'),3);
278+
279+ f3_1 = (?a:Int=1, b:String) -> a + b.length;
280+ eq(f3_1('--'),3);
281+
282+ f3_2 = (a:Int, b=2) -> a + b;
283+ eq(f3_2(1),3);
284+ #end
285+
286+ f4 = function (a) return function (b) return a + b;
287+ f4 = a -> b -> a + b;
288+
289+ f5 = function (a,b) return function (c) return a + b + c;
290+ f5 = (a, b) -> c -> a + b + c;
291+
292+ f6_a = function (a) return function (b) return function (c) return a + b + c;
293+ f6_b = a -> b -> c -> a + b + c;
294+ eq(f6_a(1)(2)(3),f6_b(1)(2)(3));
295+
296+ f7 = function (f:Int->Int) return f;
297+ f7 = f -> f;
298+ f7 = (f:Int->Int) -> f;
299+ f7 = maybe() ? f -> f : f -> g -> f(g);
300+ f7 = switch maybe() {
301+ case true: f -> f;
302+ case false: f -> g -> f(g);
303+ };
304+
305+ f8 = (a:Int) -> ('$a':String);
306+
307+ arr = [for (i in 0...5) a -> a * i];
308+ arr = [a -> a + a, b -> b + b, c -> c + c];
309+ arr.map( f -> f(2) );
310+
311+ var arr2:Array<Int->W> = [for (f in arr) x -> f(x)];
312+
313+ map = [1 => a -> a + a, 2 => a -> a + a, 3 => a -> a + a];
314+
315+ obj = { f : a -> a + a };
316+
317+ #end
318+ }
319+ }" ;
173320}
0 commit comments