From 4262c4b1bfb28835fc1bf3c2aa2dd9159b827cfe Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sun, 26 Jan 2014 12:44:51 -0800 Subject: [PATCH] Allow {} in arithmetic for loops --- ShellCheck/Analytics.hs | 2 ++ ShellCheck/Parser.hs | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index 2398006..e802369 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -1371,6 +1371,7 @@ checkSpuriousExec = doLists doLists (T_WhileExpression _ _ cmds) = doList cmds doLists (T_UntilExpression _ _ cmds) = doList cmds doLists (T_ForIn _ _ _ cmds) = doList cmds + doLists (T_ForArithmetic _ _ _ _ cmds) = doList cmds doLists (T_IfExpression _ thens elses) = do mapM_ (\(_, l) -> doList l) thens doList elses @@ -1968,6 +1969,7 @@ prop_checkCdAndBack3 = verifyNot (checkCdAndBack Sh) "while [[ $PWD != / ]]; do checkCdAndBack shell = doLists where doLists (T_ForIn _ _ _ cmds) = doList cmds + doLists (T_ForArithmetic _ _ _ _ cmds) = doList cmds doLists (T_WhileExpression _ _ cmds) = doList cmds doLists (T_UntilExpression _ _ cmds) = doList cmds doLists (T_IfExpression _ thens elses) = do diff --git a/ShellCheck/Parser.hs b/ShellCheck/Parser.hs index e998b83..ca56f48 100644 --- a/ShellCheck/Parser.hs +++ b/ShellCheck/Parser.hs @@ -1486,15 +1486,14 @@ prop_readForClause6 = isOk readForClause "for ((;;))\ndo echo $i\ndone" prop_readForClause7 = isOk readForClause "for ((;;)) do echo $i\ndone" prop_readForClause8 = isOk readForClause "for ((;;)) ; do echo $i\ndone" prop_readForClause9 = isOk readForClause "for i do true; done" +prop_readForClause10= isOk readForClause "for ((;;)) { true; }" readForClause = called "for loop" $ do pos <- getPosition (T_For id) <- g_For spacing - typ <- (readRegular <|> readArithmetic) - group <- readDoGroup pos - typ id group + readRegular id pos <|> readArithmetic id pos where - readArithmetic = called "arithmetic for condition" $ do + readArithmetic id pos = called "arithmetic for condition" $ do try $ string "((" x <- readArithmeticContents char ';' >> spacing @@ -1505,13 +1504,19 @@ readForClause = called "for loop" $ do string "))" spacing optional $ readSequentialSep >> spacing - return $ \id group -> (return $ T_ForArithmetic id x y z group) + group <- readBraced <|> readDoGroup pos + return $ T_ForArithmetic id x y z group - readRegular = do + readBraced = do + (T_BraceGroup _ list) <- readBraceGroup + return list + + readRegular id pos = do name <- readVariableName spacing values <- readInClause <|> (optional readSequentialSep >> return []) - return $ \id group -> (return $ T_ForIn id name values group) + group <- readDoGroup pos + return $ T_ForIn id name values group prop_readSelectClause1 = isOk readSelectClause "select foo in *; do echo $foo; done" prop_readSelectClause2 = isOk readSelectClause "select foo; do echo $foo; done"