Replace !!! with pattern-matching where it's easy

This commit is contained in:
Joseph C. Sible 2023-12-31 15:55:06 -05:00
parent 6e5b5401c6
commit a786f996a1
3 changed files with 8 additions and 14 deletions

View File

@ -468,9 +468,8 @@ checkAssignAteCommand _ (T_SimpleCommand id [T_Assignment _ _ _ _ assignmentTerm
where where
isCommonCommand (Just s) = s `elem` commonCommands isCommonCommand (Just s) = s `elem` commonCommands
isCommonCommand _ = False isCommonCommand _ = False
firstWordIsArg list = fromMaybe False $ do firstWordIsArg (head:_) = isGlob head || isUnquotedFlag head
head <- list !!! 0 firstWordIsArg [] = False
return $ isGlob head || isUnquotedFlag head
checkAssignAteCommand _ _ = return () checkAssignAteCommand _ _ = return ()
@ -491,9 +490,7 @@ prop_checkWrongArit2 = verify checkWrongArithmeticAssignment "n=2; i=n*2"
checkWrongArithmeticAssignment params (T_SimpleCommand id [T_Assignment _ _ _ _ val] []) = checkWrongArithmeticAssignment params (T_SimpleCommand id [T_Assignment _ _ _ _ val] []) =
sequence_ $ do sequence_ $ do
str <- getNormalString val str <- getNormalString val
match <- matchRegex regex str var:op:_ <- matchRegex regex str
var <- match !!! 0
op <- match !!! 1
Map.lookup var references Map.lookup var references
return . warn (getId val) 2100 $ return . warn (getId val) 2100 $
"Use $((..)) for arithmetics, e.g. i=$((i " ++ op ++ " 2))" "Use $((..)) for arithmetics, e.g. i=$((i " ++ op ++ " 2))"
@ -1460,9 +1457,8 @@ prop_checkForDecimals2 = verify checkForDecimals "foo[1.2]=bar"
prop_checkForDecimals3 = verifyNot checkForDecimals "declare -A foo; foo[1.2]=bar" prop_checkForDecimals3 = verifyNot checkForDecimals "declare -A foo; foo[1.2]=bar"
checkForDecimals params t@(TA_Expansion id _) = sequence_ $ do checkForDecimals params t@(TA_Expansion id _) = sequence_ $ do
guard $ not (hasFloatingPoint params) guard $ not (hasFloatingPoint params)
str <- getLiteralString t first:rest <- getLiteralString t
first <- str !!! 0 guard $ isDigit first && '.' `elem` rest
guard $ isDigit first && '.' `elem` str
return $ err id 2079 "(( )) doesn't support decimals. Use bc or awk." return $ err id 2079 "(( )) doesn't support decimals. Use bc or awk."
checkForDecimals _ _ = return () checkForDecimals _ _ = return ()

View File

@ -1237,8 +1237,7 @@ checkSudoArgs = CommandCheck (Basename "sudo") f
where where
f t = sequence_ $ do f t = sequence_ $ do
opts <- parseOpts $ arguments t opts <- parseOpts $ arguments t
let nonFlags = [x | ("",(x, _)) <- opts] (_,(commandArg, _)) <- find (null . fst) opts
commandArg <- nonFlags !!! 0
command <- getLiteralString commandArg command <- getLiteralString commandArg
guard $ command `elem` builtins guard $ command `elem` builtins
return $ warn (getId t) 2232 $ "Can't use sudo with builtins like " ++ command ++ ". Did you want sudo sh -c .. instead?" return $ warn (getId t) 2232 $ "Can't use sudo with builtins like " ++ command ++ ". Did you want sudo sh -c .. instead?"

View File

@ -79,9 +79,8 @@ prop_checkForDecimals3 = verifyNot checkForDecimals "declare -A foo; foo[1.2]=ba
checkForDecimals = ForShell [Sh, Dash, BusyboxSh, Bash] f checkForDecimals = ForShell [Sh, Dash, BusyboxSh, Bash] f
where where
f t@(TA_Expansion id _) = sequence_ $ do f t@(TA_Expansion id _) = sequence_ $ do
str <- getLiteralString t first:rest <- getLiteralString t
first <- str !!! 0 guard $ isDigit first && '.' `elem` rest
guard $ isDigit first && '.' `elem` str
return $ err id 2079 "(( )) doesn't support decimals. Use bc or awk." return $ err id 2079 "(( )) doesn't support decimals. Use bc or awk."
f _ = return () f _ = return ()