@@ -270,12 +270,20 @@ class RecursiveDescentTests extends munit.FunSuite {
270
270
{
271
271
val (source, pos) =
272
272
raw """ loop { f }
273
- |↑ ↑ ↑↑
273
+ |↑ ↑ ↑↑ ↑
274
274
| """ .sourceAndPositions
275
275
276
276
assertEquals(
277
277
parseExpr(source.content),
278
- Call (IdTarget (IdRef (Nil , " loop" , Span (source, pos(0 ), pos(1 )))), Nil , Nil , List (Var (IdRef (Nil , " f" , Span (source, pos(2 ), pos(3 )))))))
278
+ Call (
279
+ IdTarget (IdRef (Nil , " loop" , Span (source, pos(0 ), pos(1 )))),
280
+ Nil , Nil ,
281
+ List (
282
+ Var (IdRef (Nil , " f" , Span (source, pos(2 ), pos(3 ))), Span (source, pos(2 ), pos(3 )))
283
+ ),
284
+ Span (source, pos(0 ), pos.last)
285
+ )
286
+ )
279
287
}
280
288
281
289
assertNotEqualModuloSpans(
@@ -294,7 +302,12 @@ class RecursiveDescentTests extends munit.FunSuite {
294
302
assertEquals(
295
303
parseExpr(source.content),
296
304
// At the moment uniform function call syntax is always a method call
297
- MethodCall (Var (IdRef (Nil , " foo" , Span (source, pos(0 ), pos(1 )))), IdRef (Nil , " bar" , Span (source, pos(2 ), pos(3 ))), Nil , Nil , Nil ))
305
+ MethodCall (
306
+ Var (IdRef (Nil , " foo" , Span (source, pos(0 ), pos(1 ))), Span (source, pos(0 ), pos(1 ))),
307
+ IdRef (Nil , " bar" , Span (source, pos(2 ), pos(3 ))), Nil , Nil , Nil ,
308
+ Span (source, pos(0 ), pos.last)
309
+ )
310
+ )
298
311
}
299
312
300
313
parseExpr(" resume(42)" )
@@ -336,7 +349,7 @@ class RecursiveDescentTests extends munit.FunSuite {
336
349
| """ .sourceAndPosition
337
350
val b = parseExpr(source.content)
338
351
b match {
339
- case Term .Box (c, _) => assertEquals(c.span, Span (source, pos, pos, Synthesized ))
352
+ case Term .Box (c, _, _ ) => assertEquals(c.span, Span (source, pos, pos, Synthesized ))
340
353
case other =>
341
354
throw new IllegalArgumentException (s " Expected Box but got ${other.getClass.getSimpleName}" )
342
355
}
@@ -379,28 +392,28 @@ class RecursiveDescentTests extends munit.FunSuite {
379
392
raw """ map
380
393
|↑ ↑
381
394
| """ .sourceAndSpan
382
- assertEquals(parseExpr(source.content), Var (IdRef (List (), " map" , span)))
395
+ assertEquals(parseExpr(source.content), Var (IdRef (List (), " map" , span), span ))
383
396
}
384
397
{
385
398
val (source, span) =
386
399
raw """ list::map
387
400
|↑ ↑
388
401
| """ .sourceAndSpan
389
- assertEquals(parseExpr(source.content), Var (IdRef (List (" list" ), " map" , span)))
402
+ assertEquals(parseExpr(source.content), Var (IdRef (List (" list" ), " map" , span), span ))
390
403
}
391
404
{
392
405
val (source, span) =
393
406
raw """ list::internal::map
394
407
|↑ ↑
395
408
| """ .sourceAndSpan
396
- assertEquals(parseExpr(source.content), Var (IdRef (List (" list" , " internal" ), " map" , span)))
409
+ assertEquals(parseExpr(source.content), Var (IdRef (List (" list" , " internal" ), " map" , span), span ))
397
410
}
398
411
{
399
412
val (source, span) =
400
413
raw """ list::internal::test
401
414
|↑ ↑
402
415
| """ .sourceAndSpan
403
- assertEquals(parseExpr(source.content), Var (IdRef (List (" list" , " internal" ), " test" , span)))
416
+ assertEquals(parseExpr(source.content), Var (IdRef (List (" list" , " internal" ), " test" , span), span ))
404
417
}
405
418
}
406
419
@@ -481,6 +494,34 @@ class RecursiveDescentTests extends munit.FunSuite {
481
494
parseStmts(" val g: () => Unit / Exc at {exc} = fun() { closure() }; ()" )
482
495
}
483
496
497
+ test(" Pattern-matching val parses with correct span" ) {
498
+ val (source, pos) =
499
+ raw """ val (left, right) = list; return left
500
+ | ↑↑ ↑ ↑ ↑↑ ↑ ↑ ↑ ↑ ↑
501
+ | """ .sourceAndPositions
502
+ val expected = Return (Match (
503
+ List (Var (IdRef (List (), " list" , Span (source,pos(6 ),pos(7 ))),Span (source,pos(6 ),pos(7 )))),
504
+ List (
505
+ MatchClause (
506
+ TagPattern (
507
+ IdRef (List (" effekt" )," Tuple2" ,Span (source,pos(0 ),pos(5 ),Synthesized )),
508
+ List (AnyPattern (IdDef (" left" , Span (source,pos(1 ),pos(2 ))), Span (source,pos(1 ),pos(2 ))),
509
+ AnyPattern (IdDef (" right" ,Span (source,pos(3 ),pos(4 ))), Span (source,pos(3 ),pos(4 )))),
510
+ Span (source,pos(0 ),pos(5 ))
511
+ ),
512
+ List (),
513
+ Return (Var (IdRef (List ()," left" ,Span (source,pos(9 ),pos(10 ))),
514
+ Span (source,pos(9 ),pos(10 ))),
515
+ Span (source,pos(8 ),pos(10 ))),
516
+ Span (source,pos(0 ),pos(7 ))
517
+ )
518
+ ),
519
+ None ,
520
+ Span (source,0 ,pos(7 ), Synthesized )
521
+ ),Span (source,0 ,pos.last, Synthesized ));
522
+ assertEquals(parseStmts(source.content), expected)
523
+ }
524
+
484
525
test(" Semicolon insertion" ) {
485
526
parseStmts(" f(); return x" )
486
527
parseStmts(
@@ -521,23 +562,27 @@ class RecursiveDescentTests extends munit.FunSuite {
521
562
parseMatchPattern(" Cons(x, y)" )
522
563
assertEqualModuloSpans(
523
564
parseMatchPattern(" _" ),
524
- IgnorePattern ())
565
+ IgnorePattern (Span .missing ))
525
566
parseMatchPattern(" Cons(x, Cons(x, Nil()))" )
526
567
527
568
{
528
569
val (source, pos) =
529
570
raw """ (left, Cons(x, right))
530
- |↑↑ ↑ ↑ ↑↑↑ ↑ ↑ ↑
571
+ |↑↑ ↑ ↑ ↑↑↑ ↑ ↑↑ ↑
531
572
| """ .sourceAndPositions
532
573
assertEquals(
533
574
parseMatchPattern(source.content),
534
- TagPattern (IdRef (List (" effekt" ), " Tuple2" , Span (source, pos(0 ), pos( 9 ) , Synthesized )),
535
- List (AnyPattern (IdDef (" left" , Span (source, pos(1 ), pos(2 )))),
575
+ TagPattern (IdRef (List (" effekt" ), " Tuple2" , Span (source, pos(0 ), pos.last , Synthesized )),
576
+ List (AnyPattern (IdDef (" left" , Span (source, pos(1 ), pos(2 ))), Span (source, pos( 1 ), pos( 2 )) ),
536
577
TagPattern (
537
578
IdRef (List (), " Cons" , Span (source, pos(3 ), pos(4 ))),
538
- List (AnyPattern (IdDef (" x" , Span (source, pos(5 ), pos(6 )))),
539
- AnyPattern (IdDef (" right" , Span (source, pos(7 ), pos(8 )))))
540
- ))))
579
+ List (AnyPattern (IdDef (" x" , Span (source, pos(5 ), pos(6 ))), Span (source, pos(5 ), pos(6 ))),
580
+ AnyPattern (IdDef (" right" , Span (source, pos(7 ), pos(8 ))), Span (source, pos(7 ), pos(8 )))),
581
+ Span (source, pos(3 ), pos(9 ))
582
+ )),
583
+ Span (source, pos(0 ), pos.last)
584
+ )
585
+ )
541
586
}
542
587
}
543
588
@@ -626,14 +671,15 @@ class RecursiveDescentTests extends munit.FunSuite {
626
671
| """ .sourceAndPositions
627
672
assertEquals(
628
673
parseBlockType(source.content),
629
- FunctionType (Many .empty(Span (source, pos(0 ), pos(1 ))),
674
+ FunctionType (Many .empty(Span (source, pos(0 ), pos(0 ))),
630
675
Many (List (
631
676
TypeRef (IdRef (Nil , " Int" , Span (source, pos(1 ), pos(2 ))), Many .empty(Span (source, pos(2 ), pos(2 ))), Span (source, pos(1 ), pos(2 ))),
632
677
TypeRef (IdRef (Nil , " String" , Span (source, pos(3 ), pos(4 ))), Many .empty(Span (source, pos(4 ), pos(4 ))), Span (source, pos(3 ), pos(4 )))
633
678
), Span (source, pos(0 ), pos(5 ))),
634
679
Many .empty(Span (source, pos(5 ), pos(5 ))),
635
680
TypeRef (IdRef (Nil , " Int" , Span (source, pos(6 ), pos(7 ))), Many .empty(Span (source, pos(7 ), pos(7 ))), Span (source, pos(6 ), pos(7 ))),
636
- Effects (Nil , Span (source, pos.last, pos.last, Synthesized ))
681
+ Effects (Nil , Span (source, pos.last, pos.last, Synthesized )),
682
+ Span (source, pos(0 ), pos.last)
637
683
)
638
684
)
639
685
}
@@ -710,13 +756,17 @@ class RecursiveDescentTests extends munit.FunSuite {
710
756
711
757
test(" Implementations" ) {
712
758
{
713
- val (source, span ) =
759
+ val (source, pos ) =
714
760
raw """ Foo {}
715
- |↑ ↑
716
- | """ .sourceAndSpan
761
+ |↑ ↑ ↑
762
+ | """ .sourceAndPositions
717
763
assertEquals(
718
764
parseImplementation(source.content),
719
- Implementation (TypeRef (IdRef (Nil , " Foo" , span), Many .empty(Span (source, span.to, span.to)), span), Nil ))
765
+ Implementation (
766
+ TypeRef (IdRef (Nil , " Foo" , Span (source, pos(0 ), pos(1 ))), Many .empty(Span (source, pos(1 ), pos(1 ))), Span (source, pos(0 ), pos(1 ))),
767
+ Nil ,
768
+ Span (source, pos(0 ), pos(2 )))
769
+ )
720
770
}
721
771
parseImplementation(" Foo[T] {}" )
722
772
parseImplementation(" Foo[T] { def bar() = 42 }" )
@@ -734,14 +784,18 @@ class RecursiveDescentTests extends munit.FunSuite {
734
784
{
735
785
val (source, pos) =
736
786
raw """ Foo { 43 }
737
- |↑ ↑
787
+ |↑ ↑ ↑ ↑ ↑
738
788
| """ .sourceAndPositions
739
789
assertEquals(
740
790
parseImplementation(source.content),
741
791
Implementation (
742
792
TypeRef (IdRef (Nil , " Foo" , Span (source, pos(0 ), pos(1 ))), Many .empty(Span (source, pos(1 ), pos(1 ))), Span (source, pos(0 ), pos(1 ), Synthesized )),
743
793
List (OpClause (IdRef (Nil , " Foo" , Span (source, pos(0 ), pos(1 ), Synthesized )), Nil , Nil , Nil , None ,
744
- Return (Literal (43 , symbols.builtins.TInt )), IdDef (" resume" , Span (source, pos(1 ), pos(1 )))))))
794
+ Return (Literal (43 , symbols.builtins.TInt , Span (source, pos(2 ), pos(3 ))), Span (source, pos(2 ), pos(3 ))), IdDef (" resume" , Span (source, pos(1 ), pos(1 ))),
795
+ Span (source, pos(0 ), pos(3 ), Synthesized ))
796
+ ),
797
+ Span (source, pos(0 ), pos.last)
798
+ ))
745
799
}
746
800
}
747
801
@@ -768,6 +822,21 @@ class RecursiveDescentTests extends munit.FunSuite {
768
822
)
769
823
}
770
824
825
+ test(" Try handler capability parses with correct span" ) {
826
+ val (source, pos) =
827
+ raw """ try { 42 } with eff: Eff { 42 }
828
+ | ↑ ↑
829
+ | """ .sourceAndPositions
830
+
831
+ val tryExpr = parseTry(source.content) match {
832
+ case t : Term .TryHandle => t
833
+ case other =>
834
+ throw new IllegalArgumentException (s " Expected Try but got ${other.getClass.getSimpleName}" )
835
+ }
836
+
837
+ assertEquals(tryExpr.handlers.head.capability.get.span, Span (source, pos(0 ), pos(1 ), Synthesized ))
838
+ }
839
+
771
840
test(" Type definition" ) {
772
841
parseDefinition(" type A = Int" )
773
842
parseDefinition(" type A[X] = Int" )
@@ -866,7 +935,11 @@ class RecursiveDescentTests extends munit.FunSuite {
866
935
867
936
assertEquals(
868
937
parseDefinition(source.content),
869
- DefDef (IdDef (" foo" , Span (source, pos(0 ), pos(1 ))), None , Var (IdRef (Nil , " f" , Span (source, pos(2 ), pos(3 )))), None , Span (source, 0 , pos.last)))
938
+ DefDef (
939
+ IdDef (" foo" , Span (source, pos(0 ), pos(1 ))),
940
+ None ,
941
+ Var (IdRef (Nil , " f" , Span (source, pos(2 ), pos(3 ))), Span (source, pos(2 ), pos(3 ))),
942
+ None , Span (source, 0 , pos.last)))
870
943
}
871
944
872
945
parseDefinition(
@@ -1011,7 +1084,7 @@ class RecursiveDescentTests extends munit.FunSuite {
1011
1084
val definition = parseStmts(source.content)
1012
1085
1013
1086
val regDef = definition match {
1014
- case DefStmt (rd@ RegDef (id, annot, region, binding, doc, span), _) => rd
1087
+ case DefStmt (rd@ RegDef (id, annot, region, binding, doc, span), _, _ ) => rd
1015
1088
case other =>
1016
1089
throw new IllegalArgumentException (s " Expected RegDef but got ${other.getClass.getSimpleName}" )
1017
1090
}
@@ -1028,7 +1101,7 @@ class RecursiveDescentTests extends munit.FunSuite {
1028
1101
val definition = parseStmts(source.content)
1029
1102
1030
1103
val varDef = definition match {
1031
- case DefStmt (vd@ VarDef (id, annot, binding, doc, span), _) => vd
1104
+ case DefStmt (vd@ VarDef (id, annot, binding, doc, span), _, _ ) => vd
1032
1105
case other =>
1033
1106
throw new IllegalArgumentException (s " Expected VarDef but got ${other.getClass.getSimpleName}" )
1034
1107
}
@@ -1247,10 +1320,10 @@ class RecursiveDescentTests extends munit.FunSuite {
1247
1320
}
1248
1321
1249
1322
test(" Extern effect‐body parses with correct span" ) {
1250
- val (source, span ) =
1323
+ val (source, pos ) =
1251
1324
raw """ extern def foo(): Int = default { foo() }
1252
- |↑ ↑
1253
- | """ .sourceAndSpan
1325
+ |↑ ↑ ↑ ↑
1326
+ | """ .sourceAndPositions
1254
1327
1255
1328
val definition = parseToplevel(source.content)
1256
1329
@@ -1260,7 +1333,9 @@ class RecursiveDescentTests extends munit.FunSuite {
1260
1333
throw new IllegalArgumentException (s " Expected ExternDef but got ${other.getClass.getSimpleName}" )
1261
1334
}
1262
1335
1263
- assertEquals(extDef.span, span)
1336
+ assertEquals(extDef.bodies.head.span, Span (source, pos(1 ), pos.last))
1337
+ assertEquals(extDef.bodies.head.featureFlag.span, Span (source, pos(1 ), pos(2 )))
1338
+ assertEquals(extDef.span, Span (source, pos(0 ), pos.last))
1264
1339
}
1265
1340
1266
1341
test(" Toplevel definitions" ) {
0 commit comments