From a3c6aff0fb13cf533c2bdec31cf8fde683f781af Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Mon, 3 Jul 2017 13:58:10 -0700 Subject: [PATCH] Improve parsing of line breaks in for statements (#926) --- ShellCheck/Parser.hs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ShellCheck/Parser.hs b/ShellCheck/Parser.hs index dfd48fa..e085842 100644 --- a/ShellCheck/Parser.hs +++ b/ShellCheck/Parser.hs @@ -2131,6 +2131,7 @@ prop_readForClause8 = isOk readForClause "for ((;;)) ; do echo $i\ndone" prop_readForClause9 = isOk readForClause "for i do true; done" prop_readForClause10= isOk readForClause "for ((;;)) { true; }" prop_readForClause12= isWarning readForClause "for $a in *; do echo \"$a\"; done" +prop_readForClause13= isOk readForClause "for foo\nin\\\n bar\\\n baz\ndo true; done" readForClause = called "for loop" $ do pos <- getPosition (T_For id) <- g_For @@ -2158,7 +2159,7 @@ readForClause = called "for loop" $ do readRegular id pos = do acceptButWarn (char '$') ErrorC 1086 "Don't use $ on the iterator name in for loops." - name <- readVariableName `thenSkip` spacing + name <- readVariableName `thenSkip` allspacing values <- readInClause <|> (optional readSequentialSep >> return []) group <- readDoGroup pos return $ T_ForIn id name values group @@ -2532,7 +2533,7 @@ tryParseWordToken keyword t = try $ do try . lookAhead $ char '#' parseProblem ErrorC 1099 "You need a space before the #." - try $ lookAhead keywordSeparator + lookAhead keywordSeparator when (str /= keyword) $ parseProblem ErrorC 1081 $ "Scripts are case sensitive. Use '" ++ keyword ++ "', not '" ++ str ++ "'." @@ -2591,7 +2592,7 @@ g_Semi = do tryToken ";" T_Semi keywordSeparator = - eof <|> disregard whitespace <|> disregard (oneOf ";()[<>&|") + eof <|> disregard (try allspacingOrFail) <|> disregard (oneOf ";()[<>&|") readKeyword = choice [ g_Then, g_Else, g_Elif, g_Fi, g_Do, g_Done, g_Esac, g_Rbrace, g_Rparen, g_DSEMI ]