Read any -* as binary/unary op, and warn on unknown.

This commit is contained in:
Vidar Holen 2012-12-02 14:50:31 -08:00
parent 35b8d58c3e
commit d3a4c9852f
2 changed files with 34 additions and 15 deletions

View File

@ -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 =

View File

@ -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
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,16 +237,16 @@ 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"
])
hardCondSpacing
return op
where tryOp s = try $ do
id <- getNextId
string s
s <- readOp
hardCondSpacing
return $ TC_Unary id typ s
readOp = try $ do
char '-'
s <- many1 letter
return ('-':s)
readCondWord = do
notFollowedBy2 (try (spacing >> (string "]")))
x <- readNormalWord