Add getLiteralStringDef and simplify with it

This commit is contained in:
Joseph C. Sible 2020-02-09 21:36:38 -05:00
parent f8648e5465
commit 4d92a2e15c
4 changed files with 12 additions and 8 deletions

View File

@ -176,9 +176,13 @@ willConcatInAssignment token =
getLiteralString :: Token -> Maybe String getLiteralString :: Token -> Maybe String
getLiteralString = getLiteralStringExt (const Nothing) getLiteralString = getLiteralStringExt (const Nothing)
-- Definitely get a literal string, with a given default for all non-literals
getLiteralStringDef :: String -> Token -> String
getLiteralStringDef x = runIdentity . getLiteralStringExt (const $ return x)
-- Definitely get a literal string, skipping over all non-literals -- Definitely get a literal string, skipping over all non-literals
onlyLiteralString :: Token -> String onlyLiteralString :: Token -> String
onlyLiteralString = runIdentity . getLiteralStringExt (const $ return "") onlyLiteralString = getLiteralStringDef ""
-- Maybe get a literal string, but only if it's an unquoted argument. -- Maybe get a literal string, but only if it's an unquoted argument.
getUnquotedLiteral (T_NormalWord _ list) = getUnquotedLiteral (T_NormalWord _ list) =

View File

@ -1066,7 +1066,7 @@ checkNumberComparisons params (TC_Binary id typ op lhs rhs) = do
checkStrings = checkStrings =
mapM_ stringError . take 1 . filter isNonNum mapM_ stringError . take 1 . filter isNonNum
isNonNum t = not . all numChar . runIdentity $ getLiteralStringExt (const $ return "") t isNonNum t = not . all numChar $ onlyLiteralString t
numChar x = isDigit x || x `elem` "+-. " numChar x = isDigit x || x `elem` "+-. "
stringError t = err (getId t) 2170 $ stringError t = err (getId t) 2170 $
@ -2593,7 +2593,7 @@ checkTildeInPath _ (T_SimpleCommand _ vars _) =
warn id 2147 "Literal tilde in PATH works poorly across programs." warn id 2147 "Literal tilde in PATH works poorly across programs."
checkVar _ = return () checkVar _ = return ()
hasTilde t = '~' `elem` runIdentity (getLiteralStringExt (const $ return "") t) hasTilde t = '~' `elem` onlyLiteralString t
isQuoted T_DoubleQuoted {} = True isQuoted T_DoubleQuoted {} = True
isQuoted T_SingleQuoted {} = True isQuoted T_SingleQuoted {} = True
isQuoted _ = False isQuoted _ = False

View File

@ -806,7 +806,7 @@ isVariableName (x:r) = isVariableStartChar x && all isVariableChar r
isVariableName _ = False isVariableName _ = False
getVariablesFromLiteralToken token = getVariablesFromLiteralToken token =
getVariablesFromLiteral (runIdentity $ getLiteralStringExt (const $ return " ") token) getVariablesFromLiteral (getLiteralStringDef " " token)
-- Try to get referenced variables from a literal string like "$foo" -- Try to get referenced variables from a literal string like "$foo"
-- Ignores tons of cases like arithmetic evaluation and array indices. -- Ignores tons of cases like arithmetic evaluation and array indices.

View File

@ -252,7 +252,7 @@ checkGrepRe = CommandCheck (Basename "grep") check where
skippable s = not ("--regex=" `isPrefixOf` s) && "-" `isPrefixOf` s skippable s = not ("--regex=" `isPrefixOf` s) && "-" `isPrefixOf` s
f _ [] = return () f _ [] = return ()
f cmd (x:r) = f cmd (x:r) =
let str = runIdentity $ getLiteralStringExt (const $ return "_") x let str = getLiteralStringDef "_" x
in in
if str `elem` ["--", "-e", "--regex"] if str `elem` ["--", "-e", "--regex"]
then checkRE cmd r -- Regex is *after* this then checkRE cmd r -- Regex is *after* this
@ -365,7 +365,7 @@ checkFindExecWithSingleArgument = CommandCheck (Basename "find") (f . arguments)
check (exec:arg:term:_) = do check (exec:arg:term:_) = do
execS <- getLiteralString exec execS <- getLiteralString exec
termS <- getLiteralString term termS <- getLiteralString term
let cmdS = runIdentity $ getLiteralStringExt (const $ return " ") arg let cmdS = getLiteralStringDef " " arg
guard $ execS `elem` ["-exec", "-execdir"] && termS `elem` [";", "+"] guard $ execS `elem` ["-exec", "-execdir"] && termS `elem` [";", "+"]
guard $ cmdS `matches` commandRegex guard $ cmdS `matches` commandRegex
@ -735,7 +735,7 @@ checkAliasesUsesArgs = CommandCheck (Exactly "alias") (f . arguments)
re = mkRegex "\\$\\{?[0-9*@]" re = mkRegex "\\$\\{?[0-9*@]"
f = mapM_ checkArg f = mapM_ checkArg
checkArg arg = checkArg arg =
let string = runIdentity $ getLiteralStringExt (const $ return "_") arg in let string = getLiteralStringDef "_" arg in
when ('=' `elem` string && string `matches` re) $ when ('=' `elem` string && string `matches` re) $
err (getId arg) 2142 err (getId arg) 2142
"Aliases can't use positional parameters. Use a function." "Aliases can't use positional parameters. Use a function."
@ -781,7 +781,7 @@ checkFindWithoutPath = CommandCheck (Basename "find") f
-- path. We assume that all the pre-path flags are single characters from a -- path. We assume that all the pre-path flags are single characters from a
-- list of GNU and macOS flags. -- list of GNU and macOS flags.
hasPath (first:rest) = hasPath (first:rest) =
let flag = runIdentity $ getLiteralStringExt (const $ return "___") first in let flag = getLiteralStringDef "___" first in
not ("-" `isPrefixOf` flag) || isLeadingFlag flag && hasPath rest not ("-" `isPrefixOf` flag) || isLeadingFlag flag && hasPath rest
hasPath [] = False hasPath [] = False
isLeadingFlag flag = length flag <= 2 || all (`elem` leadingFlagChars) flag isLeadingFlag flag = length flag <= 2 || all (`elem` leadingFlagChars) flag