From aaffe381987cd253ae8dac4b77af08fca2d7982d Mon Sep 17 00:00:00 2001 From: "Joseph C. Sible" Date: Sat, 8 Feb 2020 23:06:57 -0500 Subject: [PATCH] Use the Identity monad to avoid unnecessary uses of fromJust --- src/ShellCheck/ASTLib.hs | 5 +++-- src/ShellCheck/AnalyzerLib.hs | 2 +- src/ShellCheck/Checks/Commands.hs | 7 ++++--- src/ShellCheck/Checks/ShellSupport.hs | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/ShellCheck/ASTLib.hs b/src/ShellCheck/ASTLib.hs index 03a2f9a..658ed64 100644 --- a/src/ShellCheck/ASTLib.hs +++ b/src/ShellCheck/ASTLib.hs @@ -25,6 +25,7 @@ import Control.Monad.Writer import Control.Monad import Data.Char import Data.Functor +import Data.Functor.Identity import Data.List import Data.Maybe @@ -177,7 +178,7 @@ getLiteralString = getLiteralStringExt (const Nothing) -- Definitely get a literal string, skipping over all non-literals onlyLiteralString :: Token -> String -onlyLiteralString = fromJust . getLiteralStringExt (const $ return "") +onlyLiteralString = runIdentity . getLiteralStringExt (const $ return "") -- Maybe get a literal string, but only if it's an unquoted argument. getUnquotedLiteral (T_NormalWord _ list) = @@ -216,7 +217,7 @@ getGlobOrLiteralString = getLiteralStringExt f -- Maybe get the literal value of a token, using a custom function -- to map unrecognized Tokens into strings. -getLiteralStringExt :: (Token -> Maybe String) -> Token -> Maybe String +getLiteralStringExt :: Monad m => (Token -> m String) -> Token -> m String getLiteralStringExt more = g where allInList = fmap concat . mapM g diff --git a/src/ShellCheck/AnalyzerLib.hs b/src/ShellCheck/AnalyzerLib.hs index e4640e7..0da80e3 100644 --- a/src/ShellCheck/AnalyzerLib.hs +++ b/src/ShellCheck/AnalyzerLib.hs @@ -806,7 +806,7 @@ isVariableName (x:r) = isVariableStartChar x && all isVariableChar r isVariableName _ = False getVariablesFromLiteralToken token = - getVariablesFromLiteral (fromJust $ getLiteralStringExt (const $ return " ") token) + getVariablesFromLiteral (runIdentity $ getLiteralStringExt (const $ return " ") token) -- Try to get referenced variables from a literal string like "$foo" -- Ignores tons of cases like arithmetic evaluation and array indices. diff --git a/src/ShellCheck/Checks/Commands.hs b/src/ShellCheck/Checks/Commands.hs index 299a335..869b389 100644 --- a/src/ShellCheck/Checks/Commands.hs +++ b/src/ShellCheck/Checks/Commands.hs @@ -34,6 +34,7 @@ import ShellCheck.Regex import Control.Monad import Control.Monad.RWS import Data.Char +import Data.Functor.Identity import Data.List import Data.Maybe import qualified Data.Map.Strict as Map @@ -348,7 +349,7 @@ returnOrExit multi invalid = (f . arguments) isInvalid s = null s || any (not . isDigit) s || length s > 5 || let value = (read s :: Integer) in value > 255 - literal token = fromJust $ getLiteralStringExt lit token + literal token = runIdentity $ getLiteralStringExt lit token lit (T_DollarBraced {}) = return "0" lit (T_DollarArithmetic {}) = return "0" lit (T_DollarExpansion {}) = return "0" @@ -735,7 +736,7 @@ checkAliasesUsesArgs = CommandCheck (Exactly "alias") (f . arguments) re = mkRegex "\\$\\{?[0-9*@]" f = mapM_ checkArg checkArg arg = - let string = fromJust $ getLiteralStringExt (const $ return "_") arg in + let string = runIdentity $ getLiteralStringExt (const $ return "_") arg in when ('=' `elem` string && string `matches` re) $ err (getId arg) 2142 "Aliases can't use positional parameters. Use a function." @@ -781,7 +782,7 @@ checkFindWithoutPath = CommandCheck (Basename "find") f -- path. We assume that all the pre-path flags are single characters from a -- list of GNU and macOS flags. hasPath (first:rest) = - let flag = fromJust $ getLiteralStringExt (const $ return "___") first in + let flag = runIdentity $ getLiteralStringExt (const $ return "___") first in not ("-" `isPrefixOf` flag) || isLeadingFlag flag && hasPath rest hasPath [] = False isLeadingFlag flag = length flag <= 2 || all (`elem` leadingFlagChars) flag diff --git a/src/ShellCheck/Checks/ShellSupport.hs b/src/ShellCheck/Checks/ShellSupport.hs index b643525..d9ae1cf 100644 --- a/src/ShellCheck/Checks/ShellSupport.hs +++ b/src/ShellCheck/Checks/ShellSupport.hs @@ -30,6 +30,7 @@ import ShellCheck.Regex import Control.Monad import Control.Monad.RWS import Data.Char +import Data.Functor.Identity import Data.List import Data.Maybe import qualified Data.Map as Map @@ -488,7 +489,7 @@ checkBraceExpansionVars = ForShell [Bash] f T_DollarExpansion {} -> return "$" T_DollarArithmetic {} -> return "$" _ -> return "-" - toString t = fromJust $ getLiteralStringExt literalExt t + toString t = runIdentity $ getLiteralStringExt literalExt t isEvaled t = do cmd <- getClosestCommandM t return $ maybe False (`isUnqualifiedCommand` "eval") cmd