SC2181: Add '!' in suggestion as appropriate (fixes #2189)

This commit is contained in:
Vidar Holen 2021-07-18 16:59:45 -07:00
parent 163629825f
commit 99f6554c9b
1 changed files with 14 additions and 9 deletions

View File

@ -3118,24 +3118,29 @@ prop_checkReturnAgainstZero8 = verify checkReturnAgainstZero "(( $? ))"
prop_checkReturnAgainstZero9 = verify checkReturnAgainstZero "(( ! $? ))" prop_checkReturnAgainstZero9 = verify checkReturnAgainstZero "(( ! $? ))"
checkReturnAgainstZero _ token = checkReturnAgainstZero _ token =
case token of case token of
TC_Binary id _ _ lhs rhs -> check lhs rhs TC_Binary id _ op lhs rhs -> check op lhs rhs
TA_Binary id _ lhs rhs -> check lhs rhs TA_Binary id op lhs rhs -> check op lhs rhs
TA_Unary id _ exp TA_Unary id op exp
| isExitCode exp -> message (getId exp) | isExitCode exp -> message (checksSuccessLhs op) (getId exp)
TA_Sequence _ [exp] TA_Sequence _ [exp]
| isExitCode exp -> message (getId exp) | isExitCode exp -> message False (getId exp)
_ -> return () _ -> return ()
where where
check lhs rhs = -- Is "$? op 0" trying to check if the command succeeded?
checksSuccessLhs op = not $ op `elem` ["-gt", "-ne", "!=", "!"]
-- Is "0 op $?" trying to check if the command succeeded?
checksSuccessRhs op = op `notElem` ["-ne", "!="]
check op lhs rhs =
if isZero rhs && isExitCode lhs if isZero rhs && isExitCode lhs
then message (getId lhs) then message (checksSuccessLhs op) (getId lhs)
else when (isZero lhs && isExitCode rhs) $ message (getId rhs) else when (isZero lhs && isExitCode rhs) $ message (checksSuccessRhs op) (getId rhs)
isZero t = getLiteralString t == Just "0" isZero t = getLiteralString t == Just "0"
isExitCode t = isExitCode t =
case getWordParts t of case getWordParts t of
[T_DollarBraced _ _ l] -> concat (oversimplify l) == "?" [T_DollarBraced _ _ l] -> concat (oversimplify l) == "?"
_ -> False _ -> False
message id = style id 2181 "Check exit code directly with e.g. 'if mycmd;', not indirectly with $?." message forSuccess id = style id 2181 $
"Check exit code directly with e.g. 'if " ++ (if forSuccess then "" else "! ") ++ "mycmd;', not indirectly with $?."
prop_checkRedirectedNowhere1 = verify checkRedirectedNowhere "> file" prop_checkRedirectedNowhere1 = verify checkRedirectedNowhere "> file"
prop_checkRedirectedNowhere2 = verify checkRedirectedNowhere "> file | grep foo" prop_checkRedirectedNowhere2 = verify checkRedirectedNowhere "> file | grep foo"