mirror of
https://github.com/koalaman/shellcheck
synced 2025-07-15 09:33:09 -07:00
Merge branch 'bug562'
This commit is contained in:
commit
44b96fca66
4 changed files with 14 additions and 2 deletions
|
@ -111,6 +111,7 @@ data Token =
|
||||||
| T_NormalWord Id [Token]
|
| T_NormalWord Id [Token]
|
||||||
| T_OR_IF Id
|
| T_OR_IF Id
|
||||||
| T_OrIf Id (Token) (Token)
|
| T_OrIf Id (Token) (Token)
|
||||||
|
| T_ParamSubSpecialChar Id String -- e.g. '%' in ${foo%bar} or '/' in ${foo/bar/baz}
|
||||||
| T_Pipeline Id [Token] [Token] -- [Pipe separators] [Commands]
|
| T_Pipeline Id [Token] [Token] -- [Pipe separators] [Commands]
|
||||||
| T_ProcSub Id String [Token]
|
| T_ProcSub Id String [Token]
|
||||||
| T_Rbrace Id
|
| T_Rbrace Id
|
||||||
|
@ -319,6 +320,7 @@ getId t = case t of
|
||||||
T_DollarBraced id _ -> id
|
T_DollarBraced id _ -> id
|
||||||
T_DollarArithmetic id _ -> id
|
T_DollarArithmetic id _ -> id
|
||||||
T_BraceExpansion id _ -> id
|
T_BraceExpansion id _ -> id
|
||||||
|
T_ParamSubSpecialChar id _ -> id
|
||||||
T_DollarBraceCommandExpansion id _ -> id
|
T_DollarBraceCommandExpansion id _ -> id
|
||||||
T_IoFile id _ _ -> id
|
T_IoFile id _ _ -> id
|
||||||
T_IoDuplicate id _ _ -> id
|
T_IoDuplicate id _ _ -> id
|
||||||
|
|
|
@ -86,6 +86,7 @@ oversimplify token =
|
||||||
(T_Glob _ s) -> [s]
|
(T_Glob _ s) -> [s]
|
||||||
(T_Pipeline _ _ [x]) -> oversimplify x
|
(T_Pipeline _ _ [x]) -> oversimplify x
|
||||||
(T_Literal _ x) -> [x]
|
(T_Literal _ x) -> [x]
|
||||||
|
(T_ParamSubSpecialChar _ x) -> [x]
|
||||||
(T_SimpleCommand _ vars words) -> concatMap oversimplify words
|
(T_SimpleCommand _ vars words) -> concatMap oversimplify words
|
||||||
(T_Redirecting _ _ foo) -> oversimplify foo
|
(T_Redirecting _ _ foo) -> oversimplify foo
|
||||||
(T_DollarSingleQuoted _ s) -> [s]
|
(T_DollarSingleQuoted _ s) -> [s]
|
||||||
|
@ -188,6 +189,7 @@ getLiteralStringExt more = g
|
||||||
g (TA_Expansion _ l) = allInList l
|
g (TA_Expansion _ l) = allInList l
|
||||||
g (T_SingleQuoted _ s) = return s
|
g (T_SingleQuoted _ s) = return s
|
||||||
g (T_Literal _ s) = return s
|
g (T_Literal _ s) = return s
|
||||||
|
g (T_ParamSubSpecialChar _ s) = return s
|
||||||
g x = more x
|
g x = more x
|
||||||
|
|
||||||
-- Is this token a string literal?
|
-- Is this token a string literal?
|
||||||
|
|
|
@ -1324,6 +1324,7 @@ prop_checkInexplicablyUnquoted3 = verifyNot checkInexplicablyUnquoted "wget --us
|
||||||
prop_checkInexplicablyUnquoted4 = verify checkInexplicablyUnquoted "echo \"VALUES (\"id\")\""
|
prop_checkInexplicablyUnquoted4 = verify checkInexplicablyUnquoted "echo \"VALUES (\"id\")\""
|
||||||
prop_checkInexplicablyUnquoted5 = verifyNot checkInexplicablyUnquoted "\"$dir\"/\"$file\""
|
prop_checkInexplicablyUnquoted5 = verifyNot checkInexplicablyUnquoted "\"$dir\"/\"$file\""
|
||||||
prop_checkInexplicablyUnquoted6 = verifyNot checkInexplicablyUnquoted "\"$dir\"some_stuff\"$file\""
|
prop_checkInexplicablyUnquoted6 = verifyNot checkInexplicablyUnquoted "\"$dir\"some_stuff\"$file\""
|
||||||
|
prop_checkInexplicablyUnquoted7 = verifyNot checkInexplicablyUnquoted "${dir/\"foo\"/\"bar\"}"
|
||||||
checkInexplicablyUnquoted _ (T_NormalWord id tokens) = mapM_ check (tails tokens)
|
checkInexplicablyUnquoted _ (T_NormalWord id tokens) = mapM_ check (tails tokens)
|
||||||
where
|
where
|
||||||
check (T_SingleQuoted _ _:T_Literal id str:_)
|
check (T_SingleQuoted _ _:T_Literal id str:_)
|
||||||
|
@ -1352,7 +1353,7 @@ checkInexplicablyUnquoted _ (T_NormalWord id tokens) = mapM_ check (tails tokens
|
||||||
warnAboutExpansion id =
|
warnAboutExpansion id =
|
||||||
warn id 2027 "The surrounding quotes actually unquote this. Remove or escape them."
|
warn id 2027 "The surrounding quotes actually unquote this. Remove or escape them."
|
||||||
warnAboutLiteral id =
|
warnAboutLiteral id =
|
||||||
warn id 2140 "Word is on the form \"A\"B\"C\" (B indicated). Did you mean \"ABC\" or \"A\\\"B\\\"C\"?"
|
warn id 2140 "Word is of the form \"A\"B\"C\" (B indicated). Did you mean \"ABC\" or \"A\\\"B\\\"C\"?"
|
||||||
checkInexplicablyUnquoted _ _ = return ()
|
checkInexplicablyUnquoted _ _ = return ()
|
||||||
|
|
||||||
prop_checkTildeInQuotes1 = verify checkTildeInQuotes "var=\"~/out.txt\""
|
prop_checkTildeInQuotes1 = verify checkTildeInQuotes "var=\"~/out.txt\""
|
||||||
|
|
|
@ -64,6 +64,7 @@ variableStart = upper <|> lower <|> oneOf "_"
|
||||||
variableChars = upper <|> lower <|> digit <|> oneOf "_"
|
variableChars = upper <|> lower <|> digit <|> oneOf "_"
|
||||||
functionChars = variableChars <|> oneOf ":+-.?"
|
functionChars = variableChars <|> oneOf ":+-.?"
|
||||||
specialVariable = oneOf "@*#?-$!"
|
specialVariable = oneOf "@*#?-$!"
|
||||||
|
paramSubSpecialChars = oneOf "/:+-=%"
|
||||||
quotableChars = "|&;<>()\\ '\t\n\r\xA0" ++ doubleQuotableChars
|
quotableChars = "|&;<>()\\ '\t\n\r\xA0" ++ doubleQuotableChars
|
||||||
quotable = almostSpace <|> unicodeDoubleQuote <|> oneOf quotableChars
|
quotable = almostSpace <|> unicodeDoubleQuote <|> oneOf quotableChars
|
||||||
bracedQuotable = oneOf "}\"$`'"
|
bracedQuotable = oneOf "}\"$`'"
|
||||||
|
@ -1003,13 +1004,19 @@ readDollarBracedWord = do
|
||||||
list <- many readDollarBracedPart
|
list <- many readDollarBracedPart
|
||||||
return $ T_NormalWord id list
|
return $ T_NormalWord id list
|
||||||
|
|
||||||
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|> readExtglob <|> readNormalDollar <|> readUnquotedBackTicked <|> readDollarBracedLiteral
|
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|>
|
||||||
|
readParamSubSpecialChar <|> readExtglob <|> readNormalDollar <|>
|
||||||
|
readUnquotedBackTicked <|> readDollarBracedLiteral
|
||||||
|
|
||||||
readDollarBracedLiteral = do
|
readDollarBracedLiteral = do
|
||||||
id <- getNextId
|
id <- getNextId
|
||||||
vars <- (readBraceEscaped <|> (anyChar >>= \x -> return [x])) `reluctantlyTill1` bracedQuotable
|
vars <- (readBraceEscaped <|> (anyChar >>= \x -> return [x])) `reluctantlyTill1` bracedQuotable
|
||||||
return $ T_Literal id $ concat vars
|
return $ T_Literal id $ concat vars
|
||||||
|
|
||||||
|
readParamSubSpecialChar = do
|
||||||
|
id <- getNextId
|
||||||
|
T_ParamSubSpecialChar id <$> many1 paramSubSpecialChars
|
||||||
|
|
||||||
prop_readProcSub1 = isOk readProcSub "<(echo test | wc -l)"
|
prop_readProcSub1 = isOk readProcSub "<(echo test | wc -l)"
|
||||||
prop_readProcSub2 = isOk readProcSub "<( if true; then true; fi )"
|
prop_readProcSub2 = isOk readProcSub "<( if true; then true; fi )"
|
||||||
prop_readProcSub3 = isOk readProcSub "<( # nothing here \n)"
|
prop_readProcSub3 = isOk readProcSub "<( # nothing here \n)"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue