Skip to content

Commit

Permalink
Use NonEmpty to remove partiality from handleCommand
Browse files Browse the repository at this point in the history
  • Loading branch information
josephcsible committed Dec 19, 2023
1 parent 208e383 commit 0c46b8b
Showing 1 changed file with 21 additions and 20 deletions.
41 changes: 21 additions & 20 deletions src/ShellCheck/CFG.hs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import Control.Monad.Identity
import Data.Array.Unboxed
import Data.Array.ST
import Data.List hiding (map)
import qualified Data.List.NonEmpty as NE
import Data.Maybe
import qualified Data.Map as M
import qualified Data.Set as S
Expand Down Expand Up @@ -857,8 +858,8 @@ build t = do
status <- newNodeRange (CFSetExitCode id)
linkRange assignments status

T_SimpleCommand id vars list@(cmd:_) ->
handleCommand t vars list $ getUnquotedLiteral cmd
T_SimpleCommand id vars (cmd:args) ->
handleCommand t vars (cmd NE.:| args) $ getUnquotedLiteral cmd

T_SingleQuoted _ _ -> none

Expand Down Expand Up @@ -925,8 +926,8 @@ handleCommand cmd vars args literalCmd = do
-- TODO: Handle assignments in declaring commands

case literalCmd of
Just "exit" -> regularExpansion vars args $ handleExit
Just "return" -> regularExpansion vars args $ handleReturn
Just "exit" -> regularExpansion vars (NE.toList args) $ handleExit
Just "return" -> regularExpansion vars (NE.toList args) $ handleReturn
Just "unset" -> regularExpansionWithStatus vars args $ handleUnset args

Just "declare" -> handleDeclare args
Expand All @@ -949,14 +950,14 @@ handleCommand cmd vars args literalCmd = do
-- This will mostly behave like 'command' but ok
Just "builtin" ->
case args of
[_] -> regular
(_:newargs@(newcmd:_)) ->
handleCommand newcmd vars newargs $ getLiteralString newcmd
_ NE.:| [] -> regular
(_ NE.:| newcmd:newargs) ->
handleCommand newcmd vars (newcmd NE.:| newargs) $ getLiteralString newcmd
Just "command" ->
case args of
[_] -> regular
(_:newargs@(newcmd:_)) ->
handleOthers (getId newcmd) vars newargs $ getLiteralString newcmd
_ NE.:| [] -> regular
(_ NE.:| newcmd:newargs) ->
handleOthers (getId newcmd) vars (newcmd NE.:| newargs) $ getLiteralString newcmd
_ -> regular

where
Expand Down Expand Up @@ -984,7 +985,7 @@ handleCommand cmd vars args literalCmd = do
unreachable <- newNode CFUnreachable
return $ Range ret unreachable

handleUnset (cmd:args) = do
handleUnset (cmd NE.:| args) = do
case () of
_ | "n" `elem` flagNames -> unsetWith CFUndefineNameref
_ | "v" `elem` flagNames -> unsetWith CFUndefineVariable
Expand All @@ -1003,7 +1004,7 @@ handleCommand cmd vars args literalCmd = do

variableAssignRegex = mkRegex "^([_a-zA-Z][_a-zA-Z0-9]*)="

handleDeclare (cmd:args) = do
handleDeclare (cmd NE.:| args) = do
isFunc <- asks cfIsFunction
-- This is a bit of a kludge: we don't have great support for things like
-- 'declare -i x=$x' so do one round with declare x=$x, followed by declare -i x
Expand Down Expand Up @@ -1092,7 +1093,7 @@ handleCommand cmd vars args literalCmd = do
in
concatMap (drop 1) plusses

handlePrintf (cmd:args) =
handlePrintf (cmd NE.:| args) =
newNodeRange $ CFApplyEffects $ maybeToList findVar
where
findVar = do
Expand All @@ -1101,7 +1102,7 @@ handleCommand cmd vars args literalCmd = do
name <- getLiteralString arg
return $ IdTagged (getId arg) $ CFWriteVariable name CFValueString

handleWait (cmd:args) =
handleWait (cmd NE.:| args) =
newNodeRange $ CFApplyEffects $ maybeToList findVar
where
findVar = do
Expand All @@ -1110,7 +1111,7 @@ handleCommand cmd vars args literalCmd = do
name <- getLiteralString arg
return $ IdTagged (getId arg) $ CFWriteVariable name CFValueInteger

handleMapfile (cmd:args) =
handleMapfile (cmd NE.:| args) =
newNodeRange $ CFApplyEffects [findVar]
where
findVar =
Expand All @@ -1130,7 +1131,7 @@ handleCommand cmd vars args literalCmd = do
guard $ isVariableName name
return (getId c, name)

handleRead (cmd:args) = newNodeRange $ CFApplyEffects main
handleRead (cmd NE.:| args) = newNodeRange $ CFApplyEffects main
where
main = fromMaybe fallback $ do
flags <- getGnuOpts flagsForRead args
Expand Down Expand Up @@ -1160,7 +1161,7 @@ handleCommand cmd vars args literalCmd = do
in
map (\(id, name) -> IdTagged id $ CFWriteVariable name value) namesOrDefault

handleDEFINE (cmd:args) =
handleDEFINE (cmd NE.:| args) =
newNodeRange $ CFApplyEffects $ maybeToList findVar
where
findVar = do
Expand All @@ -1170,7 +1171,7 @@ handleCommand cmd vars args literalCmd = do
return $ IdTagged (getId name) $ CFWriteVariable str CFValueString

handleOthers id vars args cmd =
regularExpansion vars args $ do
regularExpansion vars (NE.toList args) $ do
exe <- newNodeRange $ CFExecuteCommand cmd
status <- newNodeRange $ CFSetExitCode id
linkRange exe status
Expand All @@ -1189,8 +1190,8 @@ handleCommand cmd vars args literalCmd = do

linkRanges $ [args] ++ assignments ++ [exe] ++ dropAssignments

regularExpansionWithStatus vars args@(cmd:_) p = do
initial <- regularExpansion vars args p
regularExpansionWithStatus vars args@(cmd NE.:| _) p = do
initial <- regularExpansion vars (NE.toList args) p
status <- newNodeRange $ CFSetExitCode (getId cmd)
linkRange initial status

Expand Down

0 comments on commit 0c46b8b

Please sign in to comment.