on master help sign in
Merge pull request #557 from ahmadsalim/feature/fixindent

Addition of indentation property support.

commit89d0f5d8186b67102b09581c5dc64ea9d9ceb04e authorEdwin Brady <edwin.brady@gmail.com> dateWed 23 Oct 2013, 07:04 (13 years ago) parentd120141ea39754
2 files changed+49−17
src/Idris/ParseExpr.hs+17−17 src/Idris/ParseHelpers.hs+32
src/Idris/ParseExpr.hs+17−17
@@ -976,49 +976,49 @@ TacticSeq ::=
976976-}
977977
978978tactic :: SyntaxInfo -> IdrisParser PTactic
979−tactic syn = do reserved "intro"; ns <- sepBy name (lchar ',')
979+tactic syn = do reserved "intro"; ns <- sepBy (indentPropHolds gtProp *> name) (lchar ',')
980980 return $ Intro ns
981981 <|> do reserved "intros"; return Intros
982− <|> try (do reserved "refine"; n <- name
982+ <|> try (do reserved "refine"; n <- (indentPropHolds gtProp *> name)
983983 imps <- some imp
984984 return $ Refine n imps)
985− <|> do reserved "refine"; n <- name
985+ <|> do reserved "refine"; n <- (indentPropHolds gtProp *> name)
986986 i <- get
987987 return $ Refine n []
988− <|> do reserved "mrefine"; n <- name
988+ <|> do reserved "mrefine"; n <- (indentPropHolds gtProp *> name)
989989 i <- get
990990 return $ MatchRefine n
991− <|> do reserved "rewrite"; t <- expr syn;
991+ <|> do reserved "rewrite"; t <- (indentPropHolds gtProp *> expr syn);
992992 i <- get
993993 return $ Rewrite (desugar syn i t)
994− <|> do reserved "equiv"; t <- expr syn;
994+ <|> do reserved "equiv"; t <- (indentPropHolds gtProp *> expr syn);
995995 i <- get
996996 return $ Equiv (desugar syn i t)
997− <|> try (do reserved "let"; n <- name; lchar ':';
998− ty <- expr' syn; lchar '='; t <- expr syn;
997+ <|> try (do reserved "let"; n <- (indentPropHolds gtProp *> name); (indentPropHolds gtProp *> lchar ':');
998+ ty <- (indentPropHolds gtProp *> expr' syn); (indentPropHolds gtProp *> lchar '='); t <- (indentPropHolds gtProp *> expr syn);
999999 i <- get
10001000 return $ LetTacTy n (desugar syn i ty) (desugar syn i t))
1001− <|> try (do reserved "let"; n <- name; lchar '=';
1002− t <- expr syn;
1001+ <|> try (do reserved "let"; n <- (indentPropHolds gtProp *> name); (indentPropHolds gtProp *> lchar '=');
1002+ t <- (indentPropHolds gtProp *> expr syn);
10031003 i <- get
10041004 return $ LetTac n (desugar syn i t))
1005− <|> do reserved "focus"; n <- name
1005+ <|> do reserved "focus"; n <- (indentPropHolds gtProp *> name)
10061006 return $ Focus n
1007− <|> do reserved "exact"; t <- expr syn;
1007+ <|> do reserved "exact"; t <- (indentPropHolds gtProp *> expr syn);
10081008 i <- get
10091009 return $ Exact (desugar syn i t)
1010− <|> do reserved "applyTactic"; t <- expr syn;
1010+ <|> do reserved "applyTactic"; t <- (indentPropHolds gtProp *> expr syn);
10111011 i <- get
10121012 return $ ApplyTactic (desugar syn i t)
1013− <|> do reserved "reflect"; t <- expr syn;
1013+ <|> do reserved "reflect"; t <- (indentPropHolds gtProp *> expr syn);
10141014 i <- get
10151015 return $ Reflect (desugar syn i t)
1016− <|> do reserved "fill"; t <- expr syn;
1016+ <|> do reserved "fill"; t <- (indentPropHolds gtProp *> expr syn);
10171017 i <- get
10181018 return $ Fill (desugar syn i t)
1019− <|> do reserved "try"; t <- tactic syn;
1019+ <|> do reserved "try"; t <- (indentPropHolds gtProp *> tactic syn);
10201020 lchar '|';
1021− t1 <- tactic syn
1021+ t1 <- (indentPropHolds gtProp *> tactic syn)
10221022 return $ Try t t1
10231023 <|> do lchar '{'
10241024 t <- tactic syn;
src/Idris/ParseHelpers.hs+32
@@ -403,6 +403,38 @@ notEndBlock = do ist <- get
403403 when (i < lvl || isParen) (fail "end of block")
404404 _ -> return ()
405405
406+-- | Representation of an operation that can compare the current indentation with the last indentation, and an error message if it fails
407+data IndentProperty = IndentProperty (Int -> Int -> Bool) String
408+
409+-- | Allows comparison of indent, and fails if property doesn't hold
410+indentPropHolds :: IndentProperty -> IdrisParser()
411+indentPropHolds (IndentProperty op msg) = do
412+ li <- lastIndent
413+ i <- indent
414+ when (not $ op i li) $ fail ("Wrong indention: " ++ msg)
415+
416+-- | Greater-than indent property
417+gtProp :: IndentProperty
418+gtProp = IndentProperty (>) "should be greater than context indentation"
419+
420+-- | Greater-than or equal to indent property
421+gteProp :: IndentProperty
422+gteProp = IndentProperty (>=) "should be greater than or equal context indentation"
423+
424+-- | Equal indent property
425+eqProp :: IndentProperty
426+eqProp = IndentProperty (==) "should be equal to context indentation"
427+
428+-- | Less-than indent property
429+ltProp :: IndentProperty
430+ltProp = IndentProperty (<) "should be less than context indentation"
431+
432+-- | Less-than or equal to indent property
433+lteProp :: IndentProperty
434+lteProp = IndentProperty (<=) "should be less than or equal to context indentation"
435+
436+
437+-- | Checks that there are no braces that are not closed
406438notOpenBraces :: IdrisParser ()
407439notOpenBraces = do ist <- get
408440 when (hasNothing $ brace_stack ist) $ fail "end of input"