Inform about ineffectual ! on commands (fixes #1531)
This commit is contained in:
parent
8efbecd64a
commit
95b1185882
|
@ -8,6 +8,7 @@
|
||||||
- Source paths: Use `-P dir1:dir2` or a `source-path=dir1` directive
|
- Source paths: Use `-P dir1:dir2` or a `source-path=dir1` directive
|
||||||
to specify search paths for sourced files.
|
to specify search paths for sourced files.
|
||||||
- json1 format like --format=json but treats tabs as single characters
|
- json1 format like --format=json but treats tabs as single characters
|
||||||
|
- SC2251: Inform about ineffectual ! in front of commands
|
||||||
- SC2250: Warn about variable references without braces (optional)
|
- SC2250: Warn about variable references without braces (optional)
|
||||||
- SC2249: Warn about `case` with missing default case (optional)
|
- SC2249: Warn about `case` with missing default case (optional)
|
||||||
- SC2248: Warn about unquoted variables without special chars (optional)
|
- SC2248: Warn about unquoted variables without special chars (optional)
|
||||||
|
|
|
@ -190,6 +190,7 @@ nodeChecks = [
|
||||||
,checkInvertedStringTest
|
,checkInvertedStringTest
|
||||||
,checkRedirectionToCommand
|
,checkRedirectionToCommand
|
||||||
,checkDollarQuoteParen
|
,checkDollarQuoteParen
|
||||||
|
,checkUselessBang
|
||||||
]
|
]
|
||||||
|
|
||||||
optionalChecks = map fst optionalTreeChecks
|
optionalChecks = map fst optionalTreeChecks
|
||||||
|
@ -3357,5 +3358,41 @@ checkDefaultCase _ t =
|
||||||
pg <- wordToExactPseudoGlob pat
|
pg <- wordToExactPseudoGlob pat
|
||||||
return $ pseudoGlobIsSuperSetof pg [PGMany]
|
return $ pseudoGlobIsSuperSetof pg [PGMany]
|
||||||
|
|
||||||
|
prop_checkUselessBang1 = verify checkUselessBang "! true; rest"
|
||||||
|
prop_checkUselessBang2 = verify checkUselessBang "while true; do ! true; done"
|
||||||
|
prop_checkUselessBang3 = verifyNot checkUselessBang "if ! true; then true; fi"
|
||||||
|
prop_checkUselessBang4 = verifyNot checkUselessBang "( ! true )"
|
||||||
|
prop_checkUselessBang5 = verifyNot checkUselessBang "{ ! true; }"
|
||||||
|
prop_checkUselessBang6 = verifyNot checkUselessBang "x() { ! [ x ]; }"
|
||||||
|
checkUselessBang params t = mapM_ check (getNonReturningCommands t)
|
||||||
|
where
|
||||||
|
check t =
|
||||||
|
case t of
|
||||||
|
T_Banged id _ ->
|
||||||
|
info id 2251 "This ! is not on a condition and skips errexit. Use { ! ...; } to errexit, or verify usage."
|
||||||
|
_ -> return ()
|
||||||
|
|
||||||
|
-- Get all the subcommands that aren't likely to be the return value
|
||||||
|
getNonReturningCommands :: Token -> [Token]
|
||||||
|
getNonReturningCommands t =
|
||||||
|
case t of
|
||||||
|
T_Script _ _ list -> dropLast list
|
||||||
|
T_BraceGroup _ list -> dropLast list
|
||||||
|
T_Subshell _ list -> dropLast list
|
||||||
|
T_WhileExpression _ conds cmds -> dropLast conds ++ cmds
|
||||||
|
T_UntilExpression _ conds cmds -> dropLast conds ++ cmds
|
||||||
|
T_ForIn _ _ _ list -> list
|
||||||
|
T_ForArithmetic _ _ _ _ list -> list
|
||||||
|
T_Annotation _ _ t -> getNonReturningCommands t
|
||||||
|
T_IfExpression _ conds elses ->
|
||||||
|
concatMap (dropLast . fst) conds ++ concatMap snd conds ++ elses
|
||||||
|
_ -> []
|
||||||
|
|
||||||
|
dropLast t =
|
||||||
|
case t of
|
||||||
|
[_] -> []
|
||||||
|
x:rest -> x : dropLast rest
|
||||||
|
_ -> []
|
||||||
|
|
||||||
return []
|
return []
|
||||||
runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])
|
runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])
|
||||||
|
|
Loading…
Reference in New Issue