Use NonEmpty to remove partiality from handleCommand
This commit is contained in:
parent
208e38358e
commit
0c46b8b2d5
|
@ -51,6 +51,7 @@ import Control.Monad.Identity
|
||||||
import Data.Array.Unboxed
|
import Data.Array.Unboxed
|
||||||
import Data.Array.ST
|
import Data.Array.ST
|
||||||
import Data.List hiding (map)
|
import Data.List hiding (map)
|
||||||
|
import qualified Data.List.NonEmpty as NE
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
|
@ -857,8 +858,8 @@ build t = do
|
||||||
status <- newNodeRange (CFSetExitCode id)
|
status <- newNodeRange (CFSetExitCode id)
|
||||||
linkRange assignments status
|
linkRange assignments status
|
||||||
|
|
||||||
T_SimpleCommand id vars list@(cmd:_) ->
|
T_SimpleCommand id vars (cmd:args) ->
|
||||||
handleCommand t vars list $ getUnquotedLiteral cmd
|
handleCommand t vars (cmd NE.:| args) $ getUnquotedLiteral cmd
|
||||||
|
|
||||||
T_SingleQuoted _ _ -> none
|
T_SingleQuoted _ _ -> none
|
||||||
|
|
||||||
|
@ -925,8 +926,8 @@ handleCommand cmd vars args literalCmd = do
|
||||||
-- TODO: Handle assignments in declaring commands
|
-- TODO: Handle assignments in declaring commands
|
||||||
|
|
||||||
case literalCmd of
|
case literalCmd of
|
||||||
Just "exit" -> regularExpansion vars args $ handleExit
|
Just "exit" -> regularExpansion vars (NE.toList args) $ handleExit
|
||||||
Just "return" -> regularExpansion vars args $ handleReturn
|
Just "return" -> regularExpansion vars (NE.toList args) $ handleReturn
|
||||||
Just "unset" -> regularExpansionWithStatus vars args $ handleUnset args
|
Just "unset" -> regularExpansionWithStatus vars args $ handleUnset args
|
||||||
|
|
||||||
Just "declare" -> handleDeclare args
|
Just "declare" -> handleDeclare args
|
||||||
|
@ -949,14 +950,14 @@ handleCommand cmd vars args literalCmd = do
|
||||||
-- This will mostly behave like 'command' but ok
|
-- This will mostly behave like 'command' but ok
|
||||||
Just "builtin" ->
|
Just "builtin" ->
|
||||||
case args of
|
case args of
|
||||||
[_] -> regular
|
_ NE.:| [] -> regular
|
||||||
(_:newargs@(newcmd:_)) ->
|
(_ NE.:| newcmd:newargs) ->
|
||||||
handleCommand newcmd vars newargs $ getLiteralString newcmd
|
handleCommand newcmd vars (newcmd NE.:| newargs) $ getLiteralString newcmd
|
||||||
Just "command" ->
|
Just "command" ->
|
||||||
case args of
|
case args of
|
||||||
[_] -> regular
|
_ NE.:| [] -> regular
|
||||||
(_:newargs@(newcmd:_)) ->
|
(_ NE.:| newcmd:newargs) ->
|
||||||
handleOthers (getId newcmd) vars newargs $ getLiteralString newcmd
|
handleOthers (getId newcmd) vars (newcmd NE.:| newargs) $ getLiteralString newcmd
|
||||||
_ -> regular
|
_ -> regular
|
||||||
|
|
||||||
where
|
where
|
||||||
|
@ -984,7 +985,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
unreachable <- newNode CFUnreachable
|
unreachable <- newNode CFUnreachable
|
||||||
return $ Range ret unreachable
|
return $ Range ret unreachable
|
||||||
|
|
||||||
handleUnset (cmd:args) = do
|
handleUnset (cmd NE.:| args) = do
|
||||||
case () of
|
case () of
|
||||||
_ | "n" `elem` flagNames -> unsetWith CFUndefineNameref
|
_ | "n" `elem` flagNames -> unsetWith CFUndefineNameref
|
||||||
_ | "v" `elem` flagNames -> unsetWith CFUndefineVariable
|
_ | "v" `elem` flagNames -> unsetWith CFUndefineVariable
|
||||||
|
@ -1003,7 +1004,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
|
|
||||||
variableAssignRegex = mkRegex "^([_a-zA-Z][_a-zA-Z0-9]*)="
|
variableAssignRegex = mkRegex "^([_a-zA-Z][_a-zA-Z0-9]*)="
|
||||||
|
|
||||||
handleDeclare (cmd:args) = do
|
handleDeclare (cmd NE.:| args) = do
|
||||||
isFunc <- asks cfIsFunction
|
isFunc <- asks cfIsFunction
|
||||||
-- This is a bit of a kludge: we don't have great support for things like
|
-- 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
|
-- 'declare -i x=$x' so do one round with declare x=$x, followed by declare -i x
|
||||||
|
@ -1092,7 +1093,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
in
|
in
|
||||||
concatMap (drop 1) plusses
|
concatMap (drop 1) plusses
|
||||||
|
|
||||||
handlePrintf (cmd:args) =
|
handlePrintf (cmd NE.:| args) =
|
||||||
newNodeRange $ CFApplyEffects $ maybeToList findVar
|
newNodeRange $ CFApplyEffects $ maybeToList findVar
|
||||||
where
|
where
|
||||||
findVar = do
|
findVar = do
|
||||||
|
@ -1101,7 +1102,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
name <- getLiteralString arg
|
name <- getLiteralString arg
|
||||||
return $ IdTagged (getId arg) $ CFWriteVariable name CFValueString
|
return $ IdTagged (getId arg) $ CFWriteVariable name CFValueString
|
||||||
|
|
||||||
handleWait (cmd:args) =
|
handleWait (cmd NE.:| args) =
|
||||||
newNodeRange $ CFApplyEffects $ maybeToList findVar
|
newNodeRange $ CFApplyEffects $ maybeToList findVar
|
||||||
where
|
where
|
||||||
findVar = do
|
findVar = do
|
||||||
|
@ -1110,7 +1111,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
name <- getLiteralString arg
|
name <- getLiteralString arg
|
||||||
return $ IdTagged (getId arg) $ CFWriteVariable name CFValueInteger
|
return $ IdTagged (getId arg) $ CFWriteVariable name CFValueInteger
|
||||||
|
|
||||||
handleMapfile (cmd:args) =
|
handleMapfile (cmd NE.:| args) =
|
||||||
newNodeRange $ CFApplyEffects [findVar]
|
newNodeRange $ CFApplyEffects [findVar]
|
||||||
where
|
where
|
||||||
findVar =
|
findVar =
|
||||||
|
@ -1130,7 +1131,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
guard $ isVariableName name
|
guard $ isVariableName name
|
||||||
return (getId c, name)
|
return (getId c, name)
|
||||||
|
|
||||||
handleRead (cmd:args) = newNodeRange $ CFApplyEffects main
|
handleRead (cmd NE.:| args) = newNodeRange $ CFApplyEffects main
|
||||||
where
|
where
|
||||||
main = fromMaybe fallback $ do
|
main = fromMaybe fallback $ do
|
||||||
flags <- getGnuOpts flagsForRead args
|
flags <- getGnuOpts flagsForRead args
|
||||||
|
@ -1160,7 +1161,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
in
|
in
|
||||||
map (\(id, name) -> IdTagged id $ CFWriteVariable name value) namesOrDefault
|
map (\(id, name) -> IdTagged id $ CFWriteVariable name value) namesOrDefault
|
||||||
|
|
||||||
handleDEFINE (cmd:args) =
|
handleDEFINE (cmd NE.:| args) =
|
||||||
newNodeRange $ CFApplyEffects $ maybeToList findVar
|
newNodeRange $ CFApplyEffects $ maybeToList findVar
|
||||||
where
|
where
|
||||||
findVar = do
|
findVar = do
|
||||||
|
@ -1170,7 +1171,7 @@ handleCommand cmd vars args literalCmd = do
|
||||||
return $ IdTagged (getId name) $ CFWriteVariable str CFValueString
|
return $ IdTagged (getId name) $ CFWriteVariable str CFValueString
|
||||||
|
|
||||||
handleOthers id vars args cmd =
|
handleOthers id vars args cmd =
|
||||||
regularExpansion vars args $ do
|
regularExpansion vars (NE.toList args) $ do
|
||||||
exe <- newNodeRange $ CFExecuteCommand cmd
|
exe <- newNodeRange $ CFExecuteCommand cmd
|
||||||
status <- newNodeRange $ CFSetExitCode id
|
status <- newNodeRange $ CFSetExitCode id
|
||||||
linkRange exe status
|
linkRange exe status
|
||||||
|
@ -1189,8 +1190,8 @@ handleCommand cmd vars args literalCmd = do
|
||||||
|
|
||||||
linkRanges $ [args] ++ assignments ++ [exe] ++ dropAssignments
|
linkRanges $ [args] ++ assignments ++ [exe] ++ dropAssignments
|
||||||
|
|
||||||
regularExpansionWithStatus vars args@(cmd:_) p = do
|
regularExpansionWithStatus vars args@(cmd NE.:| _) p = do
|
||||||
initial <- regularExpansion vars args p
|
initial <- regularExpansion vars (NE.toList args) p
|
||||||
status <- newNodeRange $ CFSetExitCode (getId cmd)
|
status <- newNodeRange $ CFSetExitCode (getId cmd)
|
||||||
linkRange initial status
|
linkRange initial status
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue