@@ -402,7 +402,7 @@ simpleExpr syn =
402 <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))
402 <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))
403 <|> proofExpr syn
403 <|> proofExpr syn
404 <|> tacticsExpr syn
404 <|> tacticsExpr syn
405− <|> try (do reserved "Type"; symbol "*"; return $ PUniverse AllTypes)
405+ <|> try (do reserved "Type*"; return $ PUniverse AllTypes)
406 <|> do reserved "AnyType"; return $ PUniverse AllTypes
406 <|> do reserved "AnyType"; return $ PUniverse AllTypes
407 <|> PType <$> reservedFC "Type"
407 <|> PType <$> reservedFC "Type"
408 <|> do reserved "UniqueType"; return $ PUniverse UniqueType
408 <|> do reserved "UniqueType"; return $ PUniverse UniqueType
@@ -462,14 +462,19 @@ bracketed' open syn =
462 do (FC f start (l, c)) <- getFC
462 do (FC f start (l, c)) <- getFC
463 lchar ')'
463 lchar ')'
464 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
464 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
465− <|> try (do (ln, lnfc) <- name
465+ <|> try (do (ln, lnfc, colonFC, lty, starsFC):bnds <- some $ do
466+ (ln, lnfc, colonFC) <- try $ do
466− colonFC <- lcharFC ':'
468+ colonFC <- lcharFC ':'
469+ return (ln, lnfc, colonFC)
467− lty <- expr syn
470+ lty <- expr' syn
468− starsFC <- reservedOpFC "**"
471+ starsFC <- reservedOpFC "**"
472+ return (ln, lnfc, colonFC, lty, starsFC)
469 fc <- getFC
473 fc <- getFC
470 r <- expr syn
474 r <- expr syn
471 close <- lcharFC ')'
475 close <- lcharFC ')'
472− return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))
476+ return (PDPair fc ([open, colonFC, starsFC, close] ++ (=<<) (\(_,_,cfc,_,sfc) -> [cfc, sfc]) bnds)
477+ TypeOrTerm (PRef lnfc [] ln) lty (mergePDPairs starsFC bnds r)))
473 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
478 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
474 -- No prefix operators! (bit of a hack here...)
479 -- No prefix operators! (bit of a hack here...)
475 if (o == "-" || o == "!")
480 if (o == "-" || o == "!")
@@ -480,7 +485,7 @@ bracketed' open syn =
480 <|> try (do l <- simpleExpr syn
485 <|> try (do l <- simpleExpr syn
481 op <- option Nothing (do o <- operator
486 op <- option Nothing (do o <- operator
482 lchar ')'
487 lchar ')'
483− return (Just o))
488+ return (Just o))
484 fc0 <- getFC
489 fc0 <- getFC
485 case op of
490 case op of
486 Nothing -> bracketedExpr syn open l
491 Nothing -> bracketedExpr syn open l
@@ -489,25 +494,35 @@ bracketed' open syn =
489 pexp (PRef fc0 [] (sMN 1000 "ARG"))]))
494 pexp (PRef fc0 [] (sMN 1000 "ARG"))]))
490 <|> do l <- expr syn
495 <|> do l <- expr syn
491 bracketedExpr syn open l
496 bracketedExpr syn open l
492−
497+ where mergePDPairs :: FC -> [(Name, FC, FC, PTerm, FC)] -> PTerm -> PTerm
498+ mergePDPairs starsFC' [] r = r
499+ mergePDPairs starsFC' ((ln, lnfc, colonFC, lty, starsFC):bnds) r =
500+ PDPair starsFC' [] TypeOrTerm (PRef lnfc [] ln) lty (mergePDPairs starsFC bnds r)
493-- | Parse the contents of parentheses, after an expression has been parsed.
502-- | Parse the contents of parentheses, after an expression has been parsed.
494bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
503bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
495bracketedExpr syn openParenFC e =
504bracketedExpr syn openParenFC e =
496 do lchar ')'; return e
505 do lchar ')'; return e
497− <|> do exprs <- many (do comma <- lcharFC ','
506+ <|> do exprs <- some (do comma <- lcharFC ','
498 r <- expr syn
507 r <- expr syn
499 return (r, comma))
508 return (r, comma))
500 closeParenFC <- lcharFC ')'
509 closeParenFC <- lcharFC ')'
501 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
510 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
502 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
511 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
512+ <|> do exprs <- some $ do
503− <|> do starsFC <- reservedOpFC "**"
513+ starsFC <- reservedOpFC "**"
504− r <- expr syn
514+ r <- expr syn
505 closeParenFC <- lcharFC ')'
516 closeParenFC <- lcharFC ')'
506− return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)
517+ let hilite = [openParenFC, closeParenFC] ++ map snd exprs
518+ return (PDPair openParenFC hilite TypeOrTerm e Placeholder (mergePDPairs exprs))
507 <?> "end of bracketed expression"
519 <?> "end of bracketed expression"
508 where mergePairs :: [(PTerm, FC)] -> PTerm
520 where mergePairs :: [(PTerm, FC)] -> PTerm
509 mergePairs [(t, fc)] = t
521 mergePairs [(t, fc)] = t
510 mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs)
522 mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs)
523+ mergePDPairs :: [(PTerm, FC)] -> PTerm
524+ mergePDPairs [(t, fc)] = t
525+ mergePDPairs ((t, fc):rs) = PDPair fc [] TypeOrTerm t Placeholder (mergePDPairs rs)
512-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a
527-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a
513-- big integer, otherwise try fromInteger and the constants as alternatives.
528-- big integer, otherwise try fromInteger and the constants as alternatives.