Don't warn about [ -v foo ] being unassigned.
This commit is contained in:
parent
da1691912b
commit
41b6e3d5eb
|
@ -1795,6 +1795,7 @@ prop_checkUnused32= verifyTree checkUnusedAssignments "let a=b=c; echo $a"
|
||||||
prop_checkUnused33= verifyNotTree checkUnusedAssignments "a=foo; [[ foo =~ ^{$a}$ ]]"
|
prop_checkUnused33= verifyNotTree checkUnusedAssignments "a=foo; [[ foo =~ ^{$a}$ ]]"
|
||||||
prop_checkUnused34= verifyNotTree checkUnusedAssignments "foo=1; (( t = foo )); echo $t"
|
prop_checkUnused34= verifyNotTree checkUnusedAssignments "foo=1; (( t = foo )); echo $t"
|
||||||
prop_checkUnused35= verifyNotTree checkUnusedAssignments "a=foo; b=2; echo ${a:b}"
|
prop_checkUnused35= verifyNotTree checkUnusedAssignments "a=foo; b=2; echo ${a:b}"
|
||||||
|
prop_checkUnused36= verifyNotTree checkUnusedAssignments "if [[ -v foo ]]; then true; fi"
|
||||||
checkUnusedAssignments params t = execWriter (mapM_ warnFor unused)
|
checkUnusedAssignments params t = execWriter (mapM_ warnFor unused)
|
||||||
where
|
where
|
||||||
flow = variableFlow params
|
flow = variableFlow params
|
||||||
|
@ -1845,6 +1846,10 @@ prop_checkUnassignedReferences25= verifyNotTree checkUnassignedReferences "decla
|
||||||
prop_checkUnassignedReferences26= verifyNotTree checkUnassignedReferences "a::b() { foo; }; readonly -f a::b"
|
prop_checkUnassignedReferences26= verifyNotTree checkUnassignedReferences "a::b() { foo; }; readonly -f a::b"
|
||||||
prop_checkUnassignedReferences27= verifyNotTree checkUnassignedReferences ": ${foo:=bar}"
|
prop_checkUnassignedReferences27= verifyNotTree checkUnassignedReferences ": ${foo:=bar}"
|
||||||
prop_checkUnassignedReferences28= verifyNotTree checkUnassignedReferences "#!/bin/ksh\necho \"${.sh.version}\"\n"
|
prop_checkUnassignedReferences28= verifyNotTree checkUnassignedReferences "#!/bin/ksh\necho \"${.sh.version}\"\n"
|
||||||
|
prop_checkUnassignedReferences29= verifyNotTree checkUnassignedReferences "if [[ -v foo ]]; then echo $foo; fi"
|
||||||
|
prop_checkUnassignedReferences30= verifyNotTree checkUnassignedReferences "if [[ -v foo[3] ]]; then echo ${foo[3]}; fi"
|
||||||
|
prop_checkUnassignedReferences31= verifyNotTree checkUnassignedReferences "X=1; if [[ -v foo[$X+42] ]]; then echo ${foo[$X+42]}; fi"
|
||||||
|
prop_checkUnassignedReferences32= verifyNotTree checkUnassignedReferences "if [[ -v \"foo[1]\" ]]; then echo ${foo[@]}; fi"
|
||||||
checkUnassignedReferences params t = warnings
|
checkUnassignedReferences params t = warnings
|
||||||
where
|
where
|
||||||
(readMap, writeMap) = execState (mapM tally $ variableFlow params) (Map.empty, Map.empty)
|
(readMap, writeMap) = execState (mapM tally $ variableFlow params) (Map.empty, Map.empty)
|
||||||
|
@ -2415,10 +2420,17 @@ prop_checkTestArgumentSplitting12 = verify checkTestArgumentSplitting "[ *.png ]
|
||||||
prop_checkTestArgumentSplitting13 = verify checkTestArgumentSplitting "[ \"$@\" == \"\" ]"
|
prop_checkTestArgumentSplitting13 = verify checkTestArgumentSplitting "[ \"$@\" == \"\" ]"
|
||||||
prop_checkTestArgumentSplitting14 = verify checkTestArgumentSplitting "[[ \"$@\" == \"\" ]]"
|
prop_checkTestArgumentSplitting14 = verify checkTestArgumentSplitting "[[ \"$@\" == \"\" ]]"
|
||||||
prop_checkTestArgumentSplitting15 = verifyNot checkTestArgumentSplitting "[[ \"$*\" == \"\" ]]"
|
prop_checkTestArgumentSplitting15 = verifyNot checkTestArgumentSplitting "[[ \"$*\" == \"\" ]]"
|
||||||
|
prop_checkTestArgumentSplitting16 = verifyNot checkTestArgumentSplitting "[[ -v foo[123] ]]"
|
||||||
checkTestArgumentSplitting :: Parameters -> Token -> Writer [TokenComment] ()
|
checkTestArgumentSplitting :: Parameters -> Token -> Writer [TokenComment] ()
|
||||||
checkTestArgumentSplitting _ t =
|
checkTestArgumentSplitting _ t =
|
||||||
case t of
|
case t of
|
||||||
(TC_Unary _ _ op token) | isGlob token ->
|
(TC_Unary _ typ op token) | isGlob token ->
|
||||||
|
if op == "-v"
|
||||||
|
then
|
||||||
|
when (typ == SingleBracket) $
|
||||||
|
err (getId token) 2208 $
|
||||||
|
"Use [[ ]] or quote arguments to -v to avoid glob expansion."
|
||||||
|
else
|
||||||
err (getId token) 2144 $
|
err (getId token) 2144 $
|
||||||
op ++ " doesn't work with globs. Use a for loop."
|
op ++ " doesn't work with globs. Use a for loop."
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,12 @@ data StackData =
|
||||||
data DataType = DataString DataSource | DataArray DataSource
|
data DataType = DataString DataSource | DataArray DataSource
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
data DataSource = SourceFrom [Token] | SourceExternal | SourceDeclaration | SourceInteger
|
data DataSource =
|
||||||
|
SourceFrom [Token]
|
||||||
|
| SourceExternal
|
||||||
|
| SourceDeclaration
|
||||||
|
| SourceInteger
|
||||||
|
| SourceChecked
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
data VariableState = Dead Token String | Alive deriving (Show)
|
data VariableState = Dead Token String | Alive deriving (Show)
|
||||||
|
@ -388,6 +393,18 @@ getModifiedVariables t =
|
||||||
name <- getLiteralString lhs
|
name <- getLiteralString lhs
|
||||||
return (t, t, name, DataString $ SourceFrom [rhs])
|
return (t, t, name, DataString $ SourceFrom [rhs])
|
||||||
|
|
||||||
|
-- Count [[ -v foo ]] as an "assignment".
|
||||||
|
-- This is to prevent [ -v foo ] being unassigned or unused.
|
||||||
|
TC_Unary id _ "-v" token -> maybeToList $ do
|
||||||
|
str <- fmap (takeWhile (/= '[')) $ -- Quoted index
|
||||||
|
flip getLiteralStringExt token $ \x ->
|
||||||
|
case x of
|
||||||
|
T_Glob _ s -> return s -- Unquoted index
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
|
guard . not . null $ str
|
||||||
|
return (t, token, str, DataString $ SourceChecked)
|
||||||
|
|
||||||
T_DollarBraced _ l -> maybeToList $ do
|
T_DollarBraced _ l -> maybeToList $ do
|
||||||
let string = bracedString t
|
let string = bracedString t
|
||||||
let modifier = getBracedModifier string
|
let modifier = getBracedModifier string
|
||||||
|
@ -584,8 +601,10 @@ getReferencedVariables parents t =
|
||||||
getVariablesFromLiteralToken word
|
getVariablesFromLiteralToken word
|
||||||
else []
|
else []
|
||||||
|
|
||||||
literalizer TA_Index {} = return "" -- x[0] becomes a reference of x
|
literalizer t = case t of
|
||||||
literalizer _ = Nothing
|
TA_Index {} -> return "" -- x[0] becomes a reference of x
|
||||||
|
T_Glob _ s -> return s -- Also when parsed as globs
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
getIfReference context token = maybeToList $ do
|
getIfReference context token = maybeToList $ do
|
||||||
str <- getLiteralStringExt literalizer token
|
str <- getLiteralStringExt literalizer token
|
||||||
|
|
Loading…
Reference in New Issue