@@ -112,7 +112,7 @@ rewriteBlock = do
112
112
rewriteTermlike kw mk = do
113
113
kw <- quasikeyword kw
114
114
lhs <- term
115
- (_spanAnn, rhs) <- layoutBlock " ==>"
115
+ (_openAnn, _spanAnn, rhs) <- layoutBlock " ==>"
116
116
pure (mk (ann kw <> ann rhs) lhs rhs)
117
117
rewriteTerm = rewriteTermlike " term" DD. rewriteTerm
118
118
rewriteCase = rewriteTermlike " case" DD. rewriteCase
@@ -234,10 +234,10 @@ matchCase = do
234
234
[ Nothing <$ quasikeyword " otherwise" ,
235
235
Just <$> infixAppOrBooleanOp
236
236
]
237
- (_spanAnn, t) <- layoutBlock " ->"
237
+ (_openAnn, _spanAnn, t) <- layoutBlock " ->"
238
238
pure (guard, t)
239
239
let unguardedBlock = label " case match" do
240
- (_spanAnn, t) <- layoutBlock " ->"
240
+ (_openAnn, _spanAnn, t) <- layoutBlock " ->"
241
241
pure (Nothing , t)
242
242
-- a pattern's RHS is either one or more guards, or a single unguarded block.
243
243
guardsAndBlocks <- guardedBlocks <|> (pure @ [] <$> unguardedBlock)
@@ -562,10 +562,12 @@ lam p = label "lambda" $ mkLam <$> P.try (some prefixDefinitionName <* reserved
562
562
in Term. lam' (ann (head vs) <> ann b) annotatedArgs b
563
563
564
564
letBlock , handle , ifthen :: (Monad m , Var v ) => TermP v m
565
- letBlock = label " let" $ (snd <$> layoutBlock " let" )
565
+ letBlock = label " let" $ do
566
+ (_openAnn, _spanAnn, tm) <- layoutBlock " let"
567
+ pure tm
566
568
handle = label " handle" do
567
- (handleSpan, b) <- block " handle"
568
- (_withSpan, handler) <- layoutBlock " with"
569
+ (_handleOpenAnn, handleSpan, b) <- block " handle"
570
+ (_withOpenAnn, _withSpan, handler) <- layoutBlock " with"
569
571
-- We don't use the annotation span from 'with' here because it will
570
572
-- include a dedent if it's at the end of block.
571
573
-- Meaning the newline gets overwritten when pretty-printing and it messes things up.
@@ -600,9 +602,9 @@ lamCase = do
600
602
601
603
ifthen = label " if" do
602
604
start <- peekAny
603
- (_spanAnn, c) <- block " if"
604
- (_spanAnn, t) <- block " then"
605
- (_spanAnn, f) <- layoutBlock " else"
605
+ (_ifOpenAnn, _spanAnn, c) <- block " if"
606
+ (_thenAnn, _spanAnn, t) <- block " then"
607
+ (_elseAnn, _spanAnn, f) <- layoutBlock " else"
606
608
pure $ Term. iff (ann start <> ann f) c t f
607
609
608
610
text :: (Var v ) => TermP v m
@@ -736,11 +738,17 @@ doc2Block = do
736
738
docTop d = \ case
737
739
Doc. Section title body -> pure $ Term. apps' (f d " Section" ) [docParagraph d title, Term. list (gann body) body]
738
740
Doc. Eval code ->
739
- Term. app (gann d) (f d " Eval" ) . addDelay . snd
740
- <$> subParse (block' False False " syntax.docEval" (pure $ pure () ) $ Ann. External <$ P. eof) code
741
+ let inner = do
742
+ (_openAnn, ann, tm) <- (block' False False " syntax.docEval" (pure $ pure () ) $ Ann. External <$ P. eof)
743
+ pure (ann, tm)
744
+ in Term. app (gann d) (f d " Eval" ) . addDelay . snd
745
+ <$> subParse inner code
741
746
Doc. ExampleBlock code ->
742
- Term. apps' (f d " ExampleBlock" ) . (Term. nat (gann d) 0 : ) . pure . addDelay . snd
743
- <$> subParse (block' False True " syntax.docExampleBlock" (pure $ pure () ) $ Ann. External <$ P. eof) code
747
+ let inner = do
748
+ (_openAnn, ann, tm) <- (block' False True " syntax.docExampleBlock" (pure $ pure () ) $ Ann. External <$ P. eof)
749
+ pure (ann, tm)
750
+ in Term. apps' (f d " ExampleBlock" ) . (Term. nat (gann d) 0 : ) . pure . addDelay . snd
751
+ <$> subParse inner code
744
752
Doc. CodeBlock label body ->
745
753
pure $
746
754
Term. apps'
@@ -1219,9 +1227,8 @@ delayQuote = P.label "quote" do
1219
1227
1220
1228
delayBlock :: (Monad m , Var v ) => P v m (Ann {- Ann spanning the whole block -} , Term v Ann )
1221
1229
delayBlock = P. label " do" do
1222
- (spanAnn, b) <- layoutBlock " do"
1223
- let argSpan = (ann b {- would be nice to use the annotation for 'do' here, but it's not terribly important -} )
1224
- pure $ (spanAnn, DD. delayTerm (ann b) argSpan b)
1230
+ (openAnn, spanAnn, b) <- layoutBlock " do"
1231
+ pure $ (spanAnn, DD. delayTerm (ann b) openAnn b)
1225
1232
1226
1233
bang :: (Monad m , Var v ) => TermP v m
1227
1234
bang = P. label " bang" do
@@ -1363,7 +1370,7 @@ destructuringBind = do
1363
1370
-- (Some 42) = List.head elems
1364
1371
pat <- P. try (parsePattern <* P. lookAhead (openBlockWith " =" ))
1365
1372
(p, boundVars) <- over (_2 . mapped) snd <$> bindConstructorsInPattern pat
1366
- (_spanAnn, scrute) <- layoutBlock " =" -- Dwight K. Scrute ("The People's Scrutinee")
1373
+ (_eqAnn, _spanAnn, scrute) <- layoutBlock " =" -- Dwight K. Scrute ("The People's Scrutinee")
1367
1374
let guard = Nothing
1368
1375
let absChain vs t = foldr (\ v t -> ABT. abs' (ann t) v t) t vs
1369
1376
thecase t = Term. MatchCase p (fmap (absChain boundVars) guard) $ absChain boundVars t
@@ -1381,7 +1388,15 @@ destructuringBind = do
1381
1388
-- binding) and the entire body.
1382
1389
-- * If the binding is a lambda, the lambda node includes the entire LHS of the binding,
1383
1390
-- including the name as well.
1384
- binding :: forall m v . (Monad m , Var v ) => P v m ((Ann , v ), Term v Ann )
1391
+ binding ::
1392
+ forall m v .
1393
+ (Monad m , Var v ) =>
1394
+ P
1395
+ v
1396
+ m
1397
+ ( (Ann {- annotation for the location of 'v' -} , v ),
1398
+ Term v Ann
1399
+ )
1385
1400
binding = label " binding" do
1386
1401
typ <- optional typedecl
1387
1402
-- a ++ b = ...
@@ -1401,25 +1416,25 @@ binding = label "binding" do
1401
1416
Nothing -> do
1402
1417
-- we haven't seen a type annotation, so lookahead to '=' before commit
1403
1418
(lhsLoc, name, args) <- P. try (lhs <* P. lookAhead (openBlockWith " =" ))
1404
- (_bodySpanAnn, body) <- block " ="
1419
+ (_eqAnn, _bodySpanAnn, body) <- block " ="
1405
1420
verifyRelativeName' (fmap Name. unsafeParseVar name)
1406
1421
let binding = mkBinding lhsLoc args body
1407
1422
-- We don't actually use the span annotation from the block (yet) because it
1408
1423
-- may contain a bunch of white-space and comments following a top-level-definition.
1409
- let spanAnn = ann lhsLoc <> ann binding
1410
- pure $ ((spanAnn , (L. payload name)), binding)
1424
+ -- let spanAnn = ann lhsLoc <> ann binding
1425
+ pure $ ((ann name , (L. payload name)), binding)
1411
1426
Just (nameT, typ) -> do
1412
1427
(lhsLoc, name, args) <- lhs
1413
1428
verifyRelativeName' (fmap Name. unsafeParseVar name)
1414
1429
when (L. payload name /= L. payload nameT) $
1415
1430
customFailure $
1416
1431
SignatureNeedsAccompanyingBody nameT
1417
- (_bodySpanAnn, body) <- block " ="
1432
+ (_eqAnn, _bodySpanAnn, body) <- block " ="
1418
1433
let binding = mkBinding lhsLoc args body
1419
1434
-- We don't actually use the span annotation from the block (yet) because it
1420
1435
-- may contain a bunch of white-space and comments following a top-level-definition.
1421
1436
let spanAnn = ann nameT <> ann binding
1422
- pure $ ((spanAnn , L. payload name), Term. ann (ann nameT <> ann binding) binding typ)
1437
+ pure $ ((ann nameT , L. payload name), Term. ann spanAnn binding typ)
1423
1438
where
1424
1439
mkBinding :: Ann -> [L. Token v ] -> Term. Term v Ann -> Term. Term v Ann
1425
1440
mkBinding _lhsLoc [] body = body
@@ -1430,10 +1445,30 @@ binding = label "binding" do
1430
1445
customFailure :: (P. MonadParsec e s m ) => e -> m a
1431
1446
customFailure = P. customFailure
1432
1447
1433
- block :: forall m v . (Monad m , Var v ) => String -> P v m (Ann , Term v Ann )
1448
+ block ::
1449
+ forall m v .
1450
+ (Monad m , Var v ) =>
1451
+ String ->
1452
+ P
1453
+ v
1454
+ m
1455
+ ( Ann {- annotation of block-open symbol, e.g. 'do', 'let' -} ,
1456
+ Ann {- annotation for whole block -} ,
1457
+ Term v Ann
1458
+ )
1434
1459
block s = block' False False s (openBlockWith s) closeBlock
1435
1460
1436
- layoutBlock :: forall m v . (Monad m , Var v ) => String -> P v m (Ann , Term v Ann )
1461
+ layoutBlock ::
1462
+ forall m v .
1463
+ (Monad m , Var v ) =>
1464
+ String ->
1465
+ P
1466
+ v
1467
+ m
1468
+ ( Ann {- annotation of block-open symbol, e.g. 'do', 'let' -} ,
1469
+ Ann {- annotation for whole layout block -} ,
1470
+ Term v Ann
1471
+ )
1437
1472
layoutBlock s = block' False False s (openBlockWith s) optionalCloseBlock
1438
1473
1439
1474
-- example: use Foo.bar.Baz + ++ x
@@ -1468,7 +1503,7 @@ importp = do
1468
1503
pure (suffix, Name. joinDot (L. payload prefix) suffix)
1469
1504
1470
1505
data BlockElement v
1471
- = Binding ((Ann , v ), Term v Ann )
1506
+ = Binding ((Ann {- span for the binding name -} , v), Term v Ann )
1472
1507
| DestructuringBind (Ann , Term v Ann -> Term v Ann )
1473
1508
| Action (Term v Ann )
1474
1509
@@ -1512,22 +1547,22 @@ block' ::
1512
1547
String ->
1513
1548
P v m (L. Token () ) ->
1514
1549
P v m end ->
1515
- P v m (Ann {- ann which spans the whole block -} , Term v Ann )
1550
+ P v m (Ann {- span for the opening token, e.g. the "do" or opening bracket -} , Ann {- ann which spans the whole block -} , Term v Ann )
1516
1551
block' isTop implicitUnitAtEnd s openBlock closeBlock = do
1517
1552
open <- openBlock
1518
1553
(names, imports) <- imports
1519
1554
_ <- optional semi
1520
1555
statements <- local (\ e -> e {names}) $ sepBy semi statement
1521
1556
end <- closeBlock
1522
1557
body <- substImports names imports <$> go open statements
1523
- pure (ann open <> ann end, body)
1558
+ pure (ann open, ann open <> ann end, body)
1524
1559
where
1525
1560
statement = asum [Binding <$> binding, DestructuringBind <$> destructuringBind, Action <$> blockTerm]
1526
1561
go :: L. Token () -> [BlockElement v ] -> P v m (Term v Ann )
1527
1562
go open =
1528
1563
let finish :: Term. Term v Ann -> TermP v m
1529
1564
finish tm = case Components. minimize' tm of
1530
- Left dups -> customFailure $ DuplicateTermNames (toList dups)
1565
+ Left dups -> customFailure $ DuplicateTermNames (toList ( fmap (second toList) dups) )
1531
1566
Right tm -> pure tm
1532
1567
toTm :: [BlockElement v ] -> TermP v m
1533
1568
toTm [] = customFailure $ EmptyBlock (const s <$> open)
@@ -1537,19 +1572,21 @@ block' isTop implicitUnitAtEnd s openBlock closeBlock = do
1537
1572
where
1538
1573
step :: BlockElement v -> Term v Ann -> TermP v m
1539
1574
step elem result = case elem of
1540
- Binding ((a, v), tm) ->
1575
+ Binding ((a, v), tm) -> do
1576
+ let fullLetRecSpan = ann a <> ann result
1541
1577
pure $
1542
1578
Term. consLetRec
1543
1579
isTop
1544
- (ann a <> ann result)
1580
+ fullLetRecSpan
1545
1581
(a, v, tm)
1546
1582
result
1547
- Action tm ->
1583
+ Action tm -> do
1584
+ let fullLetRecSpan = (ann tm <> ann result)
1548
1585
pure $
1549
1586
Term. consLetRec
1550
1587
isTop
1551
- (ann tm <> ann result)
1552
- (ann tm , positionalVar (ann tm) (Var. named " _" ), tm)
1588
+ fullLetRecSpan
1589
+ (Ann. External , positionalVar (ann tm) (Var. named " _" ), tm)
1553
1590
result
1554
1591
DestructuringBind (_, f) ->
1555
1592
f <$> finish result
0 commit comments