{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
module ShellCheck.AST where
import GHC.Generics (Generic)
import Control.Monad.Identity
import Control.DeepSeq
import Text.Parsec
import qualified ShellCheck.Regex as Re
import Prelude hiding (id)
newtype Id = Id Int deriving (Int -> Id -> ShowS
[Id] -> ShowS
Id -> String
(Int -> Id -> ShowS)
-> (Id -> String) -> ([Id] -> ShowS) -> Show Id
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Id] -> ShowS
$cshowList :: [Id] -> ShowS
show :: Id -> String
$cshow :: Id -> String
showsPrec :: Int -> Id -> ShowS
$cshowsPrec :: Int -> Id -> ShowS
Show, Id -> Id -> Bool
(Id -> Id -> Bool) -> (Id -> Id -> Bool) -> Eq Id
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Id -> Id -> Bool
$c/= :: Id -> Id -> Bool
== :: Id -> Id -> Bool
$c== :: Id -> Id -> Bool
Eq, Eq Id
Eq Id =>
(Id -> Id -> Ordering)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Id)
-> (Id -> Id -> Id)
-> Ord Id
Id -> Id -> Bool
Id -> Id -> Ordering
Id -> Id -> Id
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Id -> Id -> Id
$cmin :: Id -> Id -> Id
max :: Id -> Id -> Id
$cmax :: Id -> Id -> Id
>= :: Id -> Id -> Bool
$c>= :: Id -> Id -> Bool
> :: Id -> Id -> Bool
$c> :: Id -> Id -> Bool
<= :: Id -> Id -> Bool
$c<= :: Id -> Id -> Bool
< :: Id -> Id -> Bool
$c< :: Id -> Id -> Bool
compare :: Id -> Id -> Ordering
$ccompare :: Id -> Id -> Ordering
$cp1Ord :: Eq Id
Ord, (forall x. Id -> Rep Id x)
-> (forall x. Rep Id x -> Id) -> Generic Id
forall x. Rep Id x -> Id
forall x. Id -> Rep Id x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Id x -> Id
$cfrom :: forall x. Id -> Rep Id x
Generic, Id -> ()
(Id -> ()) -> NFData Id
forall a. (a -> ()) -> NFData a
rnf :: Id -> ()
$crnf :: Id -> ()
NFData)
data Quoted = Quoted | Unquoted deriving (Int -> Quoted -> ShowS
[Quoted] -> ShowS
Quoted -> String
(Int -> Quoted -> ShowS)
-> (Quoted -> String) -> ([Quoted] -> ShowS) -> Show Quoted
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Quoted] -> ShowS
$cshowList :: [Quoted] -> ShowS
show :: Quoted -> String
$cshow :: Quoted -> String
showsPrec :: Int -> Quoted -> ShowS
$cshowsPrec :: Int -> Quoted -> ShowS
Show, Quoted -> Quoted -> Bool
(Quoted -> Quoted -> Bool)
-> (Quoted -> Quoted -> Bool) -> Eq Quoted
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Quoted -> Quoted -> Bool
$c/= :: Quoted -> Quoted -> Bool
== :: Quoted -> Quoted -> Bool
$c== :: Quoted -> Quoted -> Bool
Eq)
data Dashed = Dashed | Undashed deriving (Int -> Dashed -> ShowS
[Dashed] -> ShowS
Dashed -> String
(Int -> Dashed -> ShowS)
-> (Dashed -> String) -> ([Dashed] -> ShowS) -> Show Dashed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Dashed] -> ShowS
$cshowList :: [Dashed] -> ShowS
show :: Dashed -> String
$cshow :: Dashed -> String
showsPrec :: Int -> Dashed -> ShowS
$cshowsPrec :: Int -> Dashed -> ShowS
Show, Dashed -> Dashed -> Bool
(Dashed -> Dashed -> Bool)
-> (Dashed -> Dashed -> Bool) -> Eq Dashed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Dashed -> Dashed -> Bool
$c/= :: Dashed -> Dashed -> Bool
== :: Dashed -> Dashed -> Bool
$c== :: Dashed -> Dashed -> Bool
Eq)
data AssignmentMode = Assign | Append deriving (Int -> AssignmentMode -> ShowS
[AssignmentMode] -> ShowS
AssignmentMode -> String
(Int -> AssignmentMode -> ShowS)
-> (AssignmentMode -> String)
-> ([AssignmentMode] -> ShowS)
-> Show AssignmentMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AssignmentMode] -> ShowS
$cshowList :: [AssignmentMode] -> ShowS
show :: AssignmentMode -> String
$cshow :: AssignmentMode -> String
showsPrec :: Int -> AssignmentMode -> ShowS
$cshowsPrec :: Int -> AssignmentMode -> ShowS
Show, AssignmentMode -> AssignmentMode -> Bool
(AssignmentMode -> AssignmentMode -> Bool)
-> (AssignmentMode -> AssignmentMode -> Bool) -> Eq AssignmentMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AssignmentMode -> AssignmentMode -> Bool
$c/= :: AssignmentMode -> AssignmentMode -> Bool
== :: AssignmentMode -> AssignmentMode -> Bool
$c== :: AssignmentMode -> AssignmentMode -> Bool
Eq)
newtype FunctionKeyword = FunctionKeyword Bool deriving (Int -> FunctionKeyword -> ShowS
[FunctionKeyword] -> ShowS
FunctionKeyword -> String
(Int -> FunctionKeyword -> ShowS)
-> (FunctionKeyword -> String)
-> ([FunctionKeyword] -> ShowS)
-> Show FunctionKeyword
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FunctionKeyword] -> ShowS
$cshowList :: [FunctionKeyword] -> ShowS
show :: FunctionKeyword -> String
$cshow :: FunctionKeyword -> String
showsPrec :: Int -> FunctionKeyword -> ShowS
$cshowsPrec :: Int -> FunctionKeyword -> ShowS
Show, FunctionKeyword -> FunctionKeyword -> Bool
(FunctionKeyword -> FunctionKeyword -> Bool)
-> (FunctionKeyword -> FunctionKeyword -> Bool)
-> Eq FunctionKeyword
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FunctionKeyword -> FunctionKeyword -> Bool
$c/= :: FunctionKeyword -> FunctionKeyword -> Bool
== :: FunctionKeyword -> FunctionKeyword -> Bool
$c== :: FunctionKeyword -> FunctionKeyword -> Bool
Eq)
newtype FunctionParentheses = FunctionParentheses Bool deriving (Int -> FunctionParentheses -> ShowS
[FunctionParentheses] -> ShowS
FunctionParentheses -> String
(Int -> FunctionParentheses -> ShowS)
-> (FunctionParentheses -> String)
-> ([FunctionParentheses] -> ShowS)
-> Show FunctionParentheses
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FunctionParentheses] -> ShowS
$cshowList :: [FunctionParentheses] -> ShowS
show :: FunctionParentheses -> String
$cshow :: FunctionParentheses -> String
showsPrec :: Int -> FunctionParentheses -> ShowS
$cshowsPrec :: Int -> FunctionParentheses -> ShowS
Show, FunctionParentheses -> FunctionParentheses -> Bool
(FunctionParentheses -> FunctionParentheses -> Bool)
-> (FunctionParentheses -> FunctionParentheses -> Bool)
-> Eq FunctionParentheses
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FunctionParentheses -> FunctionParentheses -> Bool
$c/= :: FunctionParentheses -> FunctionParentheses -> Bool
== :: FunctionParentheses -> FunctionParentheses -> Bool
$c== :: FunctionParentheses -> FunctionParentheses -> Bool
Eq)
data CaseType = CaseBreak | CaseFallThrough | CaseContinue deriving (Int -> CaseType -> ShowS
[CaseType] -> ShowS
CaseType -> String
(Int -> CaseType -> ShowS)
-> (CaseType -> String) -> ([CaseType] -> ShowS) -> Show CaseType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CaseType] -> ShowS
$cshowList :: [CaseType] -> ShowS
show :: CaseType -> String
$cshow :: CaseType -> String
showsPrec :: Int -> CaseType -> ShowS
$cshowsPrec :: Int -> CaseType -> ShowS
Show, CaseType -> CaseType -> Bool
(CaseType -> CaseType -> Bool)
-> (CaseType -> CaseType -> Bool) -> Eq CaseType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CaseType -> CaseType -> Bool
$c/= :: CaseType -> CaseType -> Bool
== :: CaseType -> CaseType -> Bool
$c== :: CaseType -> CaseType -> Bool
Eq)
newtype Root = Root Token
data Token =
TA_Binary Id String Token Token
| TA_Assignment Id String Token Token
| TA_Variable Id String [Token]
| TA_Expansion Id [Token]
| TA_Sequence Id [Token]
| TA_Trinary Id Token Token Token
| TA_Unary Id String Token
| TC_And Id ConditionType String Token Token
| TC_Binary Id ConditionType String Token Token
| TC_Group Id ConditionType Token
| TC_Nullary Id ConditionType Token
| TC_Or Id ConditionType String Token Token
| TC_Unary Id ConditionType String Token
| TC_Empty Id ConditionType
| T_AND_IF Id
| T_AndIf Id Token Token
| T_Arithmetic Id Token
| T_Array Id [Token]
| T_IndexedElement Id [Token] Token
| T_UnparsedIndex Id SourcePos String
| T_Assignment Id AssignmentMode String [Token] Token
| T_Backgrounded Id Token
| T_Backticked Id [Token]
| T_Bang Id
| T_Banged Id Token
| T_BraceExpansion Id [Token]
| T_BraceGroup Id [Token]
| T_CLOBBER Id
| T_Case Id
| T_CaseExpression Id Token [(CaseType, [Token], [Token])]
| T_Condition Id ConditionType Token
| T_DGREAT Id
| T_DLESS Id
| T_DLESSDASH Id
| T_DSEMI Id
| T_Do Id
| T_DollarArithmetic Id Token
| T_DollarBraced Id Bool Token
| T_DollarBracket Id Token
| T_DollarDoubleQuoted Id [Token]
| T_DollarExpansion Id [Token]
| T_DollarSingleQuoted Id String
| T_DollarBraceCommandExpansion Id [Token]
| T_Done Id
| T_DoubleQuoted Id [Token]
| T_EOF Id
| T_Elif Id
| T_Else Id
| T_Esac Id
| T_Extglob Id String [Token]
| T_FdRedirect Id String Token
| T_Fi Id
| T_For Id
| T_ForArithmetic Id Token Token Token [Token]
| T_ForIn Id String [Token] [Token]
| T_Function Id FunctionKeyword FunctionParentheses String Token
| T_GREATAND Id
| T_Glob Id String
| T_Greater Id
| T_HereDoc Id Dashed Quoted String [Token]
| T_HereString Id Token
| T_If Id
| T_IfExpression Id [([Token],[Token])] [Token]
| T_In Id
| T_IoFile Id Token Token
| T_IoDuplicate Id Token String
| T_LESSAND Id
| T_LESSGREAT Id
| T_Lbrace Id
| T_Less Id
| T_Literal Id String
| T_Lparen Id
| T_NEWLINE Id
| T_NormalWord Id [Token]
| T_OR_IF Id
| T_OrIf Id Token Token
| T_ParamSubSpecialChar Id String
| T_Pipeline Id [Token] [Token]
| T_ProcSub Id String [Token]
| T_Rbrace Id
| T_Redirecting Id [Token] Token
| T_Rparen Id
| T_Script Id Token [Token]
| T_Select Id
| T_SelectIn Id String [Token] [Token]
| T_Semi Id
| T_SimpleCommand Id [Token] [Token]
| T_SingleQuoted Id String
| T_Subshell Id [Token]
| T_Then Id
| T_Until Id
| T_UntilExpression Id [Token] [Token]
| T_While Id
| T_WhileExpression Id [Token] [Token]
| T_Annotation Id [Annotation] Token
| T_Pipe Id String
| T_CoProc Id (Maybe String) Token
| T_CoProcBody Id Token
| T_Include Id Token
| T_SourceCommand Id Token Token
| T_BatsTest Id Token Token
deriving (Int -> Token -> ShowS
[Token] -> ShowS
Token -> String
(Int -> Token -> ShowS)
-> (Token -> String) -> ([Token] -> ShowS) -> Show Token
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Token] -> ShowS
$cshowList :: [Token] -> ShowS
show :: Token -> String
$cshow :: Token -> String
showsPrec :: Int -> Token -> ShowS
$cshowsPrec :: Int -> Token -> ShowS
Show)
data Annotation =
Integer
| String
| SourceOverride String
| ShellOverride String
| SourcePath String
deriving (Int -> Annotation -> ShowS
[Annotation] -> ShowS
Annotation -> String
(Int -> Annotation -> ShowS)
-> (Annotation -> String)
-> ([Annotation] -> ShowS)
-> Show Annotation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Annotation] -> ShowS
$cshowList :: [Annotation] -> ShowS
show :: Annotation -> String
$cshow :: Annotation -> String
showsPrec :: Int -> Annotation -> ShowS
$cshowsPrec :: Int -> Annotation -> ShowS
Show, Annotation -> Annotation -> Bool
(Annotation -> Annotation -> Bool)
-> (Annotation -> Annotation -> Bool) -> Eq Annotation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Annotation -> Annotation -> Bool
$c/= :: Annotation -> Annotation -> Bool
== :: Annotation -> Annotation -> Bool
$c== :: Annotation -> Annotation -> Bool
Eq)
data ConditionType = DoubleBracket | SingleBracket deriving (Int -> ConditionType -> ShowS
[ConditionType] -> ShowS
ConditionType -> String
(Int -> ConditionType -> ShowS)
-> (ConditionType -> String)
-> ([ConditionType] -> ShowS)
-> Show ConditionType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ConditionType] -> ShowS
$cshowList :: [ConditionType] -> ShowS
show :: ConditionType -> String
$cshow :: ConditionType -> String
showsPrec :: Int -> ConditionType -> ShowS
$cshowsPrec :: Int -> ConditionType -> ShowS
Show, ConditionType -> ConditionType -> Bool
(ConditionType -> ConditionType -> Bool)
-> (ConditionType -> ConditionType -> Bool) -> Eq ConditionType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ConditionType -> ConditionType -> Bool
$c/= :: ConditionType -> ConditionType -> Bool
== :: ConditionType -> ConditionType -> Bool
$c== :: ConditionType -> ConditionType -> Bool
Eq)
tokenEquals :: Token -> Token -> Bool
tokenEquals :: Token -> Token -> Bool
tokenEquals a :: Token
a b :: Token
b = Token -> String
forall a. Show a => a -> String
kludge Token
a String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== Token -> String
forall a. Show a => a -> String
kludge Token
b
where kludge :: a -> String
kludge s :: a
s = Regex -> String -> ShowS
Re.subRegex (String -> Regex
Re.mkRegex "\\(Id [0-9]+\\)") (a -> String
forall a. Show a => a -> String
show a
s) "(Id 0)"
instance Eq Token where
== :: Token -> Token -> Bool
(==) = Token -> Token -> Bool
tokenEquals
analyze :: Monad m => (Token -> m ()) -> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
analyze :: (Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
analyze f :: Token -> m ()
f g :: Token -> m ()
g i :: Token -> m Token
i =
Token -> m Token
round
where
round :: Token -> m Token
round t :: Token
t = do
Token -> m ()
f Token
t
Token
newT <- Token -> m Token
delve Token
t
Token -> m ()
g Token
t
Token -> m Token
i Token
newT
roundAll :: [Token] -> m [Token]
roundAll = (Token -> m Token) -> [Token] -> m [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Token -> m Token
round
dl :: [Token] -> ([Token] -> Token) -> m Token
dl l :: [Token]
l v :: [Token] -> Token
v = do
[Token]
x <- [Token] -> m [Token]
roundAll [Token]
l
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ [Token] -> Token
v [Token]
x
dll :: [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll l :: [Token]
l m :: [Token]
m v :: [Token] -> [Token] -> Token
v = do
[Token]
x <- [Token] -> m [Token]
roundAll [Token]
l
[Token]
y <- [Token] -> m [Token]
roundAll [Token]
m
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ [Token] -> [Token] -> Token
v [Token]
x [Token]
y
d1 :: Token -> (Token -> Token) -> m Token
d1 t :: Token
t v :: Token -> Token
v = do
Token
x <- Token -> m Token
round Token
t
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Token -> Token
v Token
x
d2 :: Token -> Token -> (Token -> Token -> Token) -> m Token
d2 t1 :: Token
t1 t2 :: Token
t2 v :: Token -> Token -> Token
v = do
Token
x <- Token -> m Token
round Token
t1
Token
y <- Token -> m Token
round Token
t2
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Token -> Token -> Token
v Token
x Token
y
delve :: Token -> m Token
delve (T_NormalWord id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id
delve (T_DoubleQuoted id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DoubleQuoted Id
id
delve (T_DollarDoubleQuoted id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DollarDoubleQuoted Id
id
delve (T_DollarExpansion id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DollarExpansion Id
id
delve (T_DollarBraceCommandExpansion id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DollarBraceCommandExpansion Id
id
delve (T_BraceExpansion id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_BraceExpansion Id
id
delve (T_Backticked id :: Id
id list :: [Token]
list) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
list (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Backticked Id
id
delve (T_DollarArithmetic id :: Id
id c :: Token
c) = Token -> (Token -> Token) -> m Token
d1 Token
c ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_DollarArithmetic Id
id
delve (T_DollarBracket id :: Id
id c :: Token
c) = Token -> (Token -> Token) -> m Token
d1 Token
c ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_DollarBracket Id
id
delve (T_IoFile id :: Id
id op :: Token
op file :: Token
file) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
op Token
file ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_IoFile Id
id
delve (T_IoDuplicate id :: Id
id op :: Token
op num :: String
num) = Token -> (Token -> Token) -> m Token
d1 Token
op ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ \x :: Token
x -> Id -> Token -> String -> Token
T_IoDuplicate Id
id Token
x String
num
delve (T_HereString id :: Id
id word :: Token
word) = Token -> (Token -> Token) -> m Token
d1 Token
word ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_HereString Id
id
delve (T_FdRedirect id :: Id
id v :: String
v t :: Token
t) = Token -> (Token -> Token) -> m Token
d1 Token
t ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
T_FdRedirect Id
id String
v
delve (T_Assignment id :: Id
id mode :: AssignmentMode
mode var :: String
var indices :: [Token]
indices value :: Token
value) = do
[Token]
a <- [Token] -> m [Token]
roundAll [Token]
indices
Token
b <- Token -> m Token
round Token
value
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> AssignmentMode -> String -> [Token] -> Token -> Token
T_Assignment Id
id AssignmentMode
mode String
var [Token]
a Token
b
delve (T_Array id :: Id
id t :: [Token]
t) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
t (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Array Id
id
delve (T_IndexedElement id :: Id
id indices :: [Token]
indices t :: Token
t) = do
[Token]
a <- [Token] -> m [Token]
roundAll [Token]
indices
Token
b <- Token -> m Token
round Token
t
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token -> Token
T_IndexedElement Id
id [Token]
a Token
b
delve (T_Redirecting id :: Id
id redirs :: [Token]
redirs cmd :: Token
cmd) = do
[Token]
a <- [Token] -> m [Token]
roundAll [Token]
redirs
Token
b <- Token -> m Token
round Token
cmd
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token -> Token
T_Redirecting Id
id [Token]
a Token
b
delve (T_SimpleCommand id :: Id
id vars :: [Token]
vars cmds :: [Token]
cmds) = [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll [Token]
vars [Token]
cmds (([Token] -> [Token] -> Token) -> m Token)
-> ([Token] -> [Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_SimpleCommand Id
id
delve (T_Pipeline id :: Id
id l1 :: [Token]
l1 l2 :: [Token]
l2) = [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll [Token]
l1 [Token]
l2 (([Token] -> [Token] -> Token) -> m Token)
-> ([Token] -> [Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_Pipeline Id
id
delve (T_Banged id :: Id
id l :: Token
l) = Token -> (Token -> Token) -> m Token
d1 Token
l ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_Banged Id
id
delve (T_AndIf id :: Id
id t :: Token
t u :: Token
u) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
t Token
u ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_AndIf Id
id
delve (T_OrIf id :: Id
id t :: Token
t u :: Token
u) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
t Token
u ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_OrIf Id
id
delve (T_Backgrounded id :: Id
id l :: Token
l) = Token -> (Token -> Token) -> m Token
d1 Token
l ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_Backgrounded Id
id
delve (T_Subshell id :: Id
id l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Subshell Id
id
delve (T_ProcSub id :: Id
id typ :: String
typ l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
T_ProcSub Id
id String
typ
delve (T_Arithmetic id :: Id
id c :: Token
c) = Token -> (Token -> Token) -> m Token
d1 Token
c ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_Arithmetic Id
id
delve (T_IfExpression id :: Id
id conditions :: [([Token], [Token])]
conditions elses :: [Token]
elses) = do
[([Token], [Token])]
newConds <- (([Token], [Token]) -> m ([Token], [Token]))
-> [([Token], [Token])] -> m [([Token], [Token])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\(c :: [Token]
c, t :: [Token]
t) -> do
[Token]
x <- (Token -> m Token) -> [Token] -> m [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Token -> m Token
round [Token]
c
[Token]
y <- (Token -> m Token) -> [Token] -> m [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Token -> m Token
round [Token]
t
([Token], [Token]) -> m ([Token], [Token])
forall (m :: * -> *) a. Monad m => a -> m a
return ([Token]
x,[Token]
y)
) [([Token], [Token])]
conditions
[Token]
newElses <- [Token] -> m [Token]
roundAll [Token]
elses
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [([Token], [Token])] -> [Token] -> Token
T_IfExpression Id
id [([Token], [Token])]
newConds [Token]
newElses
delve (T_BraceGroup id :: Id
id l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_BraceGroup Id
id
delve (T_WhileExpression id :: Id
id c :: [Token]
c l :: [Token]
l) = [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll [Token]
c [Token]
l (([Token] -> [Token] -> Token) -> m Token)
-> ([Token] -> [Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_WhileExpression Id
id
delve (T_UntilExpression id :: Id
id c :: [Token]
c l :: [Token]
l) = [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll [Token]
c [Token]
l (([Token] -> [Token] -> Token) -> m Token)
-> ([Token] -> [Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_UntilExpression Id
id
delve (T_ForIn id :: Id
id v :: String
v w :: [Token]
w l :: [Token]
l) = [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll [Token]
w [Token]
l (([Token] -> [Token] -> Token) -> m Token)
-> ([Token] -> [Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> [Token] -> Token
T_ForIn Id
id String
v
delve (T_SelectIn id :: Id
id v :: String
v w :: [Token]
w l :: [Token]
l) = [Token] -> [Token] -> ([Token] -> [Token] -> Token) -> m Token
dll [Token]
w [Token]
l (([Token] -> [Token] -> Token) -> m Token)
-> ([Token] -> [Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> [Token] -> Token
T_SelectIn Id
id String
v
delve (T_CaseExpression id :: Id
id word :: Token
word cases :: [(CaseType, [Token], [Token])]
cases) = do
Token
newWord <- Token -> m Token
round Token
word
[(CaseType, [Token], [Token])]
newCases <- ((CaseType, [Token], [Token]) -> m (CaseType, [Token], [Token]))
-> [(CaseType, [Token], [Token])]
-> m [(CaseType, [Token], [Token])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\(o :: CaseType
o, c :: [Token]
c, t :: [Token]
t) -> do
[Token]
x <- (Token -> m Token) -> [Token] -> m [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Token -> m Token
round [Token]
c
[Token]
y <- (Token -> m Token) -> [Token] -> m [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Token -> m Token
round [Token]
t
(CaseType, [Token], [Token]) -> m (CaseType, [Token], [Token])
forall (m :: * -> *) a. Monad m => a -> m a
return (CaseType
o, [Token]
x,[Token]
y)
) [(CaseType, [Token], [Token])]
cases
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> [(CaseType, [Token], [Token])] -> Token
T_CaseExpression Id
id Token
newWord [(CaseType, [Token], [Token])]
newCases
delve (T_ForArithmetic id :: Id
id a :: Token
a b :: Token
b c :: Token
c group :: [Token]
group) = do
Token
x <- Token -> m Token
round Token
a
Token
y <- Token -> m Token
round Token
b
Token
z <- Token -> m Token
round Token
c
[Token]
list <- (Token -> m Token) -> [Token] -> m [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Token -> m Token
round [Token]
group
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token -> [Token] -> Token
T_ForArithmetic Id
id Token
x Token
y Token
z [Token]
list
delve (T_Script id :: Id
id s :: Token
s l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> [Token] -> Token
T_Script Id
id Token
s
delve (T_Function id :: Id
id a :: FunctionKeyword
a b :: FunctionParentheses
b name :: String
name body :: Token
body) = Token -> (Token -> Token) -> m Token
d1 Token
body ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id
-> FunctionKeyword
-> FunctionParentheses
-> String
-> Token
-> Token
T_Function Id
id FunctionKeyword
a FunctionParentheses
b String
name
delve (T_Condition id :: Id
id typ :: ConditionType
typ token :: Token
token) = Token -> (Token -> Token) -> m Token
d1 Token
token ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token -> Token
T_Condition Id
id ConditionType
typ
delve (T_Extglob id :: Id
id str :: String
str l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
T_Extglob Id
id String
str
delve (T_DollarBraced id :: Id
id braced :: Bool
braced op :: Token
op) = Token -> (Token -> Token) -> m Token
d1 Token
op ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Bool -> Token -> Token
T_DollarBraced Id
id Bool
braced
delve (T_HereDoc id :: Id
id d :: Dashed
d q :: Quoted
q str :: String
str l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Dashed -> Quoted -> String -> [Token] -> Token
T_HereDoc Id
id Dashed
d Quoted
q String
str
delve (TC_And id :: Id
id typ :: ConditionType
typ str :: String
str t1 :: Token
t1 t2 :: Token
t2) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
t1 Token
t2 ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token -> Token
TC_And Id
id ConditionType
typ String
str
delve (TC_Or id :: Id
id typ :: ConditionType
typ str :: String
str t1 :: Token
t1 t2 :: Token
t2) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
t1 Token
t2 ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token -> Token
TC_Or Id
id ConditionType
typ String
str
delve (TC_Group id :: Id
id typ :: ConditionType
typ token :: Token
token) = Token -> (Token -> Token) -> m Token
d1 Token
token ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token -> Token
TC_Group Id
id ConditionType
typ
delve (TC_Binary id :: Id
id typ :: ConditionType
typ op :: String
op lhs :: Token
lhs rhs :: Token
rhs) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
lhs Token
rhs ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token -> Token
TC_Binary Id
id ConditionType
typ String
op
delve (TC_Unary id :: Id
id typ :: ConditionType
typ op :: String
op token :: Token
token) = Token -> (Token -> Token) -> m Token
d1 Token
token ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token
TC_Unary Id
id ConditionType
typ String
op
delve (TC_Nullary id :: Id
id typ :: ConditionType
typ token :: Token
token) = Token -> (Token -> Token) -> m Token
d1 Token
token ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token -> Token
TC_Nullary Id
id ConditionType
typ
delve (TA_Binary id :: Id
id op :: String
op t1 :: Token
t1 t2 :: Token
t2) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
t1 Token
t2 ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token -> Token
TA_Binary Id
id String
op
delve (TA_Assignment id :: Id
id op :: String
op t1 :: Token
t1 t2 :: Token
t2) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
t1 Token
t2 ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token -> Token
TA_Assignment Id
id String
op
delve (TA_Unary id :: Id
id op :: String
op t1 :: Token
t1) = Token -> (Token -> Token) -> m Token
d1 Token
t1 ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
TA_Unary Id
id String
op
delve (TA_Sequence id :: Id
id l :: [Token]
l) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
l (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
TA_Sequence Id
id
delve (TA_Trinary id :: Id
id t1 :: Token
t1 t2 :: Token
t2 t3 :: Token
t3) = do
Token
a <- Token -> m Token
round Token
t1
Token
b <- Token -> m Token
round Token
t2
Token
c <- Token -> m Token
round Token
t3
Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> m Token) -> Token -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token -> Token
TA_Trinary Id
id Token
a Token
b Token
c
delve (TA_Expansion id :: Id
id t :: [Token]
t) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
t (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
TA_Expansion Id
id
delve (TA_Variable id :: Id
id str :: String
str t :: [Token]
t) = [Token] -> ([Token] -> Token) -> m Token
dl [Token]
t (([Token] -> Token) -> m Token) -> ([Token] -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
TA_Variable Id
id String
str
delve (T_Annotation id :: Id
id anns :: [Annotation]
anns t :: Token
t) = Token -> (Token -> Token) -> m Token
d1 Token
t ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Annotation] -> Token -> Token
T_Annotation Id
id [Annotation]
anns
delve (T_CoProc id :: Id
id var :: Maybe String
var body :: Token
body) = Token -> (Token -> Token) -> m Token
d1 Token
body ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Maybe String -> Token -> Token
T_CoProc Id
id Maybe String
var
delve (T_CoProcBody id :: Id
id t :: Token
t) = Token -> (Token -> Token) -> m Token
d1 Token
t ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_CoProcBody Id
id
delve (T_Include id :: Id
id script :: Token
script) = Token -> (Token -> Token) -> m Token
d1 Token
script ((Token -> Token) -> m Token) -> (Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_Include Id
id
delve (T_SourceCommand id :: Id
id includer :: Token
includer t_include :: Token
t_include) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
includer Token
t_include ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_SourceCommand Id
id
delve (T_BatsTest id :: Id
id name :: Token
name t :: Token
t) = Token -> Token -> (Token -> Token -> Token) -> m Token
d2 Token
name Token
t ((Token -> Token -> Token) -> m Token)
-> (Token -> Token -> Token) -> m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_BatsTest Id
id
delve t :: Token
t = Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
getId :: Token -> Id
getId :: Token -> Id
getId t :: Token
t = case Token
t of
T_AND_IF id :: Id
id -> Id
id
T_OR_IF id :: Id
id -> Id
id
T_DSEMI id :: Id
id -> Id
id
T_Semi id :: Id
id -> Id
id
T_DLESS id :: Id
id -> Id
id
T_DGREAT id :: Id
id -> Id
id
T_LESSAND id :: Id
id -> Id
id
T_GREATAND id :: Id
id -> Id
id
T_LESSGREAT id :: Id
id -> Id
id
T_DLESSDASH id :: Id
id -> Id
id
T_CLOBBER id :: Id
id -> Id
id
T_If id :: Id
id -> Id
id
T_Then id :: Id
id -> Id
id
T_Else id :: Id
id -> Id
id
T_Elif id :: Id
id -> Id
id
T_Fi id :: Id
id -> Id
id
T_Do id :: Id
id -> Id
id
T_Done id :: Id
id -> Id
id
T_Case id :: Id
id -> Id
id
T_Esac id :: Id
id -> Id
id
T_While id :: Id
id -> Id
id
T_Until id :: Id
id -> Id
id
T_For id :: Id
id -> Id
id
T_Select id :: Id
id -> Id
id
T_Lbrace id :: Id
id -> Id
id
T_Rbrace id :: Id
id -> Id
id
T_Lparen id :: Id
id -> Id
id
T_Rparen id :: Id
id -> Id
id
T_Bang id :: Id
id -> Id
id
T_In id :: Id
id -> Id
id
T_NEWLINE id :: Id
id -> Id
id
T_EOF id :: Id
id -> Id
id
T_Less id :: Id
id -> Id
id
T_Greater id :: Id
id -> Id
id
T_SingleQuoted id :: Id
id _ -> Id
id
T_Literal id :: Id
id _ -> Id
id
T_NormalWord id :: Id
id _ -> Id
id
T_DoubleQuoted id :: Id
id _ -> Id
id
T_DollarExpansion id :: Id
id _ -> Id
id
T_DollarBraced id :: Id
id _ _ -> Id
id
T_DollarArithmetic id :: Id
id _ -> Id
id
T_BraceExpansion id :: Id
id _ -> Id
id
T_ParamSubSpecialChar id :: Id
id _ -> Id
id
T_DollarBraceCommandExpansion id :: Id
id _ -> Id
id
T_IoFile id :: Id
id _ _ -> Id
id
T_IoDuplicate id :: Id
id _ _ -> Id
id
T_HereDoc id :: Id
id _ _ _ _ -> Id
id
T_HereString id :: Id
id _ -> Id
id
T_FdRedirect id :: Id
id _ _ -> Id
id
T_Assignment id :: Id
id _ _ _ _ -> Id
id
T_Array id :: Id
id _ -> Id
id
T_IndexedElement id :: Id
id _ _ -> Id
id
T_Redirecting id :: Id
id _ _ -> Id
id
T_SimpleCommand id :: Id
id _ _ -> Id
id
T_Pipeline id :: Id
id _ _ -> Id
id
T_Banged id :: Id
id _ -> Id
id
T_AndIf id :: Id
id _ _ -> Id
id
T_OrIf id :: Id
id _ _ -> Id
id
T_Backgrounded id :: Id
id _ -> Id
id
T_IfExpression id :: Id
id _ _ -> Id
id
T_Subshell id :: Id
id _ -> Id
id
T_BraceGroup id :: Id
id _ -> Id
id
T_WhileExpression id :: Id
id _ _ -> Id
id
T_UntilExpression id :: Id
id _ _ -> Id
id
T_ForIn id :: Id
id _ _ _ -> Id
id
T_SelectIn id :: Id
id _ _ _ -> Id
id
T_CaseExpression id :: Id
id _ _ -> Id
id
T_Function id :: Id
id _ _ _ _ -> Id
id
T_Arithmetic id :: Id
id _ -> Id
id
T_Script id :: Id
id _ _ -> Id
id
T_Condition id :: Id
id _ _ -> Id
id
T_Extglob id :: Id
id _ _ -> Id
id
T_Backticked id :: Id
id _ -> Id
id
TC_And id :: Id
id _ _ _ _ -> Id
id
TC_Or id :: Id
id _ _ _ _ -> Id
id
TC_Group id :: Id
id _ _ -> Id
id
TC_Binary id :: Id
id _ _ _ _ -> Id
id
TC_Unary id :: Id
id _ _ _ -> Id
id
TC_Nullary id :: Id
id _ _ -> Id
id
TA_Binary id :: Id
id _ _ _ -> Id
id
TA_Assignment id :: Id
id _ _ _ -> Id
id
TA_Unary id :: Id
id _ _ -> Id
id
TA_Sequence id :: Id
id _ -> Id
id
TA_Trinary id :: Id
id _ _ _ -> Id
id
TA_Expansion id :: Id
id _ -> Id
id
T_ProcSub id :: Id
id _ _ -> Id
id
T_Glob id :: Id
id _ -> Id
id
T_ForArithmetic id :: Id
id _ _ _ _ -> Id
id
T_DollarSingleQuoted id :: Id
id _ -> Id
id
T_DollarDoubleQuoted id :: Id
id _ -> Id
id
T_DollarBracket id :: Id
id _ -> Id
id
T_Annotation id :: Id
id _ _ -> Id
id
T_Pipe id :: Id
id _ -> Id
id
T_CoProc id :: Id
id _ _ -> Id
id
T_CoProcBody id :: Id
id _ -> Id
id
T_Include id :: Id
id _ -> Id
id
T_SourceCommand id :: Id
id _ _ -> Id
id
T_UnparsedIndex id :: Id
id _ _ -> Id
id
TC_Empty id :: Id
id _ -> Id
id
TA_Variable id :: Id
id _ _ -> Id
id
T_BatsTest id :: Id
id _ _ -> Id
id
blank :: Monad m => Token -> m ()
blank :: Token -> m ()
blank = m () -> Token -> m ()
forall a b. a -> b -> a
const (m () -> Token -> m ()) -> m () -> Token -> m ()
forall a b. (a -> b) -> a -> b
$ () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
doAnalysis :: Monad m => (Token -> m ()) -> Token -> m Token
doAnalysis :: (Token -> m ()) -> Token -> m Token
doAnalysis f :: Token -> m ()
f = (Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
forall (m :: * -> *).
Monad m =>
(Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
analyze Token -> m ()
f Token -> m ()
forall (m :: * -> *). Monad m => Token -> m ()
blank Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return
doStackAnalysis :: Monad m => (Token -> m ()) -> (Token -> m ()) -> Token -> m Token
doStackAnalysis :: (Token -> m ()) -> (Token -> m ()) -> Token -> m Token
doStackAnalysis startToken :: Token -> m ()
startToken endToken :: Token -> m ()
endToken = (Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
forall (m :: * -> *).
Monad m =>
(Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
analyze Token -> m ()
startToken Token -> m ()
endToken Token -> m Token
forall (m :: * -> *) a. Monad m => a -> m a
return
doTransform :: (Token -> Token) -> Token -> Token
doTransform :: (Token -> Token) -> Token -> Token
doTransform i :: Token -> Token
i = Identity Token -> Token
forall a. Identity a -> a
runIdentity (Identity Token -> Token)
-> (Token -> Identity Token) -> Token -> Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Token -> Identity ())
-> (Token -> Identity ())
-> (Token -> Identity Token)
-> Token
-> Identity Token
forall (m :: * -> *).
Monad m =>
(Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
analyze Token -> Identity ()
forall (m :: * -> *). Monad m => Token -> m ()
blank Token -> Identity ()
forall (m :: * -> *). Monad m => Token -> m ()
blank (Token -> Identity Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> Identity Token)
-> (Token -> Token) -> Token -> Identity Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
i)