@@ -452,14 +452,19 @@ bracketed' open syn =
452452 do (FC f start (l, c)) <- getFC
453453 lchar ')'
454454 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
455− <|> try (do (ln, lnfc) <- name
456− colonFC <- lcharFC ':'
457− lty <- expr syn
458− starsFC <- reservedOpFC "**"
455+ <|> try (do (ln, lnfc, colonFC, lty, starsFC):bnds <- some $ do
456+ (ln, lnfc, colonFC) <- try $ do
457+ (ln, lnfc) <- name
458+ colonFC <- lcharFC ':'
459+ return (ln, lnfc, colonFC)
460+ lty <- expr syn
461+ starsFC <- reservedOpFC "**"
462+ return (ln, lnfc, colonFC, lty, starsFC)
459463 fc <- getFC
460464 r <- expr syn
461465 close <- lcharFC ')'
462− return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))
466+ return (PDPair fc ([open, colonFC, starsFC, close] ++ (=<<) (\(_,_,cfc,_,sfc) -> [cfc, sfc]) bnds)
467+ TypeOrTerm (PRef lnfc [] ln) lty (mergePDPairs starsFC bnds r)))
463468 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
464469 -- No prefix operators! (bit of a hack here...)
465470 if (o == "-" || o == "!")
@@ -470,7 +475,7 @@ bracketed' open syn =
470475 <|> try (do l <- simpleExpr syn
471476 op <- option Nothing (do o <- operator
472477 lchar ')'
473− return (Just o))
478+ return (Just o))
474479 fc0 <- getFC
475480 case op of
476481 Nothing -> bracketedExpr syn open l
@@ -479,25 +484,35 @@ bracketed' open syn =
479484 pexp (PRef fc0 [] (sMN 1000 "ARG"))]))
480485 <|> do l <- expr syn
481486 bracketedExpr syn open l
482−
487+ where mergePDPairs :: FC -> [(Name, FC, FC, PTerm, FC)] -> PTerm -> PTerm
488+ mergePDPairs starsFC' [] r = r
489+ mergePDPairs starsFC' ((ln, lnfc, colonFC, lty, starsFC):bnds) r =
490+ PDPair starsFC' [] TypeOrTerm (PRef lnfc [] ln) lty (mergePDPairs starsFC bnds r)
491+
483492-- | Parse the contents of parentheses, after an expression has been parsed.
484493bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
485494bracketedExpr syn openParenFC e =
486495 do lchar ')'; return e
487− <|> do exprs <- many (do comma <- lcharFC ','
496+ <|> do exprs <- some (do comma <- lcharFC ','
488497 r <- expr syn
489498 return (r, comma))
490499 closeParenFC <- lcharFC ')'
491500 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
492501 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
493− <|> do starsFC <- reservedOpFC "**"
494− r <- expr syn
502+ <|> do exprs <- some $ do
503+ starsFC <- reservedOpFC "**"
504+ r <- expr syn
505+ return (r, starsFC)
495506 closeParenFC <- lcharFC ')'
496− return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)
507+ let hilite = [openParenFC, closeParenFC] ++ map snd exprs
508+ return (PDPair openParenFC hilite TypeOrTerm e Placeholder (mergePDPairs exprs))
497509 <?> "end of bracketed expression"
498510 where mergePairs :: [(PTerm, FC)] -> PTerm
499511 mergePairs [(t, fc)] = t
500512 mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs)
513+ mergePDPairs :: [(PTerm, FC)] -> PTerm
514+ mergePDPairs [(t, fc)] = t
515+ mergePDPairs ((t, fc):rs) = PDPair fc [] TypeOrTerm t Placeholder (mergePDPairs rs)
501516
502517-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a
503518-- big integer, otherwise try fromInteger and the constants as alternatives.