diff --git a/src/ShellCheck/Checks/Commands.hs b/src/ShellCheck/Checks/Commands.hs index 366438d..c0cd9a3 100644 --- a/src/ShellCheck/Checks/Commands.hs +++ b/src/ShellCheck/Checks/Commands.hs @@ -101,7 +101,7 @@ commandChecks = [ ++ map checkArgComparison declaringCommands ++ map checkMaskedReturns declaringCommands -declaringCommands = ["local", "declare", "export", "readonly", "typeset"] +declaringCommands = ["local", "declare", "export", "readonly", "typeset", "let"] optionalChecks = map fst optionalCommandChecks @@ -1156,11 +1156,13 @@ prop_checkArgComparison2 = verify (checkArgComparison "declare") "declare a =b" prop_checkArgComparison3 = verifyNot (checkArgComparison "declare") "declare a=b" prop_checkArgComparison4 = verify (checkArgComparison "export") "export a +=b" prop_checkArgComparison7 = verifyNot (checkArgComparison "declare") "declare -a +i foo" +prop_checkArgComparison8 = verify (checkArgComparison "let") "let x = 0" -- This mirrors checkSecondArgIsComparison but for arguments to local/readonly/declare/export -checkArgComparison str = CommandCheck (Exactly str) wordsWithEqual +checkArgComparison cmd = CommandCheck (Exactly cmd) wordsWithEqual where - wordsWithEqual t = mapM_ check $ drop 1 $ arguments t - check arg = sequence_ $ do + wordsWithEqual t = mapM_ check $ arguments t + check arg = do + sequence_ $ do str <- getLeadingUnquotedString arg case str of '=':_ -> @@ -1171,6 +1173,15 @@ checkArgComparison str = CommandCheck (Exactly str) wordsWithEqual "Remove spaces around += to append." _ -> Nothing + -- 'let' is parsed as a sequence of arithmetic expansions, + -- so we want the additional warning for "x=" + when (cmd == "let") $ sequence_ $ do + token <- getTrailingUnquotedLiteral arg + str <- getLiteralString token + guard $ "=" `isSuffixOf` str + return $ err (getId token) 2290 $ + "Remove spaces around = to assign." + headId t = case t of T_NormalWord _ (x:_) -> getId x diff --git a/src/ShellCheck/Parser.hs b/src/ShellCheck/Parser.hs index 4a01775..e559f62 100644 --- a/src/ShellCheck/Parser.hs +++ b/src/ShellCheck/Parser.hs @@ -2810,7 +2810,7 @@ readLetSuffix = many1 (readIoRedirect <|> try readLetExpression <|> readCmdWord) startPos <- getPosition expression <- readStringForParser readCmdWord let (unQuoted, newPos) = kludgeAwayQuotes expression startPos - subParse newPos readArithmeticContents unQuoted + subParse newPos (readArithmeticContents <* eof) unQuoted kludgeAwayQuotes :: String -> SourcePos -> (String, SourcePos) kludgeAwayQuotes s p =