Read any -* as binary/unary op, and warn on unknown.
This commit is contained in:
parent
35b8d58c3e
commit
d3a4c9852f
|
@ -75,6 +75,7 @@ basicChecks = [
|
|||
,checkQuotedCondRegex
|
||||
,checkForInCat
|
||||
,checkFindExec
|
||||
,checkValidCondOps
|
||||
]
|
||||
|
||||
modifyMap = modify
|
||||
|
@ -514,6 +515,18 @@ checkDollarArithmeticCommand _ = return ()
|
|||
|
||||
allModifiedVariables t = snd $ runState (doAnalysis (\x -> modify $ (++) (getModifiedVariables x)) t) []
|
||||
|
||||
prop_checkValidCondOps1 = verify checkValidCondOps "[[ a -xz b ]]"
|
||||
prop_checkValidCondOps2 = verify checkValidCondOps "[ -M a ]"
|
||||
prop_checkValidCondOps3 = verifyNot checkValidCondOps "[ 1 = 2 -a 3 -ge 4 ]"
|
||||
prop_checkValidCondOps4 = verifyNot checkValidCondOps "[[ ! -v foo ]]"
|
||||
checkValidCondOps (TC_Binary id _ s _ _)
|
||||
| not (s `elem` ["-nt", "-ot", "-ef", "==", "!=", "<=", ">=", "-eq", "-ne", "-lt", "-le", "-gt", "-ge", "=~", ">", "<", "="]) =
|
||||
warn id "Unknown binary operator."
|
||||
checkValidCondOps (TC_Unary id _ s _)
|
||||
| not (s `elem` [ "!", "-a", "-b", "-c", "-d", "-e", "-f", "-g", "-h", "-L", "-k", "-p", "-r", "-s", "-S", "-t", "-u", "-w", "-x", "-O", "-G", "-N", "-z", "-n", "-o", "-v", "-R"]) =
|
||||
warn id "Unknown unary operator."
|
||||
checkValidCondOps _ = return ()
|
||||
|
||||
--- Context seeking
|
||||
|
||||
getParentTree t =
|
||||
|
|
|
@ -212,13 +212,19 @@ readConditionContents single = do
|
|||
where
|
||||
typ = if single then SingleBracket else DoubleBracket
|
||||
readCondBinaryOp = try $ do
|
||||
op <- choice $ (map tryOp ["-nt", "-ot", "-ef", "==", "!=", "<=", ">=", "-eq", "-ne", "-lt", "-le", "-gt", "-ge", "=~", ">", "<", "="])
|
||||
id <- getNextId
|
||||
op <- (choice $ (map tryOp ["==", "!=", "<=", ">=", "=~", ">", "<", "="])) <|> otherOp
|
||||
hardCondSpacing
|
||||
return op
|
||||
where tryOp s = try $ do
|
||||
id <- getNextId
|
||||
string s
|
||||
return $ TC_Binary id typ s
|
||||
where
|
||||
tryOp s = try $ do
|
||||
id <- getNextId
|
||||
string s
|
||||
return $ TC_Binary id typ s
|
||||
otherOp = try $ do
|
||||
id <- getNextId
|
||||
s <- readOp
|
||||
return $ TC_Binary id typ s
|
||||
|
||||
readCondUnaryExp = do
|
||||
op <- readCondUnaryOp
|
||||
|
@ -231,15 +237,15 @@ readConditionContents single = do
|
|||
fail "oops")
|
||||
|
||||
readCondUnaryOp = try $ do
|
||||
op <- choice $ (map tryOp [ "-a", "-b", "-c", "-d", "-e", "-f", "-g", "-h", "-L", "-k", "-p", "-r", "-s", "-S", "-t", "-u", "-w", "-x", "-O", "-G", "-N",
|
||||
"-z", "-n", "-o", "-v", "-R"
|
||||
])
|
||||
id <- getNextId
|
||||
s <- readOp
|
||||
hardCondSpacing
|
||||
return op
|
||||
where tryOp s = try $ do
|
||||
id <- getNextId
|
||||
string s
|
||||
return $ TC_Unary id typ s
|
||||
return $ TC_Unary id typ s
|
||||
|
||||
readOp = try $ do
|
||||
char '-'
|
||||
s <- many1 letter
|
||||
return ('-':s)
|
||||
|
||||
readCondWord = do
|
||||
notFollowedBy2 (try (spacing >> (string "]")))
|
||||
|
|
Loading…
Reference in New Issue