@@ -398,7 +398,7 @@ simpleExpr syn =
398 <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))
398 <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))
399 <|> proofExpr syn
399 <|> proofExpr syn
400 <|> tacticsExpr syn
400 <|> tacticsExpr syn
401− <|> try (do reserved "Type"; symbol "*"; return $ PUniverse AllTypes)
401+ <|> try (do reserved "Type*"; return $ PUniverse AllTypes)
402 <|> do reserved "AnyType"; return $ PUniverse AllTypes
402 <|> do reserved "AnyType"; return $ PUniverse AllTypes
403 <|> PType <$> reservedFC "Type"
403 <|> PType <$> reservedFC "Type"
404 <|> do reserved "UniqueType"; return $ PUniverse UniqueType
404 <|> do reserved "UniqueType"; return $ PUniverse UniqueType
@@ -440,16 +440,16 @@ bracketed :: SyntaxInfo -> IdrisParser PTerm
440bracketed syn = do (FC fn (sl, sc) _) <- getFC
440bracketed syn = do (FC fn (sl, sc) _) <- getFC
441 lchar '(' <?> "parenthesized expression"
441 lchar '(' <?> "parenthesized expression"
442 bracketed' (FC fn (sl, sc) (sl, sc+1)) syn
442 bracketed' (FC fn (sl, sc) (sl, sc+1)) syn
443{- |Parses the rest of an expression in braces
444{- |Parses the rest of an expression in braces
445Bracketed' ::=
446Bracketed' ::=
447 | Expr ')'
448 | Expr ')'
448 | ExprList ')'
449 | ExprList ')'
449− | Expr '**' Expr ')'
450+ | DependentPair ')'
450 | Operator Expr ')'
451 | Operator Expr ')'
451 | Expr Operator ')'
452 | Expr Operator ')'
452− | Name ':' Expr '**' Expr ')'
@@ -458,14 +458,7 @@ bracketed' open syn =
458 do (FC f start (l, c)) <- getFC
458 do (FC f start (l, c)) <- getFC
459 lchar ')'
459 lchar ')'
460 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
460 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
461− <|> try (do (ln, lnfc) <- name
461+ <|> try (dependentPair TypeOrTerm [] open syn)
462− colonFC <- lcharFC ':'
464− starsFC <- reservedOpFC "**"
467− close <- lcharFC ')'
468− return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))
469 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
462 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
470 -- No prefix operators! (bit of a hack here...)
463 -- No prefix operators! (bit of a hack here...)
471 if (o == "-" || o == "!")
464 if (o == "-" || o == "!")
@@ -486,20 +479,59 @@ bracketed' open syn =
486 <|> do l <- expr syn
479 <|> do l <- expr syn
487 bracketedExpr syn open l
480 bracketedExpr syn open l
484+{-| Parses the rest of a dependent pair after '(' or '(Expr **' -}
485+dependentPair :: PunInfo -> [(PTerm, Maybe (FC, PTerm), FC)] -> FC -> SyntaxInfo -> IdrisParser PTerm
486+dependentPair pun prev openFC syn =
488+ nametypePart <|> namePart
491+ IsType -> nametypePart <|> namePart <|> exprPart True
492+ IsTerm -> exprPart False
493+ TypeOrTerm -> nametypePart <|> namePart <|> exprPart False
494+ where nametypePart = do
495+ (ln, lnfc, colonFC) <- try $ do
497+ colonFC <- lcharFC ':'
498+ return (ln, lnfc, colonFC)
500+ starsFC <- reservedOpFC "**"
501+ dependentPair IsType ((PRef lnfc [] ln, Just (colonFC, lty), starsFC):prev) openFC syn
504+ starsFC <- reservedOpFC "**"
505+ dependentPair pun ((PRef lnfc [] ln, Nothing, starsFC):prev) openFC syn
509+ let stars = (Left <$> reservedOpFC "**")
510+ ending = (Right <$> lcharFC ')')
511+ in if isEnd then ending else stars <|> ending
513+ Left starsFC -> dependentPair IsTerm ((e, Nothing, starsFC):prev) openFC syn
515+ return (mkPDPairs pun openFC closeFC (reverse prev) e)
516+ mkPDPairs pun openFC closeFC ((e, cfclty, starsFC):bnds) r =
517+ (PDPair openFC ([openFC] ++ maybe [] ((: []) . fst) cfclty ++ [starsFC, closeFC] ++ (=<<) (\(_,cfclty,sfc) -> maybe [] ((: []) . fst) cfclty ++ [sfc]) bnds)
518+ pun e (maybe Placeholder snd cfclty) (mergePDPairs pun starsFC bnds r))
519+ mergePDPairs pun starsFC' [] r = r
520+ mergePDPairs pun starsFC' ((e, cfclty, starsFC):bnds) r =
521+ PDPair starsFC' [] pun e (maybe Placeholder snd cfclty) (mergePDPairs pun starsFC bnds r)
489-- | Parse the contents of parentheses, after an expression has been parsed.
523-- | Parse the contents of parentheses, after an expression has been parsed.
490bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
524bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
491bracketedExpr syn openParenFC e =
525bracketedExpr syn openParenFC e =
492 do lchar ')'; return e
526 do lchar ')'; return e
493− <|> do exprs <- many (do comma <- lcharFC ','
527+ <|> do exprs <- some (do comma <- lcharFC ','
494 r <- expr syn
528 r <- expr syn
495 return (r, comma))
529 return (r, comma))
496 closeParenFC <- lcharFC ')'
530 closeParenFC <- lcharFC ')'
497 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
531 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
498 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
532 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
499 <|> do starsFC <- reservedOpFC "**"
533 <|> do starsFC <- reservedOpFC "**"
500− r <- expr syn
534+ dependentPair IsTerm [(e, Nothing, starsFC)] openParenFC syn
501− closeParenFC <- lcharFC ')'
502− return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)
503 <?> "end of bracketed expression"
535 <?> "end of bracketed expression"
504 where mergePairs :: [(PTerm, FC)] -> PTerm
536 where mergePairs :: [(PTerm, FC)] -> PTerm
505 mergePairs [(t, fc)] = t
537 mergePairs [(t, fc)] = t