{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiWayIf #-}
module ShellCheck.Parser (parseScript, runTests) where
import ShellCheck.AST
import ShellCheck.ASTLib
import ShellCheck.Data
import ShellCheck.Interface
import Control.Applicative ((<*), (*>))
import Control.Monad
import Control.Monad.Identity
import Control.Monad.Trans
import Data.Char
import Data.Functor
import Data.List (isPrefixOf, isInfixOf, isSuffixOf, partition, sortBy, intercalate, nub)
import Data.Maybe
import Data.Monoid
import Debug.Trace
import GHC.Exts (sortWith)
import Prelude hiding (readList)
import System.IO
import Text.Parsec hiding (runParser, (<?>))
import Text.Parsec.Error
import Text.Parsec.Pos
import qualified Control.Monad.Reader as Mr
import qualified Control.Monad.State as Ms
import qualified Data.Map as Map
import Test.QuickCheck.All (quickCheckAll)
type SCBase m = Mr.ReaderT (Environment m) (Ms.StateT SystemState m)
type SCParser m v = ParsecT String UserState (SCBase m) v
backslash :: Monad m => SCParser m Char
backslash :: SCParser m Char
backslash = Char -> SCParser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\'
linefeed :: Monad m => SCParser m Char
linefeed :: SCParser m Char
linefeed = do
SCParser m Char -> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional SCParser m Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m,
Stream s m Char) =>
ParsecT s UserState m Char
carriageReturn
Char
c <- Char -> SCParser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\n'
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readPendingHereDocs
Char -> SCParser m Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
c
singleQuote :: ParsecT s u m Char
singleQuote = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\''
doubleQuote :: ParsecT s u m Char
doubleQuote = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '"'
variableStart :: ParsecT s u m Char
variableStart = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
upper ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
lower ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "_"
variableChars :: ParsecT s u m Char
variableChars = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
upper ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
lower ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "_"
functionChars :: ParsecT s u m Char
functionChars = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableChars ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf ":+?-./^@"
extendedFunctionChars :: ParsecT s u m Char
extendedFunctionChars = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
functionChars ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "[]*=!"
specialVariable :: ParsecT s u m Char
specialVariable = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
specialVariables)
paramSubSpecialChars :: ParsecT s u m Char
paramSubSpecialChars = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "/:+-=%"
quotableChars :: String
quotableChars = "|&;<>()\\ '\t\n\r\xA0" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
doubleQuotableChars
quotable :: ParsecT s UserState m Char
quotable = ParsecT s UserState m Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Char
almostSpace ParsecT s UserState m Char
-> ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
quotableChars
bracedQuotable :: ParsecT s u m Char
bracedQuotable = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "}\"$`'"
doubleQuotableChars :: String
doubleQuotableChars = "\\\"$`"
doubleQuotable :: ParsecT s u m Char
doubleQuotable = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
doubleQuotableChars
whitespace :: ParsecT String UserState (SCBase m) Char
whitespace = String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf " \t" ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m,
Stream s m Char) =>
ParsecT s UserState m Char
carriageReturn ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Char
almostSpace ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed
linewhitespace :: ParsecT s UserState m Char
linewhitespace = String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf " \t" ParsecT s UserState m Char
-> ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Char
almostSpace
suspectCharAfterQuotes :: ParsecT s u m Char
suspectCharAfterQuotes = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableChars ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '%'
extglobStartChars :: String
extglobStartChars = "?*@!+"
extglobStart :: ParsecT s u m Char
extglobStart = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
extglobStartChars
unicodeDoubleQuotes :: String
unicodeDoubleQuotes = "\x201C\x201D\x2033\x2036"
unicodeSingleQuotes :: String
unicodeSingleQuotes = "\x2018\x2019"
prop_spacing :: Bool
prop_spacing = ParsecT String UserState (SCBase Identity) String -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing " \\\n # Comment"
spacing :: ParsecT s UserState m String
spacing = do
[String]
x <- ParsecT s UserState m String -> ParsecT s UserState m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s UserState m Char -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "\\\n" ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT s UserState m String
forall (m :: * -> *) a. Monad m => a -> m a
return ""))
ParsecT s UserState m String -> ParsecT s UserState m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s UserState m String
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m String
readComment
String -> ParsecT s UserState m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT s UserState m String)
-> String -> ParsecT s UserState m String
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
x
spacing1 :: ParsecT s UserState m String
spacing1 = do
String
spacing <- ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Bool -> ParsecT s UserState m () -> ParsecT s UserState m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
spacing) (ParsecT s UserState m () -> ParsecT s UserState m ())
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s UserState m ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected whitespace"
String -> ParsecT s UserState m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
spacing
prop_allspacing :: Bool
prop_allspacing = ParsecT String UserState (SCBase Identity) String -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing "#foo"
prop_allspacing2 :: Bool
prop_allspacing2 = ParsecT String UserState (SCBase Identity) String -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing " #foo\n # bar\n#baz\n"
prop_allspacing3 :: Bool
prop_allspacing3 = ParsecT String UserState (SCBase Identity) String -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing "#foo\n#bar\n#baz\n"
allspacing :: ParsecT String UserState (SCBase m) String
allspacing = do
String
s <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Bool
more <- Bool
-> ParsecT String UserState (SCBase m) Bool
-> ParsecT String UserState (SCBase m) Bool
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Bool
False (SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed SCParser m Char
-> ParsecT String UserState (SCBase m) Bool
-> ParsecT String UserState (SCBase m) Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> ParsecT String UserState (SCBase m) Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)
if Bool
more then do
String
rest <- ParsecT String UserState (SCBase m) String
allspacing
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rest
else
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return String
s
allspacingOrFail :: ParsecT String UserState (SCBase m) String
allspacingOrFail = do
String
s <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
s) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected whitespace"
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return String
s
readUnicodeQuote :: ParsecT String UserState (SCBase m) Token
readUnicodeQuote = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
c <- String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf (String
unicodeSingleQuotes String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
unicodeDoubleQuotes)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Id -> Severity -> Integer -> String -> SCParser m ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
id Severity
WarningC 1110 "This is a unicode quote. Delete and retype it (or quote to make literal)."
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id [Char
c]
carriageReturn :: ParsecT s UserState m Char
carriageReturn = do
Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s UserState m ()
parseNote Severity
ErrorC 1017 "Literal carriage return. Run script through tr -d '\\r' ."
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\r'
almostSpace :: ParsecT s UserState m Char
almostSpace =
[ParsecT s UserState m Char] -> ParsecT s UserState m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
Char -> String -> ParsecT s UserState m Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m,
Stream s m Char) =>
Char -> String -> ParsecT s UserState m Char
check '\xA0' "unicode non-breaking space",
Char -> String -> ParsecT s UserState m Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m,
Stream s m Char) =>
Char -> String -> ParsecT s UserState m Char
check '\x200B' "unicode zerowidth space"
]
where
check :: Char -> String -> ParsecT s UserState m Char
check c :: Char
c name :: String
name = do
Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s UserState m ()
parseNote Severity
ErrorC 1018 (String -> ParsecT s UserState m ())
-> String -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ "This is a " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ ". Delete and retype it."
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c
Char -> ParsecT s UserState m Char
forall (m :: * -> *) a. Monad m => a -> m a
return ' '
data ParseNote = ParseNote SourcePos SourcePos Severity Code String deriving (Int -> ParseNote -> String -> String
[ParseNote] -> String -> String
ParseNote -> String
(Int -> ParseNote -> String -> String)
-> (ParseNote -> String)
-> ([ParseNote] -> String -> String)
-> Show ParseNote
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [ParseNote] -> String -> String
$cshowList :: [ParseNote] -> String -> String
show :: ParseNote -> String
$cshow :: ParseNote -> String
showsPrec :: Int -> ParseNote -> String -> String
$cshowsPrec :: Int -> ParseNote -> String -> String
Show, ParseNote -> ParseNote -> Bool
(ParseNote -> ParseNote -> Bool)
-> (ParseNote -> ParseNote -> Bool) -> Eq ParseNote
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParseNote -> ParseNote -> Bool
$c/= :: ParseNote -> ParseNote -> Bool
== :: ParseNote -> ParseNote -> Bool
$c== :: ParseNote -> ParseNote -> Bool
Eq)
data Context =
ContextName SourcePos String
| ContextAnnotation [Annotation]
| ContextSource String
deriving (Int -> Context -> String -> String
[Context] -> String -> String
Context -> String
(Int -> Context -> String -> String)
-> (Context -> String)
-> ([Context] -> String -> String)
-> Show Context
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Context] -> String -> String
$cshowList :: [Context] -> String -> String
show :: Context -> String
$cshow :: Context -> String
showsPrec :: Int -> Context -> String -> String
$cshowsPrec :: Int -> Context -> String -> String
Show)
data HereDocContext =
HereDocPending Token [Context]
deriving (Int -> HereDocContext -> String -> String
[HereDocContext] -> String -> String
HereDocContext -> String
(Int -> HereDocContext -> String -> String)
-> (HereDocContext -> String)
-> ([HereDocContext] -> String -> String)
-> Show HereDocContext
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [HereDocContext] -> String -> String
$cshowList :: [HereDocContext] -> String -> String
show :: HereDocContext -> String
$cshow :: HereDocContext -> String
showsPrec :: Int -> HereDocContext -> String -> String
$cshowsPrec :: Int -> HereDocContext -> String -> String
Show)
data UserState = UserState {
UserState -> Id
lastId :: Id,
UserState -> Map Id (SourcePos, SourcePos)
positionMap :: Map.Map Id (SourcePos, SourcePos),
UserState -> [ParseNote]
parseNotes :: [ParseNote],
UserState -> Map Id [Token]
hereDocMap :: Map.Map Id [Token],
UserState -> [HereDocContext]
pendingHereDocs :: [HereDocContext]
}
initialUserState :: UserState
initialUserState = UserState :: Id
-> Map Id (SourcePos, SourcePos)
-> [ParseNote]
-> Map Id [Token]
-> [HereDocContext]
-> UserState
UserState {
lastId :: Id
lastId = Int -> Id
Id (Int -> Id) -> Int -> Id
forall a b. (a -> b) -> a -> b
$ -1,
positionMap :: Map Id (SourcePos, SourcePos)
positionMap = Map Id (SourcePos, SourcePos)
forall k a. Map k a
Map.empty,
parseNotes :: [ParseNote]
parseNotes = [],
hereDocMap :: Map Id [Token]
hereDocMap = Map Id [Token]
forall k a. Map k a
Map.empty,
pendingHereDocs :: [HereDocContext]
pendingHereDocs = []
}
codeForParseNote :: ParseNote -> Integer
codeForParseNote (ParseNote _ _ _ code :: Integer
code _) = Integer
code
getLastId :: ParsecT s UserState m Id
getLastId = UserState -> Id
lastId (UserState -> Id)
-> ParsecT s UserState m UserState -> ParsecT s UserState m Id
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
getNextIdBetween :: SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween startPos :: SourcePos
startPos endPos :: SourcePos
endPos = do
UserState
state <- ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
let newId :: Id
newId = Id -> Id
incId (UserState -> Id
lastId UserState
state)
let newMap :: Map Id (SourcePos, SourcePos)
newMap = Id
-> (SourcePos, SourcePos)
-> Map Id (SourcePos, SourcePos)
-> Map Id (SourcePos, SourcePos)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Id
newId (SourcePos
startPos, SourcePos
endPos) (UserState -> Map Id (SourcePos, SourcePos)
positionMap UserState
state)
UserState -> ParsecT s UserState m ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState (UserState -> ParsecT s UserState m ())
-> UserState -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ UserState
state {
lastId :: Id
lastId = Id
newId,
positionMap :: Map Id (SourcePos, SourcePos)
positionMap = Map Id (SourcePos, SourcePos)
newMap
}
Id -> ParsecT s UserState m Id
forall (m :: * -> *) a. Monad m => a -> m a
return Id
newId
where incId :: Id -> Id
incId (Id n :: Int
n) = Int -> Id
Id (Int -> Id) -> Int -> Id
forall a b. (a -> b) -> a -> b
$ Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+1
getNextIdSpanningTokens :: Token -> Token -> ParsecT String UserState (SCBase m) Id
getNextIdSpanningTokens startTok :: Token
startTok endTok :: Token
endTok = do
(start :: SourcePos
start, _) <- Id -> SCParser m (SourcePos, SourcePos)
forall (m :: * -> *).
Monad m =>
Id -> SCParser m (SourcePos, SourcePos)
getSpanForId (Token -> Id
getId Token
startTok)
(_, end :: SourcePos
end) <- Id -> SCParser m (SourcePos, SourcePos)
forall (m :: * -> *).
Monad m =>
Id -> SCParser m (SourcePos, SourcePos)
getSpanForId (Token -> Id
getId Token
endTok)
SourcePos -> SourcePos -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
start SourcePos
end
getNextIdSpanningTokenList :: [Token] -> ParsecT String UserState (SCBase m) Id
getNextIdSpanningTokenList list :: [Token]
list =
if [Token] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Token]
list
then do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourcePos -> SourcePos -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
pos SourcePos
pos
else
Token -> Token -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *).
Monad m =>
Token -> Token -> ParsecT String UserState (SCBase m) Id
getNextIdSpanningTokens ([Token] -> Token
forall a. [a] -> a
head [Token]
list) ([Token] -> Token
forall a. [a] -> a
last [Token]
list)
getSpanForId :: Monad m => Id -> SCParser m (SourcePos, SourcePos)
getSpanForId :: Id -> SCParser m (SourcePos, SourcePos)
getSpanForId id :: Id
id =
(SourcePos, SourcePos)
-> Id -> Map Id (SourcePos, SourcePos) -> (SourcePos, SourcePos)
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault (String -> (SourcePos, SourcePos)
forall a. HasCallStack => String -> a
error "Internal error: no position for id. Please report!") Id
id (Map Id (SourcePos, SourcePos) -> (SourcePos, SourcePos))
-> ParsecT
String UserState (SCBase m) (Map Id (SourcePos, SourcePos))
-> SCParser m (SourcePos, SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
ParsecT String UserState (SCBase m) (Map Id (SourcePos, SourcePos))
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m (Map Id (SourcePos, SourcePos))
getMap
getNewIdFor :: Monad m => Id -> SCParser m Id
getNewIdFor :: Id -> SCParser m Id
getNewIdFor id :: Id
id = Id -> SCParser m (SourcePos, SourcePos)
forall (m :: * -> *).
Monad m =>
Id -> SCParser m (SourcePos, SourcePos)
getSpanForId Id
id SCParser m (SourcePos, SourcePos)
-> ((SourcePos, SourcePos) -> SCParser m Id) -> SCParser m Id
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (SourcePos -> SourcePos -> SCParser m Id)
-> (SourcePos, SourcePos) -> SCParser m Id
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry SourcePos -> SourcePos -> SCParser m Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween
data IncompleteInterval = IncompleteInterval SourcePos
startSpan :: ParsecT s u m IncompleteInterval
startSpan = SourcePos -> IncompleteInterval
IncompleteInterval (SourcePos -> IncompleteInterval)
-> ParsecT s u m SourcePos -> ParsecT s u m IncompleteInterval
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
endSpan :: IncompleteInterval -> ParsecT s UserState m Id
endSpan (IncompleteInterval start :: SourcePos
start) = do
SourcePos
endPos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Id
id <- SourcePos -> SourcePos -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
start SourcePos
endPos
Id -> ParsecT s UserState m Id
forall (m :: * -> *) a. Monad m => a -> m a
return Id
id
addToHereDocMap :: Id -> [Token] -> ParsecT s UserState m ()
addToHereDocMap id :: Id
id list :: [Token]
list = do
UserState
state <- ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
let map :: Map Id [Token]
map = UserState -> Map Id [Token]
hereDocMap UserState
state
UserState -> ParsecT s UserState m ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState (UserState -> ParsecT s UserState m ())
-> UserState -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ UserState
state {
hereDocMap :: Map Id [Token]
hereDocMap = Id -> [Token] -> Map Id [Token] -> Map Id [Token]
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Id
id [Token]
list Map Id [Token]
map
}
addPendingHereDoc :: Token -> ParsecT s UserState m ()
addPendingHereDoc t :: Token
t = do
UserState
state <- ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
[Context]
context <- ParsecT s UserState m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
let docs :: [HereDocContext]
docs = UserState -> [HereDocContext]
pendingHereDocs UserState
state
UserState -> ParsecT s UserState m ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState (UserState -> ParsecT s UserState m ())
-> UserState -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ UserState
state {
pendingHereDocs :: [HereDocContext]
pendingHereDocs = Token -> [Context] -> HereDocContext
HereDocPending Token
t [Context]
context HereDocContext -> [HereDocContext] -> [HereDocContext]
forall a. a -> [a] -> [a]
: [HereDocContext]
docs
}
popPendingHereDocs :: ParsecT s UserState m [HereDocContext]
popPendingHereDocs = do
UserState
state <- ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
let pending :: [HereDocContext]
pending = UserState -> [HereDocContext]
pendingHereDocs UserState
state
UserState -> ParsecT s UserState m ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState (UserState -> ParsecT s UserState m ())
-> UserState -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ UserState
state {
pendingHereDocs :: [HereDocContext]
pendingHereDocs = []
}
[HereDocContext] -> ParsecT s UserState m [HereDocContext]
forall (m :: * -> *) a. Monad m => a -> m a
return ([HereDocContext] -> ParsecT s UserState m [HereDocContext])
-> ([HereDocContext] -> [HereDocContext])
-> [HereDocContext]
-> ParsecT s UserState m [HereDocContext]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [HereDocContext] -> [HereDocContext]
forall a. [a] -> [a]
reverse ([HereDocContext] -> ParsecT s UserState m [HereDocContext])
-> [HereDocContext] -> ParsecT s UserState m [HereDocContext]
forall a b. (a -> b) -> a -> b
$ UserState -> [HereDocContext]
pendingHereDocs UserState
state
getMap :: ParsecT s UserState m (Map Id (SourcePos, SourcePos))
getMap = UserState -> Map Id (SourcePos, SourcePos)
positionMap (UserState -> Map Id (SourcePos, SourcePos))
-> ParsecT s UserState m UserState
-> ParsecT s UserState m (Map Id (SourcePos, SourcePos))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
getParseNotes :: ParsecT s UserState m [ParseNote]
getParseNotes = UserState -> [ParseNote]
parseNotes (UserState -> [ParseNote])
-> ParsecT s UserState m UserState
-> ParsecT s UserState m [ParseNote]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
addParseNote :: ParseNote -> ParsecT s UserState m ()
addParseNote n :: ParseNote
n = do
Bool
irrelevant <- Integer -> ParsecT s UserState m Bool
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> m Bool
shouldIgnoreCode (ParseNote -> Integer
codeForParseNote ParseNote
n)
Bool -> ParsecT s UserState m () -> ParsecT s UserState m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
irrelevant (ParsecT s UserState m () -> ParsecT s UserState m ())
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ do
UserState
state <- ParsecT s UserState m UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
UserState -> ParsecT s UserState m ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState (UserState -> ParsecT s UserState m ())
-> UserState -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ UserState
state {
parseNotes :: [ParseNote]
parseNotes = ParseNote
n ParseNote -> [ParseNote] -> [ParseNote]
forall a. a -> [a] -> [a]
: UserState -> [ParseNote]
parseNotes UserState
state
}
shouldIgnoreCode :: Integer -> m Bool
shouldIgnoreCode code :: Integer
code = do
[Context]
context <- m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
Bool
checkSourced <- (Environment m -> Bool) -> m Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> Bool
forall (m :: * -> *). Environment m -> Bool
checkSourced
Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> m Bool) -> Bool -> m Bool
forall a b. (a -> b) -> a -> b
$ (Context -> Bool) -> [Context] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Context -> Bool
disabling Bool
checkSourced) [Context]
context
where
disabling :: Bool -> Context -> Bool
disabling checkSourced :: Bool
checkSourced item :: Context
item =
case Context
item of
ContextAnnotation list :: [Annotation]
list -> (Annotation -> Bool) -> [Annotation] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Annotation -> Bool
disabling' [Annotation]
list
ContextSource _ -> Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Bool
checkSourced
_ -> Bool
False
disabling' :: Annotation -> Bool
disabling' (DisableComment n :: Integer
n) = Integer
code Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
n
disabling' _ = Bool
False
getCurrentAnnotations :: Bool -> f [Annotation]
getCurrentAnnotations includeSource :: Bool
includeSource =
(Context -> [Annotation]) -> [Context] -> [Annotation]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Context -> [Annotation]
get ([Context] -> [Annotation])
-> ([Context] -> [Context]) -> [Context] -> [Annotation]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Context -> Bool) -> [Context] -> [Context]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool) -> (Context -> Bool) -> Context -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Context -> Bool
isBoundary) ([Context] -> [Annotation]) -> f [Context] -> f [Annotation]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
where
get :: Context -> [Annotation]
get (ContextAnnotation list :: [Annotation]
list) = [Annotation]
list
get _ = []
isBoundary :: Context -> Bool
isBoundary (ContextSource _) = Bool -> Bool
not Bool
includeSource
isBoundary _ = Bool
False
shouldFollow :: String -> ParsecT s u m Bool
shouldFollow file :: String
file = do
[Context]
context <- ParsecT s u m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
if (Context -> Bool) -> [Context] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Context -> Bool
isThisFile [Context]
context
then Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
else
if [Context] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ((Context -> Bool) -> [Context] -> [Context]
forall a. (a -> Bool) -> [a] -> [a]
filter Context -> Bool
isSource [Context]
context) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 100
then do
Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1092 "Stopping at 100 'source' frames :O"
Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
else
Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
where
isSource :: Context -> Bool
isSource (ContextSource _) = Bool
True
isSource _ = Bool
False
isThisFile :: Context -> Bool
isThisFile (ContextSource name :: String
name) | String
name String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
file = Bool
True
isThisFile _= Bool
False
getSourceOverride :: m (Maybe String)
getSourceOverride = do
[Context]
context <- m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
Maybe String -> m (Maybe String)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe String -> m (Maybe String))
-> ([Context] -> Maybe String) -> [Context] -> m (Maybe String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe String] -> Maybe String
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum ([Maybe String] -> Maybe String)
-> ([Context] -> [Maybe String]) -> [Context] -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Context -> Maybe String) -> [Context] -> [Maybe String]
forall a b. (a -> b) -> [a] -> [b]
map Context -> Maybe String
findFile ([Context] -> m (Maybe String)) -> [Context] -> m (Maybe String)
forall a b. (a -> b) -> a -> b
$ (Context -> Bool) -> [Context] -> [Context]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile Context -> Bool
isSameFile [Context]
context
where
isSameFile :: Context -> Bool
isSameFile (ContextSource _) = Bool
False
isSameFile _ = Bool
True
findFile :: Context -> Maybe String
findFile (ContextAnnotation list :: [Annotation]
list) = [Maybe String] -> Maybe String
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum ([Maybe String] -> Maybe String) -> [Maybe String] -> Maybe String
forall a b. (a -> b) -> a -> b
$ (Annotation -> Maybe String) -> [Annotation] -> [Maybe String]
forall a b. (a -> b) -> [a] -> [b]
map Annotation -> Maybe String
getFile [Annotation]
list
findFile _ = Maybe String
forall a. Maybe a
Nothing
getFile :: Annotation -> Maybe String
getFile (SourceOverride str :: String
str) = String -> Maybe String
forall a. a -> Maybe a
Just String
str
getFile _ = Maybe String
forall a. Maybe a
Nothing
data SystemState = SystemState {
SystemState -> [Context]
contextStack :: [Context],
SystemState -> [ParseNote]
parseProblems :: [ParseNote]
}
initialSystemState :: SystemState
initialSystemState = SystemState :: [Context] -> [ParseNote] -> SystemState
SystemState {
contextStack :: [Context]
contextStack = [],
parseProblems :: [ParseNote]
parseProblems = []
}
data Environment m = Environment {
Environment m -> SystemInterface m
systemInterface :: SystemInterface m,
Environment m -> Bool
checkSourced :: Bool,
Environment m -> Bool
ignoreRC :: Bool,
Environment m -> String
currentFilename :: String,
Environment m -> Maybe Shell
shellTypeOverride :: Maybe Shell
}
parseProblem :: Severity -> Integer -> String -> ParsecT s u m ()
parseProblem level :: Severity
level code :: Integer
code msg :: String
msg = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
level Integer
code String
msg
setCurrentContexts :: [Context] -> m ()
setCurrentContexts c :: [Context]
c = (SystemState -> SystemState) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
Ms.modify (\state :: SystemState
state -> SystemState
state { contextStack :: [Context]
contextStack = [Context]
c })
getCurrentContexts :: f [Context]
getCurrentContexts = SystemState -> [Context]
contextStack (SystemState -> [Context]) -> f SystemState -> f [Context]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f SystemState
forall s (m :: * -> *). MonadState s m => m s
Ms.get
popContext :: m (Maybe Context)
popContext = do
[Context]
v <- m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
if Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Context] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Context]
v
then do
let (a :: Context
a:r :: [Context]
r) = [Context]
v
[Context] -> m ()
forall (m :: * -> *). MonadState SystemState m => [Context] -> m ()
setCurrentContexts [Context]
r
Maybe Context -> m (Maybe Context)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Context -> m (Maybe Context))
-> Maybe Context -> m (Maybe Context)
forall a b. (a -> b) -> a -> b
$ Context -> Maybe Context
forall a. a -> Maybe a
Just Context
a
else
Maybe Context -> m (Maybe Context)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Context
forall a. Maybe a
Nothing
pushContext :: Context -> m ()
pushContext c :: Context
c = do
[Context]
v <- m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
[Context] -> m ()
forall (m :: * -> *). MonadState SystemState m => [Context] -> m ()
setCurrentContexts (Context
cContext -> [Context] -> [Context]
forall a. a -> [a] -> [a]
:[Context]
v)
parseProblemAtWithEnd :: SourcePos -> SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAtWithEnd start :: SourcePos
start end :: SourcePos
end level :: Severity
level code :: Integer
code msg :: String
msg = do
Bool
irrelevant <- Integer -> m Bool
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> m Bool
shouldIgnoreCode Integer
code
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
irrelevant (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
ParseNote -> m ()
forall (m :: * -> *). MonadState SystemState m => ParseNote -> m ()
addParseProblem ParseNote
note
where
note :: ParseNote
note = SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
start SourcePos
end Severity
level Integer
code String
msg
addParseProblem :: ParseNote -> m ()
addParseProblem note :: ParseNote
note =
(SystemState -> SystemState) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
Ms.modify (\state :: SystemState
state -> SystemState
state {
parseProblems :: [ParseNote]
parseProblems = ParseNote
noteParseNote -> [ParseNote] -> [ParseNote]
forall a. a -> [a] -> [a]
:SystemState -> [ParseNote]
parseProblems SystemState
state
})
parseProblemAt :: SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt pos :: SourcePos
pos = SourcePos -> SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAtWithEnd SourcePos
pos SourcePos
pos
parseProblemAtId :: Monad m => Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId :: Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId id :: Id
id level :: Severity
level code :: Integer
code msg :: String
msg = do
(start :: SourcePos
start, end :: SourcePos
end) <- Id -> SCParser m (SourcePos, SourcePos)
forall (m :: * -> *).
Monad m =>
Id -> SCParser m (SourcePos, SourcePos)
getSpanForId Id
id
SourcePos
-> SourcePos -> Severity -> Integer -> String -> SCParser m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAtWithEnd SourcePos
start SourcePos
end Severity
level Integer
code String
msg
parseNote :: Severity -> Integer -> String -> ParsecT s UserState m ()
parseNote c :: Severity
c l :: Integer
l a :: String
a = do
SourcePos
pos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
c Integer
l String
a
parseNoteAt :: SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt pos :: SourcePos
pos c :: Severity
c l :: Integer
l a :: String
a = ParseNote -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
ParseNote -> ParsecT s UserState m ()
addParseNote (ParseNote -> ParsecT s UserState m ())
-> ParseNote -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
pos SourcePos
pos Severity
c Integer
l String
a
parseNoteAtId :: Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
parseNoteAtId id :: Id
id c :: Severity
c l :: Integer
l a :: String
a = do
(start :: SourcePos
start, end :: SourcePos
end) <- Id -> SCParser m (SourcePos, SourcePos)
forall (m :: * -> *).
Monad m =>
Id -> SCParser m (SourcePos, SourcePos)
getSpanForId Id
id
ParseNote -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
ParseNote -> ParsecT s UserState m ()
addParseNote (ParseNote -> ParsecT String UserState (SCBase m) ())
-> ParseNote -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
start SourcePos
end Severity
c Integer
l String
a
parseNoteAtWithEnd :: SourcePos
-> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT s UserState m ()
parseNoteAtWithEnd start :: SourcePos
start end :: SourcePos
end c :: Severity
c l :: Integer
l a :: String
a = ParseNote -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
ParseNote -> ParsecT s UserState m ()
addParseNote (ParseNote -> ParsecT s UserState m ())
-> ParseNote -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
start SourcePos
end Severity
c Integer
l String
a
thenSkip :: ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
thenSkip main :: ParsecT s u m b
main follow :: ParsecT s u m a
follow = do
b
r <- ParsecT s u m b
main
ParsecT s u m a -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m a
follow
b -> ParsecT s u m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
r
unexpecting :: String -> ParsecT s u m a -> ParsecT s u m ()
unexpecting s :: String
s p :: ParsecT s u m a
p = ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$
(ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m a
p ParsecT s u m a -> ParsecT s u m () -> ParsecT s u m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT s u m ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail ("Unexpected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s)) ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> () -> ParsecT s u m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
notFollowedBy2 :: ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 = String -> ParsecT s u m a -> ParsecT s u m ()
forall s u (m :: * -> *) a.
String -> ParsecT s u m a -> ParsecT s u m ()
unexpecting ""
reluctantlyTill :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
reluctantlyTill p :: ParsecT s u m a
p end :: ParsecT s u m a
end =
(ParsecT s u m () -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m a -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m a
end) ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof) ParsecT s u m () -> ParsecT s u m [a] -> ParsecT s u m [a]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [a] -> ParsecT s u m [a]
forall (m :: * -> *) a. Monad m => a -> m a
return []) ParsecT s u m [a] -> ParsecT s u m [a] -> ParsecT s u m [a]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
a
x <- ParsecT s u m a
p
[a]
more <- ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
reluctantlyTill ParsecT s u m a
p ParsecT s u m a
end
[a] -> ParsecT s u m [a]
forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> ParsecT s u m [a]) -> [a] -> ParsecT s u m [a]
forall a b. (a -> b) -> a -> b
$ a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
more
ParsecT s u m [a] -> ParsecT s u m [a] -> ParsecT s u m [a]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> [a] -> ParsecT s u m [a]
forall (m :: * -> *) a. Monad m => a -> m a
return []
reluctantlyTill1 :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
reluctantlyTill1 p :: ParsecT s u m a
p end :: ParsecT s u m a
end = do
ParsecT s u m a -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 ParsecT s u m a
end
a
x <- ParsecT s u m a
p
[a]
more <- ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
reluctantlyTill ParsecT s u m a
p ParsecT s u m a
end
[a] -> ParsecT s u m [a]
forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> ParsecT s u m [a]) -> [a] -> ParsecT s u m [a]
forall a b. (a -> b) -> a -> b
$ a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
more
attempting :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
attempting rest :: ParsecT s u m a
rest branch :: ParsecT s u m a
branch =
(ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m a
branch ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m a
rest) ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m a
rest
orFail :: ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
orFail parser :: ParsecT s u m a
parser errorAction :: ParsecT s u m String
errorAction =
ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m a
parser ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT s u m String
errorAction ParsecT s u m String
-> (String -> ParsecT s u m a) -> ParsecT s u m a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> ParsecT s u m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail)
withParser :: (Id -> t -> b)
-> ParsecT s UserState m t -> ParsecT s UserState m b
withParser node :: Id -> t -> b
node parser :: ParsecT s UserState m t
parser = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
t
contents <- ParsecT s UserState m t
parser
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
b -> ParsecT s UserState m b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> ParsecT s UserState m b) -> b -> ParsecT s UserState m b
forall a b. (a -> b) -> a -> b
$ Id -> t -> b
node Id
id t
contents
wasIncluded :: ParsecT s u m a -> ParsecT s u m Bool
wasIncluded p :: ParsecT s u m a
p = Bool -> ParsecT s u m Bool -> ParsecT s u m Bool
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Bool
False (ParsecT s u m a
p ParsecT s u m a -> ParsecT s u m Bool -> ParsecT s u m Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)
acceptButWarn :: ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn parser :: ParsecT s u m a
parser level :: Severity
level code :: Integer
code note :: String
note =
ParsecT s u m () -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT s u m a
parser
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
level Integer
code String
note
)
parsecBracket :: ParsecT s u m t
-> (t -> ParsecT s u m a)
-> (t -> ParsecT s u m b)
-> ParsecT s u m b
parsecBracket before :: ParsecT s u m t
before after :: t -> ParsecT s u m a
after op :: t -> ParsecT s u m b
op = do
t
val <- ParsecT s u m t
before
(t -> ParsecT s u m b
op t
val ParsecT s u m b -> ParsecT s u m () -> ParsecT s u m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT s u m a -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (t -> ParsecT s u m a
after t
val)) ParsecT s u m b -> ParsecT s u m b -> ParsecT s u m b
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (t -> ParsecT s u m a
after t
val ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> String -> ParsecT s u m b
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "")
swapContext :: [Context] -> ParsecT s u m b -> ParsecT s u m b
swapContext contexts :: [Context]
contexts p :: ParsecT s u m b
p =
ParsecT s u m [Context]
-> ([Context] -> ParsecT s u m ())
-> ([Context] -> ParsecT s u m b)
-> ParsecT s u m b
forall s (m :: * -> *) t u t a b.
Stream s m t =>
ParsecT s u m t
-> (t -> ParsecT s u m a)
-> (t -> ParsecT s u m b)
-> ParsecT s u m b
parsecBracket (ParsecT s u m [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts ParsecT s u m [Context]
-> ParsecT s u m () -> ParsecT s u m [Context]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* [Context] -> ParsecT s u m ()
forall (m :: * -> *). MonadState SystemState m => [Context] -> m ()
setCurrentContexts [Context]
contexts)
[Context] -> ParsecT s u m ()
forall (m :: * -> *). MonadState SystemState m => [Context] -> m ()
setCurrentContexts
(ParsecT s u m b -> [Context] -> ParsecT s u m b
forall a b. a -> b -> a
const ParsecT s u m b
p)
withContext :: Context -> ParsecT s u m b -> ParsecT s u m b
withContext entry :: Context
entry p :: ParsecT s u m b
p = ParsecT s u m ()
-> (() -> ParsecT s u m (Maybe Context))
-> (() -> ParsecT s u m b)
-> ParsecT s u m b
forall s (m :: * -> *) t u t a b.
Stream s m t =>
ParsecT s u m t
-> (t -> ParsecT s u m a)
-> (t -> ParsecT s u m b)
-> ParsecT s u m b
parsecBracket (Context -> ParsecT s u m ()
forall (m :: * -> *). MonadState SystemState m => Context -> m ()
pushContext Context
entry) (ParsecT s u m (Maybe Context)
-> () -> ParsecT s u m (Maybe Context)
forall a b. a -> b -> a
const ParsecT s u m (Maybe Context)
forall (m :: * -> *). MonadState SystemState m => m (Maybe Context)
popContext) (ParsecT s u m b -> () -> ParsecT s u m b
forall a b. a -> b -> a
const ParsecT s u m b
p)
called :: String -> ParsecT s u m b -> ParsecT s u m b
called s :: String
s p :: ParsecT s u m b
p = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Context -> ParsecT s u m b -> ParsecT s u m b
forall s (m :: * -> *) t u b.
(Stream s m t, MonadState SystemState m) =>
Context -> ParsecT s u m b -> ParsecT s u m b
withContext (SourcePos -> String -> Context
ContextName SourcePos
pos String
s) ParsecT s u m b
p
withAnnotations :: [Annotation] -> ParsecT s u m b -> ParsecT s u m b
withAnnotations anns :: [Annotation]
anns =
Context -> ParsecT s u m b -> ParsecT s u m b
forall s (m :: * -> *) t u b.
(Stream s m t, MonadState SystemState m) =>
Context -> ParsecT s u m b -> ParsecT s u m b
withContext ([Annotation] -> Context
ContextAnnotation [Annotation]
anns)
readConditionContents :: Bool -> ParsecT String UserState (SCBase m) Token
readConditionContents single :: Bool
single =
ParsecT String UserState (SCBase m) Token
readCondContents ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
`attempting` ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
s <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
s String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
commonCommands) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1014 "Use 'if cmd; then ..' to check exit code, or 'if [[ $(cmd) == .. ]]' to check output.")
where
spacingOrLf :: ParsecT String UserState (SCBase m) String
spacingOrLf = Bool -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) String
condSpacing Bool
True
condSpacing :: Bool -> ParsecT String UserState (SCBase m) String
condSpacing required :: Bool
required = do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
space <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
required Bool -> Bool -> Bool
&& String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
space) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1035 "You are missing a required space here."
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
single Bool -> Bool -> Bool
&& '\n' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
space) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1080 "When breaking lines in [ ], you need \\ before the linefeed."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return String
space
typ :: ConditionType
typ = if Bool
single then ConditionType
SingleBracket else ConditionType
DoubleBracket
readCondBinaryOp :: ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readCondBinaryOp = ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token))
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m ()
guardArithmetic
Token -> Token -> Token
op <- ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) s (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m (Token -> Token -> Token)
getOp
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacingOrLf
(Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return Token -> Token -> Token
op
where
flaglessOps :: [String]
flaglessOps = [ "==", "!=", "<=", ">=", "=~", ">", "<", "=" ]
getOp :: ParsecT s UserState m (Token -> Token -> Token)
getOp = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
op <- ParsecT s UserState m String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m String -> ParsecT s u m String
readRegularOrEscaped ParsecT s UserState m String
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s u m String
anyOp
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
(Token -> Token -> Token)
-> ParsecT s UserState m (Token -> Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Token -> Token -> Token)
-> ParsecT s UserState m (Token -> Token -> Token))
-> (Token -> Token -> Token)
-> ParsecT s UserState m (Token -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token -> Token
TC_Binary Id
id ConditionType
typ String
op
anyOp :: ParsecT s u m String
anyOp = ParsecT s u m String
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s u m String
flagOp ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
flaglessOp ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m String
forall (m :: * -> *) a. MonadFail m => String -> m a
fail
"Expected comparison operator (don't wrap commands in []/[[]])"
flagOp :: ParsecT s u m String
flagOp = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ do
String
s <- ParsecT s u m String
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s u m String
readOp
Bool -> ParsecT s u m () -> ParsecT s u m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "-a" Bool -> Bool -> Bool
|| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "-o") (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Unexpected operator"
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
s
flaglessOp :: ParsecT s u m String
flaglessOp =
[ParsecT s u m String] -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ([ParsecT s u m String] -> ParsecT s u m String)
-> [ParsecT s u m String] -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ (String -> ParsecT s u m String)
-> [String] -> [ParsecT s u m String]
forall a b. (a -> b) -> [a] -> [b]
map (ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> (String -> ParsecT s u m String)
-> String
-> ParsecT s u m String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string) [String]
flaglessOps
readEscaped :: ParsecT s u m String -> ParsecT s u m String
readEscaped p :: ParsecT s u m String
p = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ ParsecT s u m String
withEscape ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
withQuotes
where
withEscape :: ParsecT s u m String
withEscape = do
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\'
String -> String
escaped (String -> String) -> ParsecT s u m String -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
p
withQuotes :: ParsecT s u m String
withQuotes = do
Char
c <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "'\""
String
s <- ParsecT s u m String
p
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT s u m String) -> String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> String
escaped String
s
escaped :: String -> String
escaped s :: String
s = if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
s) "<>()" then '\\'Char -> String -> String
forall a. a -> [a] -> [a]
:String
s else String
s
readRegularOrEscaped :: ParsecT s u m String -> ParsecT s u m String
readRegularOrEscaped p :: ParsecT s u m String
p = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m String -> ParsecT s u m String
readEscaped ParsecT s u m String
p ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
p
guardArithmetic :: ParsecT s u m ()
guardArithmetic = do
ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m () -> ParsecT s u m ())
-> (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m ()
-> ParsecT s u m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT s u m () -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ ParsecT s u m Char -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "+*/%") ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "- ")
Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1076 (String -> ParsecT s u m ()) -> String -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$
if Bool
single
then "Trying to do math? Use e.g. [ $((i/2+7)) -ge 18 ]."
else "Trying to do math? Use e.g. [[ $((i/2+7)) -ge 18 ]]."
readCondUnaryExp :: ParsecT String UserState (SCBase m) Token
readCondUnaryExp = do
Token -> Token
op <- ParsecT String UserState (SCBase m) (Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Token -> Token)
readCondUnaryOp
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(Token -> Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Token -> Token
op ParsecT String UserState (SCBase m) Token
readCondWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
`orFail` do
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1019 "Expected this to be an argument to the unary condition."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "Expected an argument for the unary operator"
readCondUnaryOp :: ParsecT String UserState (SCBase m) (Token -> Token)
readCondUnaryOp = ParsecT String UserState (SCBase m) (Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) (Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token))
-> ParsecT String UserState (SCBase m) (Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token)
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
s <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s u m String
readOp
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacingOrLf
(Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token))
-> (Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token)
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token
TC_Unary Id
id ConditionType
typ String
s
readOp :: ParsecT s u m String
readOp = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ do
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-' ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall (m :: * -> *) s (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m Char
weirdDash
String
s <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m String
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected a test operator"
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return ('-'Char -> String -> String
forall a. a -> [a] -> [a]
:String
s)
weirdDash :: ParsecT s u m Char
weirdDash = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "\x058A\x05BE\x2010\x2011\x2012\x2013\x2014\x2015\xFE63\xFF0D"
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1100
"This is a unicode dash. Delete and retype as ASCII minus."
Char -> ParsecT s u m Char
forall (m :: * -> *) a. Monad m => a -> m a
return '-'
readCondWord :: ParsecT String UserState (SCBase m) Token
readCondWord = do
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "]"))
Token
x <- ParsecT String UserState (SCBase m) Token
readNormalWord
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String -> Token -> Bool
endedWith "]" Token
x Bool -> Bool -> Bool
&& Token -> Bool
notArrayIndex Token
x) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1020 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
"You need a space before the " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (if Bool
single then "]" else "]]") String -> String -> String
forall a. [a] -> [a] -> [a]
++ "."
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Missing space before ]"
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
single Bool -> Bool -> Bool
&& String -> Token -> Bool
endedWith ")" Token
x) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1021
"You need a space before the \\)"
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Missing space before )"
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
x
where endedWith :: String -> Token -> Bool
endedWith str :: String
str (T_NormalWord id :: Id
id s :: [Token]
s@(_:_)) =
case [Token] -> Token
forall a. [a] -> a
last [Token]
s of T_Literal id :: Id
id s :: String
s -> String
str String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
s
_ -> Bool
False
endedWith _ _ = Bool
False
notArrayIndex :: Token -> Bool
notArrayIndex (T_NormalWord id :: Id
id s :: [Token]
s@(_:T_Literal _ t :: String
t:_)) = String
t String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= "["
notArrayIndex _ = Bool
True
readCondAndOp :: ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readCondAndOp = (Id -> ConditionType -> String -> Token -> Token -> Token)
-> String
-> Bool
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) b.
Monad m =>
(Id -> ConditionType -> String -> b)
-> String -> Bool -> ParsecT String UserState (SCBase m) b
readAndOrOp Id -> ConditionType -> String -> Token -> Token -> Token
TC_And "&&" Bool
False ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Id -> ConditionType -> String -> Token -> Token -> Token)
-> String
-> Bool
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) b.
Monad m =>
(Id -> ConditionType -> String -> b)
-> String -> Bool -> ParsecT String UserState (SCBase m) b
readAndOrOp Id -> ConditionType -> String -> Token -> Token -> Token
TC_And "-a" Bool
True
readCondOrOp :: ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readCondOrOp = do
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m ()
guardArithmetic
(Id -> ConditionType -> String -> Token -> Token -> Token)
-> String
-> Bool
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) b.
Monad m =>
(Id -> ConditionType -> String -> b)
-> String -> Bool -> ParsecT String UserState (SCBase m) b
readAndOrOp Id -> ConditionType -> String -> Token -> Token -> Token
TC_Or "||" Bool
False ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Id -> ConditionType -> String -> Token -> Token -> Token)
-> String
-> Bool
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) b.
Monad m =>
(Id -> ConditionType -> String -> b)
-> String -> Bool -> ParsecT String UserState (SCBase m) b
readAndOrOp Id -> ConditionType -> String -> Token -> Token -> Token
TC_Or "-o" Bool
True
readAndOrOp :: (Id -> ConditionType -> String -> b)
-> String -> Bool -> ParsecT String UserState (SCBase m) b
readAndOrOp node :: Id -> ConditionType -> String -> b
node op :: String
op requiresSpacing :: Bool
requiresSpacing = do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) s (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m Char
weirdDash
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
x <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
op
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Bool -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) String
condSpacing Bool
requiresSpacing
b -> ParsecT String UserState (SCBase m) b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> ParsecT String UserState (SCBase m) b)
-> b -> ParsecT String UserState (SCBase m) b
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> b
node Id
id ConditionType
typ String
x
readCondNullaryOrBinary :: ParsecT String UserState (SCBase m) Token
readCondNullaryOrBinary = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Token
x <- ParsecT String UserState (SCBase m) Token
readCondWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
`attempting` (do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '[')
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1026 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ if Bool
single
then "If grouping expressions inside [..], use \\( ..\\)."
else "If grouping expressions inside [[..]], use ( .. )."
)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
(do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Bool
isRegex <- ParsecT String UserState (SCBase m) Bool
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Bool
regexOperatorAhead
Token -> Token -> Token
op <- ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readCondBinaryOp
Token
y <- if Bool
isRegex
then ParsecT String UserState (SCBase m) Token
readRegex
else ParsecT String UserState (SCBase m) Token
readCondWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1027 "Expected another argument for this operator." ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. MonadPlus m => m a
mzero)
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token
x Token -> Token -> Token
`op` Token
y)
) ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ( do
Token -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Token -> ParsecT String UserState (SCBase m) ()
checkTrailingOp Token
x
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token -> Token
TC_Nullary Id
id ConditionType
typ Token
x
)
checkTrailingOp :: Token -> ParsecT String UserState (SCBase m) ()
checkTrailingOp x :: Token
x = ParsecT String UserState (SCBase m) ()
-> Maybe (ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
forall a. a -> Maybe a -> a
fromMaybe (() -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()) (Maybe (ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ())
-> Maybe (ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
(T_Literal id :: Id
id str :: String
str) <- Token -> Maybe Token
getTrailingUnquotedLiteral Token
x
String
trailingOp <- [String] -> Maybe String
forall a. [a] -> Maybe a
listToMaybe ((String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
str) [String]
binaryTestOps)
ParsecT String UserState (SCBase m) ()
-> Maybe (ParsecT String UserState (SCBase m) ())
forall (m :: * -> *) a. Monad m => a -> m a
return (ParsecT String UserState (SCBase m) ()
-> Maybe (ParsecT String UserState (SCBase m) ()))
-> ParsecT String UserState (SCBase m) ()
-> Maybe (ParsecT String UserState (SCBase m) ())
forall a b. (a -> b) -> a -> b
$ Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
id Severity
ErrorC 1108 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
"You need a space before and after the " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
trailingOp String -> String -> String
forall a. [a] -> [a] -> [a]
++ " ."
readCondGroup :: ParsecT String UserState (SCBase m) Token
readCondGroup = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
lparen <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m String -> ParsecT s u m String
readRegularOrEscaped (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "(")
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
single Bool -> Bool -> Bool
&& String
lparen String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "(") (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> m ()
singleWarning SourcePos
pos
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
single Bool -> Bool -> Bool
&& String
lparen String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "\\(") (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> m ()
doubleWarning SourcePos
pos
Bool -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) String
condSpacing Bool
single
Token
x <- ParsecT String UserState (SCBase m) Token
readCondContents
SourcePos
cpos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
rparen <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m String -> ParsecT s u m String
readRegularOrEscaped (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string ")")
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Bool -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) String
condSpacing Bool
single
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
single Bool -> Bool -> Bool
&& String
rparen String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== ")") (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> m ()
singleWarning SourcePos
cpos
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
single Bool -> Bool -> Bool
&& String
rparen String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "\\)") (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> m ()
doubleWarning SourcePos
cpos
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token -> Token
TC_Group Id
id ConditionType
typ Token
x
where
singleWarning :: SourcePos -> m ()
singleWarning pos :: SourcePos
pos =
SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1028 "In [..] you have to escape \\( \\) or preferably combine [..] expressions."
doubleWarning :: SourcePos -> m ()
doubleWarning pos :: SourcePos
pos =
SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1029 "In [[..]] you shouldn't escape ( or )."
regexOperatorAhead :: ParsecT s u m Bool
regexOperatorAhead = ParsecT s u m Bool -> ParsecT s u m Bool
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (do
ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "=~") ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "~=")
Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)
ParsecT s u m Bool -> ParsecT s u m Bool -> ParsecT s u m Bool
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
readRegex :: ParsecT String UserState (SCBase m) Token
readRegex = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "regex" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
parts <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Token
readPart
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id [Token]
parts
where
readPart :: ParsecT String UserState (SCBase m) Token
readPart = [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
readGroup,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted,
ParsecT String UserState (SCBase m) Token
readDoubleQuoted,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpression,
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s s a.
(Stream s m Char, MonadState s m) =>
ParsecT s UserState m a -> ParsecT s UserState m Token
readLiteralForParser (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) Token
readNormalLiteral "( ",
String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
String -> ParsecT s UserState m Token
readLiteralString "|",
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
ParsecT s UserState m Token
readGlobLiteral
]
readGlobLiteral :: ParsecT s UserState m Token
readGlobLiteral = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
s <- ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
extglobStart ParsecT s UserState m Char
-> ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "{}[]$"
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id [Char
s]
readGroup :: ParsecT String UserState (SCBase m) Token
readGroup = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "regex grouping" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Token
p1 <- String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
String -> ParsecT s UserState m Token
readLiteralString "("
[Token]
parts <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) Token
readPart ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readRegexLiteral)
Token
p2 <- String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
String -> ParsecT s UserState m Token
readLiteralString ")"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id (Token
p1Token -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:([Token]
parts [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token
p2]))
readRegexLiteral :: ParsecT String UserState (SCBase m) Token
readRegexLiteral = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a.
Monad m =>
ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) String
readGenericLiteral1 (ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
singleQuote ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
doubleQuotable ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "()")
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
readLiteralString :: String -> ParsecT s UserState m Token
readLiteralString s :: String
s = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
s
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
readCondTerm :: ParsecT String UserState (SCBase m) Token
readCondTerm = do
Token
term <- ParsecT String UserState (SCBase m) Token
readCondNot ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readCondExpr
Bool -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) String
condSpacing Bool
False
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
term
readCondNot :: ParsecT String UserState (SCBase m) Token
readCondNot = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '!'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacingOrLf
Token
expr <- ParsecT String UserState (SCBase m) Token
readCondExpr
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> String -> Token -> Token
TC_Unary Id
id ConditionType
typ "!" Token
expr
readCondExpr :: ParsecT String UserState (SCBase m) Token
readCondExpr =
ParsecT String UserState (SCBase m) Token
readCondGroup ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readCondUnaryExp ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readCondNullaryOrBinary
readCondOr :: ParsecT String UserState (SCBase m) Token
readCondOr = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
chainl1 ParsecT String UserState (SCBase m) Token
readCondAnd ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readCondAndOp
readCondAnd :: ParsecT String UserState (SCBase m) Token
readCondAnd = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
chainl1 ParsecT String UserState (SCBase m) Token
readCondTerm ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readCondOrOp
readCondContents :: ParsecT String UserState (SCBase m) Token
readCondContents = ParsecT String UserState (SCBase m) Token
readCondOr
prop_a1 :: Bool
prop_a1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents " n++ + ++c"
prop_a2 :: Bool
prop_a2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "$N*4-(3,2)"
prop_a3 :: Bool
prop_a3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "n|=2<<1"
prop_a4 :: Bool
prop_a4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "n &= 2 **3"
prop_a5 :: Bool
prop_a5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "1 |= 4 && n >>= 4"
prop_a6 :: Bool
prop_a6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents " 1 | 2 ||3|4"
prop_a7 :: Bool
prop_a7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "3*2**10"
prop_a8 :: Bool
prop_a8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "3"
prop_a9 :: Bool
prop_a9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "a^!-b"
prop_a10 :: Bool
prop_a10= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "! $?"
prop_a11 :: Bool
prop_a11= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "10#08 * 16#f"
prop_a12 :: Bool
prop_a12= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "\"$((3+2))\" + '37'"
prop_a13 :: Bool
prop_a13= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "foo[9*y+x]++"
prop_a14 :: Bool
prop_a14= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "1+`echo 2`"
prop_a15 :: Bool
prop_a15= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "foo[`echo foo | sed s/foo/4/g` * 3] + 4"
prop_a16 :: Bool
prop_a16= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "$foo$bar"
prop_a17 :: Bool
prop_a17= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "i<(0+(1+1))"
prop_a18 :: Bool
prop_a18= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "a?b:c"
prop_a19 :: Bool
prop_a19= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "\\\n3 +\\\n 2"
prop_a20 :: Bool
prop_a20= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "a ? b ? c : d : e"
prop_a21 :: Bool
prop_a21= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "a ? b : c ? d : e"
prop_a22 :: Bool
prop_a22= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "!!a"
prop_a23 :: Bool
prop_a23= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents "~0"
readArithmeticContents :: Monad m => SCParser m Token
readArithmeticContents :: SCParser m Token
readArithmeticContents =
SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSequence
where
spacing :: ParsecT String UserState (SCBase m) String
spacing =
let lf :: ParsecT s u m Char
lf = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "\\\n") ParsecT s u m String -> ParsecT s u m Char -> ParsecT s u m Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT s u m Char
forall (m :: * -> *) a. Monad m => a -> m a
return '\n'
in ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
lf)
splitBy :: ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
splitBy x :: ParsecT String UserState (SCBase m) Token
x ops :: [String]
ops = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
chainl1 ParsecT String UserState (SCBase m) Token
x ([String]
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
[String]
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readBinary [String]
ops)
readBinary :: [String]
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readBinary ops :: [String]
ops = [String]
-> (Id -> String -> Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) b.
Monad m =>
[String]
-> (Id -> String -> b) -> ParsecT String UserState (SCBase m) b
readComboOp [String]
ops Id -> String -> Token -> Token -> Token
TA_Binary
readComboOp :: [String]
-> (Id -> String -> b) -> ParsecT String UserState (SCBase m) b
readComboOp op :: [String]
op token :: Id -> String -> b
token = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
op <- [ParsecT String UserState (SCBase m) String]
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ((String -> ParsecT String UserState (SCBase m) String)
-> [String] -> [ParsecT String UserState (SCBase m) String]
forall a b. (a -> b) -> [a] -> [b]
map (\x :: String
x -> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ do
String
s <- String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
x
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
failIfIncompleteOp
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return String
s
) [String]
op)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
b -> ParsecT String UserState (SCBase m) b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> ParsecT String UserState (SCBase m) b)
-> b -> ParsecT String UserState (SCBase m) b
forall a b. (a -> b) -> a -> b
$ Id -> String -> b
token Id
id String
op
failIfIncompleteOp :: ParsecT s u m ()
failIfIncompleteOp = ParsecT s u m Char -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT s u m Char -> ParsecT s u m ())
-> ParsecT s u m Char -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "&|<>="
readMinusOp :: ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readMinusOp = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-'
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
failIfIncompleteOp
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
(str :: String
str, alt :: String
alt) <- ParsecT String UserState (SCBase m) (String, String)
-> ParsecT String UserState (SCBase m) (String, String)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) (String, String)
-> ParsecT String UserState (SCBase m) (String, String))
-> ([ParsecT String UserState (SCBase m) (String, String)]
-> ParsecT String UserState (SCBase m) (String, String))
-> [ParsecT String UserState (SCBase m) (String, String)]
-> ParsecT String UserState (SCBase m) (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ParsecT String UserState (SCBase m) (String, String)]
-> ParsecT String UserState (SCBase m) (String, String)
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ([ParsecT String UserState (SCBase m) (String, String)]
-> ParsecT String UserState (SCBase m) (String, String))
-> [ParsecT String UserState (SCBase m) (String, String)]
-> ParsecT String UserState (SCBase m) (String, String)
forall a b. (a -> b) -> a -> b
$ ((String, String)
-> ParsecT String UserState (SCBase m) (String, String))
-> [(String, String)]
-> [ParsecT String UserState (SCBase m) (String, String)]
forall a b. (a -> b) -> [a] -> [b]
map (String, String)
-> ParsecT String UserState (SCBase m) (String, String)
forall s (m :: * -> *) (m :: * -> *) b.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
(String, b) -> ParsecT s UserState m (String, b)
tryOp [
("lt", "<"),
("gt", ">"),
("le", "<="),
("ge", ">="),
("eq", "=="),
("ne", "!=")
]
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1106 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ "In arithmetic contexts, use " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
alt String -> String -> String
forall a. [a] -> [a] -> [a]
++ " instead of -" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
(Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token))
-> (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token -> Token
TA_Binary Id
id "-"
where
tryOp :: (String, b) -> ParsecT s UserState m (String, b)
tryOp (str :: String
str, alt :: b
alt) = ParsecT s UserState m (String, b)
-> ParsecT s UserState m (String, b)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m (String, b)
-> ParsecT s UserState m (String, b))
-> ParsecT s UserState m (String, b)
-> ParsecT s UserState m (String, b)
forall a b. (a -> b) -> a -> b
$ do
String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
str
ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing1
(String, b) -> ParsecT s UserState m (String, b)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
str, b
alt)
readArrayIndex :: ParsecT String UserState (SCBase m) Token
readArrayIndex = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '['
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
middle <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) s u a.
(Stream s m Char, MonadState s m) =>
ParsecT s u m a -> ParsecT s u m String
readStringForParser ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ']'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> SourcePos -> String -> Token
T_UnparsedIndex Id
id SourcePos
pos String
middle
literal :: String -> ParsecT s UserState m Token
literal s :: String
s = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
s
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
s
readVariable :: ParsecT String UserState (SCBase m) Token
readVariable = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
name <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName
[Token]
indices <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArrayIndex
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
TA_Variable Id
id String
name [Token]
indices
readExpansion :: ParsecT String UserState (SCBase m) Token
readExpansion = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
pieces <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token])
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleQuoted,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalDollar,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readUnquotedBackTicked,
String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
String -> ParsecT s UserState m Token
literal "#",
String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) Token
readNormalLiteral "+-*/=%^,]?:"
]
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
TA_Expansion Id
id [Token]
pieces
readGroup :: ParsecT String UserState (SCBase m) Token
readGroup = do
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
Token
s <- ParsecT String UserState (SCBase m) Token
readSequence
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
s
readArithTerm :: ParsecT String UserState (SCBase m) Token
readArithTerm = ParsecT String UserState (SCBase m) Token
readGroup ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readVariable ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExpansion
readSequence :: ParsecT String UserState (SCBase m) Token
readSequence = do
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
l <- ParsecT String UserState (SCBase m) Token
readAssignment ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` (Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ',' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
TA_Sequence Id
id [Token]
l
readAssignment :: ParsecT String UserState (SCBase m) Token
readAssignment = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
chainr1 ParsecT String UserState (SCBase m) Token
readTrinary ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readAssignmentOp
readAssignmentOp :: ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readAssignmentOp = [String]
-> (Id -> String -> Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) b.
Monad m =>
[String]
-> (Id -> String -> b) -> ParsecT String UserState (SCBase m) b
readComboOp ["=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|="] Id -> String -> Token -> Token -> Token
TA_Assignment
readTrinary :: ParsecT String UserState (SCBase m) Token
readTrinary = do
Token
x <- ParsecT String UserState (SCBase m) Token
readLogicalOr
do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "?"
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token
y <- ParsecT String UserState (SCBase m) Token
readTrinary
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string ":"
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token
z <- ParsecT String UserState (SCBase m) Token
readTrinary
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token -> Token
TA_Trinary Id
id Token
x Token
y Token
z
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
x
readLogicalOr :: ParsecT String UserState (SCBase m) Token
readLogicalOr = ParsecT String UserState (SCBase m) Token
readLogicalAnd ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["||"]
readLogicalAnd :: ParsecT String UserState (SCBase m) Token
readLogicalAnd = ParsecT String UserState (SCBase m) Token
readBitOr ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["&&"]
readBitOr :: ParsecT String UserState (SCBase m) Token
readBitOr = ParsecT String UserState (SCBase m) Token
readBitXor ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["|"]
readBitXor :: ParsecT String UserState (SCBase m) Token
readBitXor = ParsecT String UserState (SCBase m) Token
readBitAnd ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["^"]
readBitAnd :: ParsecT String UserState (SCBase m) Token
readBitAnd = ParsecT String UserState (SCBase m) Token
readEquated ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["&"]
readEquated :: ParsecT String UserState (SCBase m) Token
readEquated = ParsecT String UserState (SCBase m) Token
readCompared ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["==", "!="]
readCompared :: ParsecT String UserState (SCBase m) Token
readCompared = ParsecT String UserState (SCBase m) Token
readShift ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["<=", ">=", "<", ">"]
readShift :: ParsecT String UserState (SCBase m) Token
readShift = ParsecT String UserState (SCBase m) Token
readAddition ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["<<", ">>"]
readAddition :: ParsecT String UserState (SCBase m) Token
readAddition = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
chainl1 ParsecT String UserState (SCBase m) Token
readMultiplication ([String]
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
[String]
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readBinary ["+"] ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Token -> Token -> Token)
readMinusOp)
readMultiplication :: ParsecT String UserState (SCBase m) Token
readMultiplication = ParsecT String UserState (SCBase m) Token
readExponential ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["*", "/", "%"]
readExponential :: ParsecT String UserState (SCBase m) Token
readExponential = ParsecT String UserState (SCBase m) Token
readAnyNegated ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
-> [String] -> ParsecT String UserState (SCBase m) Token
`splitBy` ["**"]
readAnyNegated :: ParsecT String UserState (SCBase m) Token
readAnyNegated = ParsecT String UserState (SCBase m) Token
readNegated ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readAnySigned
readNegated :: ParsecT String UserState (SCBase m) Token
readNegated = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
op <- String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "!~"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token
x <- ParsecT String UserState (SCBase m) Token
readAnyNegated
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
TA_Unary Id
id [Char
op] Token
x
readAnySigned :: ParsecT String UserState (SCBase m) Token
readAnySigned = ParsecT String UserState (SCBase m) Token
readSigned ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readAnycremented
readSigned :: ParsecT String UserState (SCBase m) Token
readSigned = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
op <- [ParsecT String UserState (SCBase m) Char]
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ((Char -> ParsecT String UserState (SCBase m) Char)
-> String -> [ParsecT String UserState (SCBase m) Char]
forall a b. (a -> b) -> [a] -> [b]
map Char -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *).
Monad m =>
Char -> ParsecT String UserState (SCBase m) Char
readSignOp "+-")
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token
x <- ParsecT String UserState (SCBase m) Token
readAnycremented
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
TA_Unary Id
id [Char
op] Token
x
where
readSignOp :: Char -> ParsecT String UserState (SCBase m) Char
readSignOp c :: Char
c = ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ do
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Char -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
c
readAnycremented :: ParsecT String UserState (SCBase m) Token
readAnycremented = ParsecT String UserState (SCBase m) Token
readNormalOrPostfixIncremented ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readPrefixIncremented
readPrefixIncremented :: ParsecT String UserState (SCBase m) Token
readPrefixIncremented = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
op <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "++" ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "--"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token
x <- ParsecT String UserState (SCBase m) Token
readArithTerm
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
TA_Unary Id
id (String
op String -> String -> String
forall a. [a] -> [a] -> [a]
++ "|") Token
x
readNormalOrPostfixIncremented :: ParsecT String UserState (SCBase m) Token
readNormalOrPostfixIncremented = do
Token
x <- ParsecT String UserState (SCBase m) Token
readArithTerm
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
op <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "++" ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "--"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
TA_Unary Id
id ('|'Char -> String -> String
forall a. a -> [a] -> [a]
:String
op) Token
x
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
x
prop_readCondition :: Bool
prop_readCondition = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ \\( a = b \\) -a \\( c = d \\) ]"
prop_readCondition2 :: Bool
prop_readCondition2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ (a = b) || (c = d) ]]"
prop_readCondition3 :: Bool
prop_readCondition3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $c = [[:alpha:].~-] ]]"
prop_readCondition4 :: Bool
prop_readCondition4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $c =~ *foo* ]]"
prop_readCondition5 :: Bool
prop_readCondition5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $c =~ f( ]] )* ]]"
prop_readCondition5a :: Bool
prop_readCondition5a = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $c =~ a(b) ]]"
prop_readCondition5b :: Bool
prop_readCondition5b = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $c =~ f( ($var ]]) )* ]]"
prop_readCondition6 :: Bool
prop_readCondition6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $c =~ ^[yY]$ ]]"
prop_readCondition7 :: Bool
prop_readCondition7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ ${line} =~ ^[[:space:]]*# ]]"
prop_readCondition8 :: Bool
prop_readCondition8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $l =~ ogg|flac ]]"
prop_readCondition9 :: Bool
prop_readCondition9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ foo -a -f bar ]"
prop_readCondition10 :: Bool
prop_readCondition10 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[\na == b\n||\nc == d ]]"
prop_readCondition10a :: Bool
prop_readCondition10a= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[\na == b ||\nc == d ]]"
prop_readCondition10b :: Bool
prop_readCondition10b= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ a == b\n||\nc == d ]]"
prop_readCondition11 :: Bool
prop_readCondition11 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ a == b ||\n c == d ]]"
prop_readCondition12 :: Bool
prop_readCondition12 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ a == b \n -o c == d ]"
prop_readCondition13 :: Bool
prop_readCondition13 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ foo =~ ^fo{1,3}$ ]]"
prop_readCondition14 :: Bool
prop_readCondition14 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ foo '>' bar ]"
prop_readCondition15 :: Bool
prop_readCondition15 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ foo \">=\" bar ]"
prop_readCondition16 :: Bool
prop_readCondition16 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ foo \\< bar ]"
prop_readCondition17 :: Bool
prop_readCondition17 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ ${file::1} = [-.\\|/\\\\] ]]"
prop_readCondition18 :: Bool
prop_readCondition18 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ ]"
prop_readCondition19 :: Bool
prop_readCondition19 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[ '(' x \")\" ]"
prop_readCondition20 :: Bool
prop_readCondition20 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ echo_rc -eq 0 ]]"
prop_readCondition21 :: Bool
prop_readCondition21 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $1 =~ ^(a\\ b)$ ]]"
prop_readCondition22 :: Bool
prop_readCondition22 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ $1 =~ \\.a\\.(\\.b\\.)\\.c\\. ]]"
prop_readCondition23 :: Bool
prop_readCondition23 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCondition "[[ -v arr[$var] ]]"
readCondition :: ParsecT String UserState (SCBase m) Token
readCondition = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "test expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
SourcePos
opos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
open <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "[[") ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "["
let single :: Bool
single = String
open String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "["
let typ :: ConditionType
typ = if Bool
single then ConditionType
SingleBracket else ConditionType
DoubleBracket
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
space <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
space) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAtWithEnd SourcePos
opos SourcePos
pos Severity
ErrorC 1035 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ "You need a space after the " String -> String -> String
forall a. [a] -> [a] -> [a]
++
if Bool
single
then "[ and before the ]."
else "[[ and before the ]]."
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
single Bool -> Bool -> Bool
&& '\n' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
space) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1080 "You need \\ before line feeds to break lines in [ ]."
Token
condition <- Bool -> ParsecT String UserState (SCBase m) Token
readConditionContents Bool
single ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
Bool -> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> ParsecT String UserState (SCBase m) ())
-> (String -> Bool)
-> String
-> ParsecT String UserState (SCBase m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ String
space
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "]"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token
TC_Empty Id
id ConditionType
typ
SourcePos
cpos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
close <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "]]") ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "]" ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected test to end here (don't wrap commands in []/[[]])"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
open String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "[[" Bool -> Bool -> Bool
&& String
close String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= "]]") (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
cpos Severity
ErrorC 1033 "Did you mean ]] ?"
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
open String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "[" Bool -> Bool -> Bool
&& String
close String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= "]" ) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
opos Severity
ErrorC 1034 "Did you mean [[ ?"
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
readCmdWord
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> ConditionType -> Token -> Token
T_Condition Id
id ConditionType
typ Token
condition
readAnnotationPrefix :: ParsecT s UserState m String
readAnnotationPrefix = do
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '#'
ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "shellcheck"
prop_readAnnotation1 :: Bool
prop_readAnnotation1 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation "# shellcheck disable=1234,5678\n"
prop_readAnnotation2 :: Bool
prop_readAnnotation2 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation "# shellcheck disable=SC1234 disable=SC5678\n"
prop_readAnnotation3 :: Bool
prop_readAnnotation3 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation "# shellcheck disable=SC1234 source=/dev/null disable=SC5678\n"
prop_readAnnotation4 :: Bool
prop_readAnnotation4 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation "# shellcheck cats=dogs disable=SC1234\n"
prop_readAnnotation5 :: Bool
prop_readAnnotation5 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation "# shellcheck disable=SC2002 # All cats are precious\n"
prop_readAnnotation6 :: Bool
prop_readAnnotation6 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation "# shellcheck disable=SC1234 # shellcheck foo=bar\n"
readAnnotation :: ParsecT String UserState (SCBase m) [Annotation]
readAnnotation = String
-> ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "shellcheck directive" (ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [Annotation])
-> ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [Annotation]
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m String
readAnnotationPrefix
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotationWithoutPrefix
readAnnotationWithoutPrefix :: ParsecT String UserState (SCBase m) [Annotation]
readAnnotationWithoutPrefix = do
[[Annotation]]
values <- ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [[Annotation]]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readKey
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readAnyComment
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s UserState m ()
parseNote Severity
ErrorC 1125 "Invalid key=value pair? Ignoring the rest of this directive starting here."
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\n")
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Annotation] -> ParsecT String UserState (SCBase m) [Annotation])
-> [Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall a b. (a -> b) -> a -> b
$ [[Annotation]] -> [Annotation]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Annotation]]
values
where
readKey :: ParsecT String UserState (SCBase m) [Annotation]
readKey = do
SourcePos
keyPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
key <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-')
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '=' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected '=' after directive key"
[Annotation]
annotations <- case String
key of
"disable" -> ParsecT String UserState (SCBase m) Annotation
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m Annotation
readCode ParsecT String UserState (SCBase m) Annotation
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Annotation]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ','
where
readCode :: ParsecT s u m Annotation
readCode = do
ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s u m String -> ParsecT s u m ())
-> ParsecT s u m String -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "SC"
String
int <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
Annotation -> ParsecT s u m Annotation
forall (m :: * -> *) a. Monad m => a -> m a
return (Annotation -> ParsecT s u m Annotation)
-> Annotation -> ParsecT s u m Annotation
forall a b. (a -> b) -> a -> b
$ Integer -> Annotation
DisableComment (String -> Integer
forall a. Read a => String -> a
read String
int)
"enable" -> ParsecT String UserState (SCBase m) Annotation
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m Annotation
readName ParsecT String UserState (SCBase m) Annotation
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Annotation]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ','
where
readName :: ParsecT s u m Annotation
readName = String -> Annotation
EnableComment (String -> Annotation)
-> ParsecT s u m String -> ParsecT s u m Annotation
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-')
"source" -> do
String
filename <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf " \n"
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return [String -> Annotation
SourceOverride String
filename]
"source-path" -> do
String
dirname <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf " \n"
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return [String -> Annotation
SourcePath String
dirname]
"shell" -> do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
shell <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf " \n"
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe Shell -> Bool
forall a. Maybe a -> Bool
isNothing (Maybe Shell -> Bool) -> Maybe Shell -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Maybe Shell
shellForExecutable String
shell) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
ErrorC 1103
"This shell type is unknown. Use e.g. sh or bash."
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return [String -> Annotation
ShellOverride String
shell]
_ -> do
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
keyPos Severity
WarningC 1107 "This directive is unknown. It will be ignored."
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill` ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return []
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return [Annotation]
annotations
readAnnotations :: ParsecT String UserState (SCBase m) [Annotation]
readAnnotations = do
[[Annotation]]
annotations <- ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [[Annotation]]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotation ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [Annotation]
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing)
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Annotation] -> ParsecT String UserState (SCBase m) [Annotation])
-> [Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall a b. (a -> b) -> a -> b
$ [[Annotation]] -> [Annotation]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Annotation]]
annotations
= do
String -> ParsecT s UserState m String -> ParsecT s UserState m ()
forall s u (m :: * -> *) a.
String -> ParsecT s u m a -> ParsecT s u m ()
unexpecting "shellcheck annotation" ParsecT s UserState m String
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m String
readAnnotationPrefix
ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readAnyComment
= do
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '#'
ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Char -> ParsecT s u m String)
-> ParsecT s u m Char -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\r\n"
prop_readNormalWord :: Bool
prop_readNormalWord = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "'foo'\"bar\"{1..3}baz$(lol)"
prop_readNormalWord2 :: Bool
prop_readNormalWord2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "foo**(foo)!!!(@@(bar))"
prop_readNormalWord3 :: Bool
prop_readNormalWord3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "foo#"
prop_readNormalWord4 :: Bool
prop_readNormalWord4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "$\"foo\"$'foo\nbar'"
prop_readNormalWord5 :: Bool
prop_readNormalWord5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "${foo}}"
prop_readNormalWord6 :: Bool
prop_readNormalWord6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "foo/{}"
prop_readNormalWord7 :: Bool
prop_readNormalWord7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "foo\\\nbar"
prop_readNormalWord8 :: Bool
prop_readNormalWord8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSubshell "(foo\\ \nbar)"
prop_readNormalWord9 :: Bool
prop_readNormalWord9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSubshell "(foo\\ ;\nbar)"
prop_readNormalWord10 :: Bool
prop_readNormalWord10 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "\x201Chello\x201D"
prop_readNormalWord11 :: Bool
prop_readNormalWord11 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "\x2018hello\x2019"
prop_readNormalWord12 :: Bool
prop_readNormalWord12 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "hello\x2018"
readNormalWord :: ParsecT String UserState (SCBase m) Token
readNormalWord = String -> ParsecT String UserState (SCBase m) Token
readNormalishWord ""
readNormalishWord :: String -> ParsecT String UserState (SCBase m) Token
readNormalishWord end :: String
end = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
[Token]
x <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT String UserState (SCBase m) Token
readNormalWordPart String
end)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
SourcePos -> [Token] -> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) (m :: * -> *).
(MonadState SystemState f, MonadReader (Environment m) f) =>
SourcePos -> [Token] -> f ()
checkPossibleTermination SourcePos
pos [Token]
x
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id [Token]
x
readIndexSpan :: ParsecT String UserState (SCBase m) Token
readIndexSpan = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
x <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> ParsecT String UserState (SCBase m) Token
readNormalWordPart "]" ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
someSpace ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *).
Stream s m Char =>
ParsecT s UserState m Token
otherLiteral)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id [Token]
x
where
someSpace :: ParsecT s UserState m Token
someSpace = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing1
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
otherLiteral :: ParsecT s UserState m Token
otherLiteral = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s UserState m Char -> ParsecT s UserState m String)
-> ParsecT s UserState m Char -> ParsecT s UserState m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
quotableChars
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
checkPossibleTermination :: SourcePos -> [Token] -> f ()
checkPossibleTermination pos :: SourcePos
pos [T_Literal _ x :: String
x] =
Bool -> f () -> f ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
x String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["do", "done", "then", "fi", "esac"]) (f () -> f ()) -> f () -> f ()
forall a b. (a -> b) -> a -> b
$
SourcePos -> Severity -> Integer -> String -> f ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1010 (String -> f ()) -> String -> f ()
forall a b. (a -> b) -> a -> b
$ "Use semicolon or linefeed before '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' (or quote to make it literal)."
checkPossibleTermination _ _ = () -> f ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
readNormalWordPart :: String -> ParsecT String UserState (SCBase m) Token
readNormalWordPart end :: String
end = do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
end
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m ()
checkForParenthesis
[ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted,
ParsecT String UserState (SCBase m) Token
readDoubleQuoted,
ParsecT String UserState (SCBase m) Token
readGlob,
ParsecT String UserState (SCBase m) Token
readNormalDollar,
ParsecT String UserState (SCBase m) Token
readBraced,
ParsecT String UserState (SCBase m) Token
readUnquotedBackTicked,
ParsecT String UserState (SCBase m) Token
readProcSub,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readUnicodeQuote,
String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) Token
readNormalLiteral String
end,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s (m :: * -> *).
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s UserState m Token
readLiteralCurlyBraces
]
where
checkForParenthesis :: ParsecT s u m ()
checkForParenthesis =
() -> ParsecT s u m ()
forall (m :: * -> *) a. Monad m => a -> m a
return () ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
`attempting` do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1036 "'(' is invalid here. Did you forget to escape it?"
readLiteralCurlyBraces :: ParsecT s UserState m Token
readLiteralCurlyBraces = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
findParam ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m String
forall (m :: * -> *) s (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m String
literalBraces
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
findParam :: ParsecT s u m String
findParam = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "{}"
literalBraces :: ParsecT s u m String
literalBraces = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char
c <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "{}"
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1083 (String -> ParsecT s u m ()) -> String -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$
"This " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
c] String -> String -> String
forall a. [a] -> [a] -> [a]
++ " is literal. Check expression (missing ;/\\n?) or quote it."
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
c]
readSpacePart :: ParsecT String UserState (SCBase m) Token
readSpacePart = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
x <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
x
readDollarBracedWord :: ParsecT String UserState (SCBase m) Token
readDollarBracedWord = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
list <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
readDollarBracedPart
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id [Token]
list
readDollarBracedPart :: ParsecT String UserState (SCBase m) Token
readDollarBracedPart = ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readDoubleQuoted ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *).
Stream s m Char =>
ParsecT s UserState m Token
readParamSubSpecialChar ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readExtglob ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readNormalDollar ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
ParsecT String UserState (SCBase m) Token
readUnquotedBackTicked ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBracedLiteral
readDollarBracedLiteral :: ParsecT String UserState (SCBase m) Token
readDollarBracedLiteral = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[String]
vars <- (ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readBraceEscaped ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT String UserState (SCBase m) Char
-> (Char -> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \x :: Char
x -> String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
x])) ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill1` ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
bracedQuotable
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id (String -> Token) -> String -> Token
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
vars
readParamSubSpecialChar :: ParsecT s UserState m Token
readParamSubSpecialChar = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
x <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
paramSubSpecialChars
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_ParamSubSpecialChar Id
id String
x
prop_readProcSub1 :: Bool
prop_readProcSub1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readProcSub "<(echo test | wc -l)"
prop_readProcSub2 :: Bool
prop_readProcSub2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readProcSub "<( if true; then true; fi )"
prop_readProcSub3 :: Bool
prop_readProcSub3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readProcSub "<( # nothing here \n)"
readProcSub :: ParsecT String UserState (SCBase m) Token
readProcSub = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "process substitution" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
dir <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ do
Char
x <- String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "<>"
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
x]
[Token]
list <- ParsecT String UserState (SCBase m) [Token]
readCompoundListOrEmpty
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
T_ProcSub Id
id String
dir [Token]
list
prop_readSingleQuoted :: Bool
prop_readSingleQuoted = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted "'foo bar'"
prop_readSingleQuoted2 :: Bool
prop_readSingleQuoted2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted "'foo bar\\'"
prop_readSingleQuoted4 :: Bool
prop_readSingleQuoted4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "'it's"
prop_readSingleQuoted5 :: Bool
prop_readSingleQuoted5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "foo='bar\ncow 'arg"
prop_readSingleQuoted6 :: Bool
prop_readSingleQuoted6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "foo='bar cow 'arg"
prop_readSingleQuoted7 :: Bool
prop_readSingleQuoted7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted "'foo\x201C\&bar'"
prop_readSingleQuoted8 :: Bool
prop_readSingleQuoted8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted "'foo\x2018\&bar'"
readSingleQuoted :: ParsecT String UserState (SCBase m) Token
readSingleQuoted = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "single quoted string" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
startPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
singleQuote
[String]
s <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readSingleQuotedPart
let string :: String
string = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
s
SourcePos
endPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
singleQuote ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected end of single quoted string"
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Char
c <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
suspectCharAfterQuotes ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "'"
if Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
string) Bool -> Bool -> Bool
&& Char -> Bool
isAlpha Char
c Bool -> Bool -> Bool
&& Char -> Bool
isAlpha (String -> Char
forall a. [a] -> a
last String
string)
then
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
endPos Severity
WarningC 1011
"This apostrophe terminated the single quoted string!"
else
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ('\n' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
string Bool -> Bool -> Bool
&& Bool -> Bool
not ("\n" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
string)) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> SourcePos -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadReader (Environment m) m, MonadState SystemState m) =>
SourcePos -> SourcePos -> String -> m ()
suggestForgotClosingQuote SourcePos
startPos SourcePos
endPos "single quoted string"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Id -> String -> Token
T_SingleQuoted Id
id String
string)
readSingleQuotedLiteral :: ParsecT String UserState (SCBase m) String
readSingleQuotedLiteral = do
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
singleQuote
[String]
strs <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readSingleQuotedPart
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
singleQuote
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
strs
readSingleQuotedPart :: ParsecT String UserState (SCBase m) String
readSingleQuotedPart =
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readSingleEscaped
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf (String -> ParsecT String UserState (SCBase m) Char)
-> String -> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ "'\\" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
unicodeSingleQuotes)
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) s (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m String
readUnicodeQuote
where
readUnicodeQuote :: ParsecT s u m String
readUnicodeQuote = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char
x <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
unicodeSingleQuotes
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1112
"This is a unicode quote. Delete and retype it (or ignore/doublequote for literal)."
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
x]
prop_readBackTicked :: Bool
prop_readBackTicked = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk (Bool -> ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readBackTicked Bool
False) "`ls *.mp3`"
prop_readBackTicked2 :: Bool
prop_readBackTicked2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk (Bool -> ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readBackTicked Bool
False) "`grep \"\\\"\"`"
prop_readBackTicked3 :: Bool
prop_readBackTicked3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning (Bool -> ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readBackTicked Bool
False) "´grep \"\\\"\"´"
prop_readBackTicked4 :: Bool
prop_readBackTicked4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "`echo foo\necho bar`"
prop_readBackTicked5 :: Bool
prop_readBackTicked5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "echo `foo`bar"
prop_readBackTicked6 :: Bool
prop_readBackTicked6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "echo `foo\necho `bar"
prop_readBackTicked7 :: Bool
prop_readBackTicked7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "`#inline comment`"
prop_readBackTicked8 :: Bool
prop_readBackTicked8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "echo `#comment` \\\nbar baz"
readQuotedBackTicked :: ParsecT String UserState (SCBase m) Token
readQuotedBackTicked = Bool -> ParsecT String UserState (SCBase m) Token
readBackTicked Bool
True
readUnquotedBackTicked :: ParsecT String UserState (SCBase m) Token
readUnquotedBackTicked = Bool -> ParsecT String UserState (SCBase m) Token
readBackTicked Bool
False
readBackTicked :: Bool -> ParsecT String UserState (SCBase m) Token
readBackTicked quoted :: Bool
quoted = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "backtick expansion" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
startPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m ()
backtick
SourcePos
subStart <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
subString <- String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) String
readGenericLiteral "`´"
SourcePos
endPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m ()
backtick
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Char
c <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
suspectCharAfterQuotes
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ('\n' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
subString Bool -> Bool -> Bool
&& Bool -> Bool
not ("\n" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
subString)) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> SourcePos -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadReader (Environment m) m, MonadState SystemState m) =>
SourcePos -> SourcePos -> String -> m ()
suggestForgotClosingQuote SourcePos
startPos SourcePos
endPos "backtick expansion"
[Token]
result <- SourcePos
-> ParsecT String UserState (SCBase m) [Token]
-> String
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse SourcePos
subStart (ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) v. Monad m => SCParser m v -> SCParser m v
tryWithErrors ParsecT String UserState (SCBase m) [Token]
subParser ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return []) (String -> String
unEscape String
subString)
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Backticked Id
id [Token]
result
where
unEscape :: String -> String
unEscape [] = []
unEscape ('\\':'"':rest :: String
rest) | Bool
quoted = '"' Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
unEscape String
rest
unEscape ('\\':x :: Char
x:rest :: String
rest) | Char
x Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` "$`\\" = Char
x Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
unEscape String
rest
unEscape ('\\':'\n':rest :: String
rest) = String -> String
unEscape String
rest
unEscape (c :: Char
c:rest :: String
rest) = Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
unEscape String
rest
subParser :: ParsecT String UserState (SCBase m) [Token]
subParser = do
[Token]
cmds <- ParsecT String UserState (SCBase m) [Token]
readCompoundListOrEmpty
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
verifyEof
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token]
cmds
backtick :: ParsecT s u m ()
backtick =
ParsecT s u m Char -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '`') ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '´'
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1077
"For command expansion, the tick should slant left (` vs ´). Use $(..) instead."
subParse :: SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse pos :: SourcePos
pos parser :: ParsecT s u m b
parser input :: s
input = do
SourcePos
lastPosition <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
s
lastInput <- ParsecT s u m s
forall (m :: * -> *) s u. Monad m => ParsecT s u m s
getInput
SourcePos -> ParsecT s u m ()
forall (m :: * -> *) s u. Monad m => SourcePos -> ParsecT s u m ()
setPosition SourcePos
pos
s -> ParsecT s u m ()
forall (m :: * -> *) s u. Monad m => s -> ParsecT s u m ()
setInput s
input
b
result <- ParsecT s u m b
parser
s -> ParsecT s u m ()
forall (m :: * -> *) s u. Monad m => s -> ParsecT s u m ()
setInput s
lastInput
SourcePos -> ParsecT s u m ()
forall (m :: * -> *) s u. Monad m => SourcePos -> ParsecT s u m ()
setPosition SourcePos
lastPosition
b -> ParsecT s u m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
result
inSeparateContext :: ParsecT s u m b -> ParsecT s u m b
inSeparateContext = Bool -> ParsecT s u m b -> ParsecT s u m b
forall s (m :: * -> *) s u b.
MonadState s m =>
Bool -> ParsecT s u m b -> ParsecT s u m b
parseForgettingContext Bool
True
forgetOnFailure :: ParsecT s u m b -> ParsecT s u m b
forgetOnFailure = Bool -> ParsecT s u m b -> ParsecT s u m b
forall s (m :: * -> *) s u b.
MonadState s m =>
Bool -> ParsecT s u m b -> ParsecT s u m b
parseForgettingContext Bool
False
parseForgettingContext :: Bool -> ParsecT s u m b -> ParsecT s u m b
parseForgettingContext alsoOnSuccess :: Bool
alsoOnSuccess parser :: ParsecT s u m b
parser = do
s
context <- ParsecT s u m s
forall s (m :: * -> *). MonadState s m => m s
Ms.get
s -> ParsecT s u m b
forall s. MonadState s m => s -> ParsecT s u m b
success s
context ParsecT s u m b -> ParsecT s u m b -> ParsecT s u m b
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> s -> ParsecT s u m b
forall (m :: * -> *) s b. (MonadState s m, MonadFail m) => s -> m b
failure s
context
where
success :: s -> ParsecT s u m b
success c :: s
c = do
b
res <- ParsecT s u m b -> ParsecT s u m b
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m b
parser
Bool -> ParsecT s u m () -> ParsecT s u m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
alsoOnSuccess (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ s -> ParsecT s u m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
Ms.put s
c
b -> ParsecT s u m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
res
failure :: s -> m b
failure c :: s
c = do
s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
Ms.put s
c
String -> m b
forall (m :: * -> *) a. MonadFail m => String -> m a
fail ""
prop_readDoubleQuoted :: Bool
prop_readDoubleQuoted = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleQuoted "\"Hello $FOO\""
prop_readDoubleQuoted2 :: Bool
prop_readDoubleQuoted2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleQuoted "\"$'\""
prop_readDoubleQuoted3 :: Bool
prop_readDoubleQuoted3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleQuoted "\"\x2018hello\x2019\""
prop_readDoubleQuoted4 :: Bool
prop_readDoubleQuoted4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "\"foo\nbar\"foo"
prop_readDoubleQuoted5 :: Bool
prop_readDoubleQuoted5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "lol \"foo\nbar\" etc"
prop_readDoubleQuoted6 :: Bool
prop_readDoubleQuoted6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "echo \"${ ls; }\""
prop_readDoubleQuoted7 :: Bool
prop_readDoubleQuoted7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "echo \"${ ls;}bar\""
prop_readDoubleQuoted8 :: Bool
prop_readDoubleQuoted8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleQuoted "\"\x201Chello\x201D\""
prop_readDoubleQuoted10 :: Bool
prop_readDoubleQuoted10 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleQuoted "\"foo\\\\n\""
readDoubleQuoted :: ParsecT String UserState (SCBase m) Token
readDoubleQuoted = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "double quoted string" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
startPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
doubleQuote
[Token]
x <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
doubleQuotedPart
SourcePos
endPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
doubleQuote ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected end of double quoted string"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
suspectCharAfterQuotes ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "$\""
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ((Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Token -> Bool
hasLineFeed [Token]
x Bool -> Bool -> Bool
&& Bool -> Bool
not ([Token] -> Bool
startsWithLineFeed [Token]
x)) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> SourcePos -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadReader (Environment m) m, MonadState SystemState m) =>
SourcePos -> SourcePos -> String -> m ()
suggestForgotClosingQuote SourcePos
startPos SourcePos
endPos "double quoted string"
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DoubleQuoted Id
id [Token]
x
where
startsWithLineFeed :: [Token] -> Bool
startsWithLineFeed (T_Literal _ ('\n':_):_) = Bool
True
startsWithLineFeed _ = Bool
False
hasLineFeed :: Token -> Bool
hasLineFeed (T_Literal _ str :: String
str) | '\n' Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
str = Bool
True
hasLineFeed _ = Bool
False
suggestForgotClosingQuote :: SourcePos -> SourcePos -> String -> m ()
suggestForgotClosingQuote startPos :: SourcePos
startPos endPos :: SourcePos
endPos name :: String
name = do
SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
startPos Severity
WarningC 1078 (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$
"Did you forget to close this " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ "?"
SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
endPos Severity
InfoC 1079
"This is actually an end quote, but due to next char it looks suspect."
doubleQuotedPart :: ParsecT String UserState (SCBase m) Token
doubleQuotedPart = ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDoubleLiteral ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readDoubleQuotedDollar ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readQuotedBackTicked ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s (m :: * -> *).
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s UserState m Token
readUnicodeQuote
where
readUnicodeQuote :: ParsecT s UserState m Token
readUnicodeQuote = do
SourcePos
pos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
c <- String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
unicodeDoubleQuotes
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1111
"This is a unicode quote. Delete and retype it (or ignore/singlequote for literal)."
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id [Char
c]
readDoubleLiteral :: ParsecT String UserState (SCBase m) Token
readDoubleLiteral = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[String]
s <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readDoubleLiteralPart
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
s)
readDoubleLiteralPart :: ParsecT String UserState (SCBase m) String
readDoubleLiteralPart = do
[String]
x <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readDoubleEscaped ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf (String
doubleQuotableChars String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
unicodeDoubleQuotes)))
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
x
readNormalLiteral :: String -> ParsecT String UserState (SCBase m) Token
readNormalLiteral end :: String
end = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[String]
s <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) String
readNormalLiteralPart String
end)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
s)
prop_readGlob1 :: Bool
prop_readGlob1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "*"
prop_readGlob2 :: Bool
prop_readGlob2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[^0-9]"
prop_readGlob3 :: Bool
prop_readGlob3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[a[:alpha:]]"
prop_readGlob4 :: Bool
prop_readGlob4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[[:alnum:]]"
prop_readGlob5 :: Bool
prop_readGlob5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[^[:alpha:]1-9]"
prop_readGlob6 :: Bool
prop_readGlob6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[\\|]"
prop_readGlob7 :: Bool
prop_readGlob7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[^[]"
prop_readGlob8 :: Bool
prop_readGlob8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readGlob "[*?]"
readGlob :: ParsecT String UserState (SCBase m) Token
readGlob = ParsecT String UserState (SCBase m) Token
readExtglob ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
ParsecT s UserState m Token
readSimple ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readClass ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
ParsecT s UserState m Token
readGlobbyLiteral
where
readSimple :: ParsecT s UserState m Token
readSimple = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
c <- String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "*?"
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Glob Id
id [Char
c]
readClass :: ParsecT String UserState (SCBase m) Token
readClass = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '['
[String]
s <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
predefined ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) String
readNormalLiteralPart "]" ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, Monad m) =>
ParsecT s u m (m Char)
globchars)
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ']'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Glob Id
id (String -> Token) -> String -> Token
forall a b. (a -> b) -> a -> b
$ "[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ "]"
where
globchars :: ParsecT s u m (m Char)
globchars = (Char -> m Char) -> ParsecT s u m Char -> ParsecT s u m (m Char)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> m Char
forall (m :: * -> *) a. Monad m => a -> m a
return (ParsecT s u m Char -> ParsecT s u m (m Char))
-> (String -> ParsecT s u m Char)
-> String
-> ParsecT s u m (m Char)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf (String -> ParsecT s u m (m Char))
-> String -> ParsecT s u m (m Char)
forall a b. (a -> b) -> a -> b
$ "!$[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
extglobStartChars
predefined :: ParsecT s u m String
predefined = do
ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "[:"
String
s <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter
String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string ":]"
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT s u m String) -> String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ "[:" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ ":]"
readGlobbyLiteral :: ParsecT s UserState m Token
readGlobbyLiteral = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
c <- ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
extglobStart ParsecT s UserState m Char
-> ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '['
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id [Char
c]
readNormalLiteralPart :: String -> ParsecT String UserState (SCBase m) String
readNormalLiteralPart customEnd :: String
customEnd =
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readNormalEscaped ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf (String
customEnd String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
standardEnd))
where
standardEnd :: String
standardEnd = "[{}"
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
quotableChars
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
extglobStartChars
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
unicodeDoubleQuotes
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
unicodeSingleQuotes
readNormalEscaped :: ParsecT String UserState (SCBase m) String
readNormalEscaped = String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "escaped char" (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
backslash
do
Char
next <- SCParser m Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Char
quotable SCParser m Char -> SCParser m Char -> SCParser m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> SCParser m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "?*@!+[]{}.,~#"
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Char
next Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ' ') (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
SourcePos -> ParsecT String UserState (SCBase m) ()
checkTrailingSpaces SourcePos
pos ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> () -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ if Char
next Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\n' then "" else [Char
next]
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
do
Char
next <- SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
case Char -> Maybe String
escapedChar Char
next of
Just name :: String
name -> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
WarningC 1012 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ "\\" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
next] String -> String -> String
forall a. [a] -> [a] -> [a]
++ " is just literal '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
next] String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' here. For " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ ", use " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char -> String
alternative Char
next String -> String -> String
forall a. [a] -> [a] -> [a]
++ " instead."
Nothing -> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
InfoC 1001 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ "This \\" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
next] String -> String -> String
forall a. [a] -> [a] -> [a]
++ " will be a regular '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
next] String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' in this context."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
next]
where
alternative :: Char -> String
alternative 'n' = "a quoted, literal line feed"
alternative t :: Char
t = "\"$(printf '\\" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
t] String -> String -> String
forall a. [a] -> [a] -> [a]
++ "')\""
escapedChar :: Char -> Maybe String
escapedChar 'n' = String -> Maybe String
forall a. a -> Maybe a
Just "line feed"
escapedChar 't' = String -> Maybe String
forall a. a -> Maybe a
Just "tab"
escapedChar 'r' = String -> Maybe String
forall a. a -> Maybe a
Just "carriage return"
escapedChar _ = Maybe String
forall a. Maybe a
Nothing
checkTrailingSpaces :: SourcePos -> ParsecT String UserState (SCBase m) ()
checkTrailingSpaces pos :: SourcePos
pos = ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1101 "Delete trailing spaces after \\ to break line (or use quotes for literal space)."
prop_readExtglob1 :: Bool
prop_readExtglob1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "!(*.mp3)"
prop_readExtglob2 :: Bool
prop_readExtglob2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "!(*.mp3|*.wmv)"
prop_readExtglob4 :: Bool
prop_readExtglob4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "+(foo \\) bar)"
prop_readExtglob5 :: Bool
prop_readExtglob5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "+(!(foo *(bar)))"
prop_readExtglob6 :: Bool
prop_readExtglob6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "*(((||))|())"
prop_readExtglob7 :: Bool
prop_readExtglob7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "*(<>)"
prop_readExtglob8 :: Bool
prop_readExtglob8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readExtglob "@(|*())"
readExtglob :: ParsecT String UserState (SCBase m) Token
readExtglob = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "extglob" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char
c <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ do
Char
f <- ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
extglobStart
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
Char -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
f
[Token]
contents <- ParsecT String UserState (SCBase m) Token
readExtglobPart ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '|'
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
T_Extglob Id
id [Char
c] [Token]
contents
readExtglobPart :: ParsecT String UserState (SCBase m) Token
readExtglobPart = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
x <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) Token
readExtglobGroup ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Token
readNormalWordPart "" ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSpacePart ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *).
Stream s m Char =>
ParsecT s UserState m Token
readExtglobLiteral)
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id [Token]
x
where
readExtglobGroup :: ParsecT String UserState (SCBase m) Token
readExtglobGroup = do
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
contents <- ParsecT String UserState (SCBase m) Token
readExtglobPart ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '|'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
T_Extglob Id
id "" [Token]
contents
readExtglobLiteral :: ParsecT s UserState m Token
readExtglobLiteral = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "<>#;&")
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
readSingleEscaped :: ParsecT String UserState (SCBase m) String
readSingleEscaped = do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char
s <- SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
backslash
Char
x <- SCParser m Char -> SCParser m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
case Char
x of
'\'' -> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
InfoC 1003 "Want to escape a single quote? echo 'This is how it'\\''s done'.";
'\n' -> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
InfoC 1004 "This backslash+linefeed is literal. Break outside single quotes if you just want to break the line."
_ -> () -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
s]
readDoubleEscaped :: ParsecT String UserState (SCBase m) String
readDoubleEscaped = do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char
bs <- SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
backslash
(SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed SCParser m Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "")
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> String)
-> SCParser m Char -> ParsecT String UserState (SCBase m) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> String
forall (m :: * -> *) a. Monad m => a -> m a
return SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
doubleQuotable
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
Char
c <- SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
bs, Char
c]
readBraceEscaped :: ParsecT String UserState (SCBase m) String
readBraceEscaped = do
Char
bs <- SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
backslash
(SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed SCParser m Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "")
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> String)
-> SCParser m Char -> ParsecT String UserState (SCBase m) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> String
forall (m :: * -> *) a. Monad m => a -> m a
return SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
bracedQuotable
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> String)
-> SCParser m Char -> ParsecT String UserState (SCBase m) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\ x :: Char
x -> [Char
bs, Char
x]) SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
readGenericLiteral :: String -> ParsecT String UserState (SCBase m) String
readGenericLiteral endChars :: String
endChars = do
[String]
strings <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readGenericEscaped ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf ('\\'Char -> String -> String
forall a. a -> [a] -> [a]
:String
endChars)))
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
strings
readGenericLiteral1 :: ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) String
readGenericLiteral1 endExp :: ParsecT String UserState (SCBase m) a
endExp = do
[String]
strings <- (ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readGenericEscaped ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT String UserState (SCBase m) Char
-> (Char -> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \x :: Char
x -> String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
x])) ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) [String]
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill1` ParsecT String UserState (SCBase m) a
endExp
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
strings
readGenericEscaped :: ParsecT String UserState (SCBase m) String
readGenericEscaped = do
SCParser m Char
forall (m :: * -> *). Monad m => SCParser m Char
backslash
Char
x <- SCParser m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT String UserState (SCBase m) String)
-> String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ if Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\n' then [] else ['\\', Char
x]
prop_readBraced :: Bool
prop_readBraced = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{1..4}"
prop_readBraced2 :: Bool
prop_readBraced2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{foo,bar,\"baz lol\"}"
prop_readBraced3 :: Bool
prop_readBraced3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{1,\\},2}"
prop_readBraced4 :: Bool
prop_readBraced4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{1,{2,3}}"
prop_readBraced5 :: Bool
prop_readBraced5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{JP{,E}G,jp{,e}g}"
prop_readBraced6 :: Bool
prop_readBraced6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{foo,bar,$((${var}))}"
prop_readBraced7 :: Bool
prop_readBraced7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{}"
prop_readBraced8 :: Bool
prop_readBraced8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraced "{foo}"
readBraced :: ParsecT String UserState (SCBase m) Token
readBraced = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String UserState (SCBase m) Token
braceExpansion
where
braceExpansion :: ParsecT String UserState (SCBase m) Token
braceExpansion =
Id -> [Token] -> Token
T_BraceExpansion (Id -> [Token] -> Token)
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) t b s.
Monad m =>
(Id -> t -> b)
-> ParsecT s UserState m t -> ParsecT s UserState m b
`withParser` do
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
[Token]
elements <- ParsecT String UserState (SCBase m) Token
bracedElement ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy1` Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ','
Bool -> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> ParsecT String UserState (SCBase m) ())
-> Bool -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
case [Token]
elements of
(_:_:_) -> Bool
True
[t :: Token
t] -> ".." String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf` Token -> String
onlyLiteralString Token
t
[] -> Bool
False
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token]
elements
bracedElement :: ParsecT String UserState (SCBase m) Token
bracedElement =
Id -> [Token] -> Token
T_NormalWord (Id -> [Token] -> Token)
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) t b s.
Monad m =>
(Id -> t -> b)
-> ParsecT s UserState m t -> ParsecT s UserState m b
`withParser` do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token])
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
braceExpansion,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpression,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSingleQuoted,
ParsecT String UserState (SCBase m) Token
readDoubleQuoted,
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
braceLiteral
]
braceLiteral :: ParsecT String UserState (SCBase m) Token
braceLiteral =
Id -> String -> Token
T_Literal (Id -> String -> Token)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) t b s.
Monad m =>
(Id -> t -> b)
-> ParsecT s UserState m t -> ParsecT s UserState m b
`withParser` ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a.
Monad m =>
ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) String
readGenericLiteral1 (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "{}\"$'," ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace)
ensureDollar :: ParsecT s u m Char
ensureDollar =
ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '$'
readNormalDollar :: ParsecT String UserState (SCBase m) Token
readNormalDollar = do
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
ensureDollar
ParsecT String UserState (SCBase m) Token
readDollarExp ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readDollarDoubleQuote ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarSingleQuote ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Bool -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readDollarLonely Bool
False
readDoubleQuotedDollar :: ParsecT String UserState (SCBase m) Token
readDoubleQuotedDollar = do
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
ensureDollar
ParsecT String UserState (SCBase m) Token
readDollarExp ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Bool -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readDollarLonely Bool
True
prop_readDollarExpression1 :: Bool
prop_readDollarExpression1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpression "$(((1) && 3))"
prop_readDollarExpression2 :: Bool
prop_readDollarExpression2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpression "$(((1)) && 3)"
prop_readDollarExpression3 :: Bool
prop_readDollarExpression3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpression "$((\"$@\" &); foo;)"
readDollarExpression :: Monad m => SCParser m Token
readDollarExpression :: SCParser m Token
readDollarExpression = do
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
ensureDollar
SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExp
readDollarExp :: ParsecT String UserState (SCBase m) Token
readDollarExp = ParsecT String UserState (SCBase m) Token
arithmetic ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readDollarExpansion ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBracket ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readDollarBraceCommandExpansion ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readDollarBraced ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarVariable
where
arithmetic :: ParsecT String UserState (SCBase m) Token
arithmetic = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> (SourcePos -> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) p.
Monad m =>
String
-> SCParser m p
-> SCParser m p
-> (SourcePos -> SCParser m ())
-> SCParser m p
readAmbiguous "$((" ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarArithmetic ParsecT String UserState (SCBase m) Token
readDollarExpansion (\pos :: SourcePos
pos ->
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
WarningC 1102 "Shells disambiguate $(( differently or not at all. For $(command substition), add space after $( . For $((arithmetics)), fix parsing errors.")
prop_readDollarSingleQuote :: Bool
prop_readDollarSingleQuote = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarSingleQuote "$'foo\\\'lol'"
readDollarSingleQuote :: ParsecT String UserState (SCBase m) Token
readDollarSingleQuote = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "$'..' expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "$'"
String
str <- String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) String
readGenericLiteral "'"
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\''
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_DollarSingleQuoted Id
id String
str
prop_readDollarDoubleQuote :: Bool
prop_readDollarDoubleQuote = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarDoubleQuote "$\"hello\""
readDollarDoubleQuote :: ParsecT String UserState (SCBase m) Token
readDollarDoubleQuote = do
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "$\""
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '$'
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
doubleQuote
[Token]
x <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
doubleQuotedPart
ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
doubleQuote ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected end of translated double quoted string"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DollarDoubleQuoted Id
id [Token]
x
prop_readDollarArithmetic :: Bool
prop_readDollarArithmetic = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarArithmetic "$(( 3 * 4 +5))"
prop_readDollarArithmetic2 :: Bool
prop_readDollarArithmetic2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarArithmetic "$(((3*4)+(1*2+(3-1))))"
readDollarArithmetic :: ParsecT String UserState (SCBase m) Token
readDollarArithmetic = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "$((..)) expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "$((")
Token
c <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected a double )) to end the $((..))"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Id -> Token -> Token
T_DollarArithmetic Id
id Token
c)
readDollarBracket :: ParsecT String UserState (SCBase m) Token
readDollarBracket = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "$[..] expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "$[")
Token
c <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "]"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Id -> Token -> Token
T_DollarBracket Id
id Token
c)
prop_readArithmeticExpression :: Bool
prop_readArithmeticExpression = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticExpression "((a?b:c))"
readArithmeticExpression :: ParsecT String UserState (SCBase m) Token
readArithmeticExpression = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "((..)) command" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "((")
Token
c <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "))"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Id -> Token -> Token
T_Arithmetic Id
id Token
c)
readAmbiguous :: Monad m => String -> SCParser m p -> SCParser m p -> (SourcePos -> SCParser m ()) -> SCParser m p
readAmbiguous :: String
-> SCParser m p
-> SCParser m p
-> (SourcePos -> SCParser m ())
-> SCParser m p
readAmbiguous prefix :: String
prefix expected :: SCParser m p
expected alternative :: SCParser m p
alternative warner :: SourcePos -> SCParser m ()
warner = do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
prefix
SCParser m p -> SCParser m p
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try SCParser m p
expected SCParser m p -> SCParser m p -> SCParser m p
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SCParser m p -> SCParser m p
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourcePos -> SCParser m p
withAlt SourcePos
pos) SCParser m p -> SCParser m p -> SCParser m p
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SCParser m p
expected
where
withAlt :: SourcePos -> SCParser m p
withAlt pos :: SourcePos
pos = do
p
t <- SCParser m p -> SCParser m p
forall s (m :: * -> *) s u b.
MonadState s m =>
ParsecT s u m b -> ParsecT s u m b
forgetOnFailure SCParser m p
alternative
SourcePos -> SCParser m ()
warner SourcePos
pos
p -> SCParser m p
forall (m :: * -> *) a. Monad m => a -> m a
return p
t
prop_readDollarBraceCommandExpansion1 :: Bool
prop_readDollarBraceCommandExpansion1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBraceCommandExpansion "${ ls; }"
prop_readDollarBraceCommandExpansion2 :: Bool
prop_readDollarBraceCommandExpansion2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBraceCommandExpansion "${\nls\n}"
readDollarBraceCommandExpansion :: ParsecT String UserState (SCBase m) Token
readDollarBraceCommandExpansion = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "ksh ${ ..; } command expansion" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ do
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "${"
ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
[Token]
term <- ParsecT String UserState (SCBase m) [Token]
readTerm
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected } to end the ksh ${ ..; } command expansion"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DollarBraceCommandExpansion Id
id [Token]
term
prop_readDollarBraced1 :: Bool
prop_readDollarBraced1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBraced "${foo//bar/baz}"
prop_readDollarBraced2 :: Bool
prop_readDollarBraced2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBraced "${foo/'{cow}'}"
prop_readDollarBraced3 :: Bool
prop_readDollarBraced3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBraced "${foo%%$(echo cow\\})}"
prop_readDollarBraced4 :: Bool
prop_readDollarBraced4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarBraced "${foo#\\}}"
readDollarBraced :: ParsecT String UserState (SCBase m) Token
readDollarBraced = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "parameter expansion" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "${")
Token
word <- ParsecT String UserState (SCBase m) Token
readDollarBracedWord
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Bool -> Token -> Token
T_DollarBraced Id
id Bool
True Token
word
prop_readDollarExpansion1 :: Bool
prop_readDollarExpansion1= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpansion "$(echo foo; ls\n)"
prop_readDollarExpansion2 :: Bool
prop_readDollarExpansion2= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpansion "$( )"
prop_readDollarExpansion3 :: Bool
prop_readDollarExpansion3= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarExpansion "$( command \n#comment \n)"
readDollarExpansion :: ParsecT String UserState (SCBase m) Token
readDollarExpansion = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "command expansion" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "$(")
[Token]
cmds <- ParsecT String UserState (SCBase m) [Token]
readCompoundListOrEmpty
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected end of $(..) expression"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_DollarExpansion Id
id [Token]
cmds
prop_readDollarVariable :: Bool
prop_readDollarVariable = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarVariable "$@"
prop_readDollarVariable2 :: Bool
prop_readDollarVariable2 = ParsecT String UserState (SCBase Identity) Char -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk (ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarVariable ParsecT String UserState (SCBase Identity) Token
-> ParsecT String UserState (SCBase Identity) Char
-> ParsecT String UserState (SCBase Identity) Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase Identity) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar) "$?!"
prop_readDollarVariable3 :: Bool
prop_readDollarVariable3 = ParsecT String UserState (SCBase Identity) Char -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning (ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarVariable ParsecT String UserState (SCBase Identity) Token
-> ParsecT String UserState (SCBase Identity) Char
-> ParsecT String UserState (SCBase Identity) Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase Identity) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar) "$10"
prop_readDollarVariable4 :: Bool
prop_readDollarVariable4 = ParsecT String UserState (SCBase Identity) String -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning (ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarVariable ParsecT String UserState (SCBase Identity) Token
-> ParsecT String UserState (SCBase Identity) String
-> ParsecT String UserState (SCBase Identity) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT String UserState (SCBase Identity) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "[@]") "$arr[@]"
prop_readDollarVariable5 :: Bool
prop_readDollarVariable5 = ParsecT String UserState (SCBase Identity) String -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning (ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readDollarVariable ParsecT String UserState (SCBase Identity) Token
-> ParsecT String UserState (SCBase Identity) String
-> ParsecT String UserState (SCBase Identity) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> ParsecT String UserState (SCBase Identity) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "[f") "$arr[f"
readDollarVariable :: Monad m => SCParser m Token
readDollarVariable :: SCParser m Token
readDollarVariable = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
let singleCharred :: ParsecT s UserState m Char -> ParsecT s UserState m Token
singleCharred p :: ParsecT s UserState m Char
p = do
Token
value <- ParsecT s UserState m String -> ParsecT s UserState m Token
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m String -> ParsecT s UserState m Token
wrapString ((Char -> String -> String
forall a. a -> [a] -> [a]
:[]) (Char -> String)
-> ParsecT s UserState m Char -> ParsecT s UserState m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s UserState m Char
p)
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ (Id -> Bool -> Token -> Token
T_DollarBraced Id
id Bool
False Token
value)
let positional :: ParsecT s UserState m Token
positional = do
Token
value <- ParsecT s UserState m Char -> ParsecT s UserState m Token
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m Char -> ParsecT s UserState m Token
singleCharred ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
value ParsecT s UserState m Token
-> ParsecT s UserState m () -> ParsecT s UserState m Token
forall s u (m :: * -> *) a a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
`attempting` do
ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
ErrorC 1037 "Braces are required for positionals over 9, e.g. ${10}."
let special :: ParsecT s UserState m Token
special = ParsecT s UserState m Char -> ParsecT s UserState m Token
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m Char -> ParsecT s UserState m Token
singleCharred ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
specialVariable
let regular :: ParsecT s UserState m Token
regular = do
Token
value <- ParsecT s UserState m String -> ParsecT s UserState m Token
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m String -> ParsecT s UserState m Token
wrapString ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Id -> Bool -> Token -> Token
T_DollarBraced Id
id Bool
False Token
value) ParsecT s UserState m Token
-> ParsecT s UserState m () -> ParsecT s UserState m Token
forall s u (m :: * -> *) a a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
`attempting` do
ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s UserState m Char -> ParsecT s UserState m Char)
-> ParsecT s UserState m Char -> ParsecT s UserState m Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '['
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
ErrorC 1087 "Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet)."
SCParser m Token -> SCParser m Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SCParser m Token -> SCParser m Token)
-> SCParser m Token -> SCParser m Token
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '$' ParsecT String UserState (SCBase m) Char
-> SCParser m Token -> SCParser m Token
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (SCParser m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s UserState m Token
positional SCParser m Token -> SCParser m Token -> SCParser m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SCParser m Token
forall (m :: * -> *) s.
Stream s m Char =>
ParsecT s UserState m Token
special SCParser m Token -> SCParser m Token -> SCParser m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SCParser m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s UserState m Token
regular)
where
wrapString :: ParsecT s UserState m String -> ParsecT s UserState m Token
wrapString p :: ParsecT s UserState m String
p = do
SourcePos
start <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
s <- ParsecT s UserState m String
p
SourcePos
end <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Id
id1 <- SourcePos -> SourcePos -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
start SourcePos
end
Id
id2 <- SourcePos -> SourcePos -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
start SourcePos
end
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_NormalWord Id
id1 [Id -> String -> Token
T_Literal Id
id2 String
s]
readVariableName :: ParsecT s u m String
readVariableName = do
Char
f <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableStart
String
rest <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableChars
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
fChar -> String -> String
forall a. a -> [a] -> [a]
:String
rest)
prop_readDollarLonely1 :: Bool
prop_readDollarLonely1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "\"$\"var"
prop_readDollarLonely2 :: Bool
prop_readDollarLonely2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "\"$\"\"var\""
prop_readDollarLonely3 :: Bool
prop_readDollarLonely3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "\"$\"$var"
prop_readDollarLonely4 :: Bool
prop_readDollarLonely4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "\"$\"*"
prop_readDollarLonely5 :: Bool
prop_readDollarLonely5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord "$\"str\""
readDollarLonely :: Bool -> ParsecT String UserState (SCBase m) Token
readDollarLonely quoted :: Bool
quoted = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '$'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
quoted (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Bool
isHack <- ParsecT String UserState (SCBase m) Bool
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Bool
quoteForEscape
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
isHack (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
id Severity
StyleC 1135
"Prefer escape over ending quote to make $ literal. Instead of \"It costs $\"5, use \"It costs \\$5\"."
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id "$"
where
quoteForEscape :: ParsecT s u m Bool
quoteForEscape = Bool -> ParsecT s u m Bool -> ParsecT s u m Bool
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Bool
False (ParsecT s u m Bool -> ParsecT s u m Bool)
-> ParsecT s u m Bool -> ParsecT s u m Bool
forall a b. (a -> b) -> a -> b
$ ParsecT s u m Bool -> ParsecT s u m Bool
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m Bool -> ParsecT s u m Bool)
-> (ParsecT s u m Bool -> ParsecT s u m Bool)
-> ParsecT s u m Bool
-> ParsecT s u m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT s u m Bool -> ParsecT s u m Bool
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m Bool -> ParsecT s u m Bool)
-> ParsecT s u m Bool -> ParsecT s u m Bool
forall a b. (a -> b) -> a -> b
$ do
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '"'
ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s u m Char -> ParsecT s u m ())
-> ParsecT s u m Char -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '"'
Char
c <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyVar
Bool -> ParsecT s u m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> ParsecT s u m Bool) -> Bool -> ParsecT s u m Bool
forall a b. (a -> b) -> a -> b
$ Char
c Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` "*$"
anyVar :: ParsecT s u m Char
anyVar = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableStart ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
specialVariable
prop_readHereDoc :: Bool
prop_readHereDoc = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\nlol\ncow\nfoo"
prop_readHereDoc2 :: Bool
prop_readHereDoc2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<- EOF\n cow\n EOF"
prop_readHereDoc3 :: Bool
prop_readHereDoc3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\n$\"\nfoo"
prop_readHereDoc4 :: Bool
prop_readHereDoc4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\n`\nfoo"
prop_readHereDoc5 :: Bool
prop_readHereDoc5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<- !foo\nbar\n!foo"
prop_readHereDoc6 :: Bool
prop_readHereDoc6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\\ bar\ncow\nfoo bar"
prop_readHereDoc7 :: Bool
prop_readHereDoc7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\n\\$(f ())\nfoo"
prop_readHereDoc8 :: Bool
prop_readHereDoc8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<foo>>bar\netc\nfoo"
prop_readHereDoc9 :: Bool
prop_readHereDoc9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "if true; then cat << foo; fi\nbar\nfoo\n"
prop_readHereDoc10 :: Bool
prop_readHereDoc10= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "if true; then cat << foo << bar; fi\nfoo\nbar\n"
prop_readHereDoc11 :: Bool
prop_readHereDoc11= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo $(\nfoo\n)lol\nfoo\n"
prop_readHereDoc12 :: Bool
prop_readHereDoc12= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo|cat\nbar\nfoo"
prop_readHereDoc13 :: Bool
prop_readHereDoc13= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<'#!'\nHello World\n#!\necho Done"
prop_readHereDoc14 :: Bool
prop_readHereDoc14= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\nbar\nfoo \n"
prop_readHereDoc15 :: Bool
prop_readHereDoc15= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<foo\nbar\nfoo bar\nfoo"
prop_readHereDoc16 :: Bool
prop_readHereDoc16= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<- ' foo'\nbar\n foo\n"
prop_readHereDoc17 :: Bool
prop_readHereDoc17= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat <<- ' foo'\nbar\n foo\n foo\n"
prop_readHereDoc20 :: Bool
prop_readHereDoc20= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "cat << foo\n foo\n()\nfoo\n"
prop_readHereDoc21 :: Bool
prop_readHereDoc21= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "# shellcheck disable=SC1039\ncat << foo\n foo\n()\nfoo\n"
readHereDoc :: ParsecT String UserState (SCBase m) Token
readHereDoc = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "here document" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "<<"
Dashed
dashed <- (Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Dashed
-> ParsecT String UserState (SCBase m) Dashed
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Dashed -> ParsecT String UserState (SCBase m) Dashed
forall (m :: * -> *) a. Monad m => a -> m a
return Dashed
Dashed) ParsecT String UserState (SCBase m) Dashed
-> ParsecT String UserState (SCBase m) Dashed
-> ParsecT String UserState (SCBase m) Dashed
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Dashed -> ParsecT String UserState (SCBase m) Dashed
forall (m :: * -> *) a. Monad m => a -> m a
return Dashed
Undashed
String
sp <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
let message :: String
message = "Shells are space sensitive. Use '< <(cmd)', not '<<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
sp String -> String -> String
forall a. [a] -> [a] -> [a]
++ "(cmd)'."
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1038 String
message
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
(quoted :: Quoted
quoted, endToken :: String
endToken) <- ParsecT String UserState (SCBase m) (Quoted, String)
readToken
Id
hid <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
let doc :: Token
doc = Id -> Dashed -> Quoted -> String -> [Token] -> Token
T_HereDoc Id
hid Dashed
dashed Quoted
quoted String
endToken []
Token -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s.
MonadState SystemState m =>
Token -> ParsecT s UserState m ()
addPendingHereDoc Token
doc
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
doc
where
quotes :: String
quotes = "\"'\\"
readToken :: ParsecT String UserState (SCBase m) (Quoted, String)
readToken = do
String
str <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) s u a.
(Stream s m Char, MonadState s m) =>
ParsecT s u m a -> ParsecT s u m String
readStringForParser ParsecT String UserState (SCBase m) Token
readNormalWord
(Quoted, String)
-> ParsecT String UserState (SCBase m) (Quoted, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
quotes) String
str then Quoted
Quoted else Quoted
Unquoted,
(Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
quotes)) String
str)
readPendingHereDocs :: ParsecT String UserState (SCBase m) ()
readPendingHereDocs = do
[HereDocContext]
docs <- ParsecT String UserState (SCBase m) [HereDocContext]
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m [HereDocContext]
popPendingHereDocs
(HereDocContext -> ParsecT String UserState (SCBase m) ())
-> [HereDocContext] -> ParsecT String UserState (SCBase m) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ HereDocContext -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
HereDocContext -> ParsecT String UserState (SCBase m) ()
readDoc [HereDocContext]
docs
where
readDoc :: HereDocContext -> ParsecT String UserState (SCBase m) ()
readDoc (HereDocPending (T_HereDoc id :: Id
id dashed :: Dashed
dashed quoted :: Quoted
quoted endToken :: String
endToken _) ctx :: [Context]
ctx) =
[Context]
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u b.
(Stream s m t, MonadState SystemState m) =>
[Context] -> ParsecT s u m b -> ParsecT s u m b
swapContext [Context]
ctx (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
do
SourcePos
docStartPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(terminated :: Bool
terminated, wasWarned :: Bool
wasWarned, lines :: [String]
lines) <- Dashed -> String -> SCParser m (Bool, Bool, [String])
forall (m :: * -> *).
Monad m =>
Dashed -> String -> SCParser m (Bool, Bool, [String])
readDocLines Dashed
dashed String
endToken
SourcePos
docEndPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
let hereData :: String
hereData = [String] -> String
unlines [String]
lines
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
terminated (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
wasWarned (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
Id -> String -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> String -> String -> ParsecT String UserState (SCBase m) ()
debugHereDoc Id
id String
endToken String
hereData
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Here document was not correctly terminated"
[Token]
list <- Quoted
-> (SourcePos, SourcePos)
-> String
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *).
Monad m =>
Quoted
-> (SourcePos, SourcePos)
-> String
-> ParsecT String UserState (SCBase m) [Token]
parseHereData Quoted
quoted (SourcePos
docStartPos, SourcePos
docEndPos) String
hereData
Id -> [Token] -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s.
Monad m =>
Id -> [Token] -> ParsecT s UserState m ()
addToHereDocMap Id
id [Token]
list
readDocLines :: Monad m => Dashed -> String -> SCParser m (Bool, Bool, [String])
readDocLines :: Dashed -> String -> SCParser m (Bool, Bool, [String])
readDocLines dashed :: Dashed
dashed endToken :: String
endToken = do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
str <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
rawLine
Bool
isEof <- Bool
-> ParsecT String UserState (SCBase m) Bool
-> ParsecT String UserState (SCBase m) Bool
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Bool
False (ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Bool
-> ParsecT String UserState (SCBase m) Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> ParsecT String UserState (SCBase m) Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)
(isEnd :: Bool
isEnd, wasWarned :: Bool
wasWarned) <- SourcePos
-> ParsecT String UserState (SCBase m) (Bool, Bool)
-> String
-> ParsecT String UserState (SCBase m) (Bool, Bool)
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse SourcePos
pos ParsecT String UserState (SCBase m) (Bool, Bool)
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, Stream s m Char,
MonadState SystemState m) =>
ParsecT s UserState m (Bool, Bool)
checkEnd String
str
if
| Bool
isEnd -> (Bool, Bool, [String]) -> SCParser m (Bool, Bool, [String])
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
True, Bool
wasWarned, [])
| Bool
isEof -> (Bool, Bool, [String]) -> SCParser m (Bool, Bool, [String])
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
False, Bool
wasWarned, [String
str])
| Bool
True -> do
(ok :: Bool
ok, previousWarning :: Bool
previousWarning, rest :: [String]
rest) <- Dashed -> String -> SCParser m (Bool, Bool, [String])
forall (m :: * -> *).
Monad m =>
Dashed -> String -> SCParser m (Bool, Bool, [String])
readDocLines Dashed
dashed String
endToken
(Bool, Bool, [String]) -> SCParser m (Bool, Bool, [String])
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
ok, Bool
wasWarned Bool -> Bool -> Bool
|| Bool
previousWarning, String
strString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
rest)
where
checkEnd :: ParsecT s UserState m (Bool, Bool)
checkEnd = (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option (Bool
False, Bool
False) (ParsecT s UserState m (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool))
-> ParsecT s UserState m (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool)
forall a b. (a -> b) -> a -> b
$ ParsecT s UserState m (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool))
-> ParsecT s UserState m (Bool, Bool)
-> ParsecT s UserState m (Bool, Bool)
forall a b. (a -> b) -> a -> b
$ do
SourcePos
leadingSpacePos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
leadingSpace <- ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace ParsecT s UserState m Char
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill` String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
endToken
String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
endToken
SourcePos
trailingSpacePos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
trailingSpace <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
SourcePos
trailerPos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
trailer <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
let leadingSpacesAreTabs :: Bool
leadingSpacesAreTabs = (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\t') String
leadingSpace
let thereIsNoTrailer :: Bool
thereIsNoTrailer = String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
trailingSpace Bool -> Bool -> Bool
&& String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
trailer
let leaderIsOk :: Bool
leaderIsOk = String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
leadingSpace
Bool -> Bool -> Bool
|| Dashed
dashed Dashed -> Dashed -> Bool
forall a. Eq a => a -> a -> Bool
== Dashed
Dashed Bool -> Bool -> Bool
&& Bool
leadingSpacesAreTabs
let trailerStart :: Char
trailerStart = if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
trailer then '\0' else String -> Char
forall a. [a] -> a
head String
trailer
let hasTrailingSpace :: Bool
hasTrailingSpace = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
trailingSpace
let hasTrailer :: Bool
hasTrailer = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
trailer
let ppt :: Integer -> String -> m ()
ppt = SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
trailerPos Severity
ErrorC
if Bool
leaderIsOk Bool -> Bool -> Bool
&& Bool
thereIsNoTrailer
then (Bool, Bool) -> ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
True, Bool
False)
else do
let foundCause :: m (Bool, Bool)
foundCause = (Bool, Bool) -> m (Bool, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
False, Bool
True)
let skipLine :: m (Bool, Bool)
skipLine = (Bool, Bool) -> m (Bool, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
False, Bool
False)
if
| Char
trailerStart Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ')' -> do
Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> String -> m ()
ppt 1119 (String -> ParsecT s UserState m ())
-> String -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ "Add a linefeed between end token and terminating ')'."
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
foundCause
| Char
trailerStart Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '#' -> do
Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> String -> m ()
ppt 1120 "No comments allowed after here-doc token. Comment the next line instead."
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
foundCause
| Char
trailerStart Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ";>|&" -> do
Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> String -> m ()
ppt 1121 "Add ;/& terminators (and other syntax) on the line with the <<, not here."
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
foundCause
| Bool
hasTrailingSpace Bool -> Bool -> Bool
&& Bool
hasTrailer -> do
Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> String -> m ()
ppt 1122 "Nothing allowed after end token. To continue a command, put it on the line with the <<."
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
foundCause
| Bool
leaderIsOk Bool -> Bool -> Bool
&& Bool
hasTrailingSpace Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
hasTrailer -> do
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
trailingSpacePos Severity
ErrorC 1118 "Delete whitespace after the here-doc end token."
(Bool, Bool) -> ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
True, Bool
True)
| Bool -> Bool
not Bool
hasTrailingSpace Bool -> Bool -> Bool
&& Bool
hasTrailer ->
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
skipLine
| Bool
hasTrailer ->
String -> ParsecT s UserState m (Bool, Bool)
forall a. HasCallStack => String -> a
error "ShellCheck bug, please report (here doc trailer)."
| Dashed
dashed Dashed -> Dashed -> Bool
forall a. Eq a => a -> a -> Bool
== Dashed
Undashed Bool -> Bool -> Bool
&& (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
leadingSpace) -> do
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
leadingSpacePos Severity
ErrorC 1039 "Remove indentation before end token (or use <<- and indent with tabs)."
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
foundCause
| Dashed
dashed Dashed -> Dashed -> Bool
forall a. Eq a => a -> a -> Bool
== Dashed
Dashed Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
leadingSpacesAreTabs -> do
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
leadingSpacePos Severity
ErrorC 1040 "When using <<-, you can only indent with tabs."
ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
foundCause
| Bool
True -> ParsecT s UserState m (Bool, Bool)
forall (m :: * -> *). Monad m => m (Bool, Bool)
skipLine
rawLine :: ParsecT s u m String
rawLine = do
String
c <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Char -> ParsecT s u m String)
-> ParsecT s u m Char -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\n"
ParsecT s u m Char -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\n') ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
c
parseHereData :: Quoted
-> (SourcePos, SourcePos)
-> String
-> ParsecT String UserState (SCBase m) [Token]
parseHereData Quoted (start :: SourcePos
start,end :: SourcePos
end) hereData :: String
hereData = do
Id
id <- SourcePos -> SourcePos -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
start SourcePos
end
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Id -> String -> Token
T_Literal Id
id String
hereData]
parseHereData Unquoted (startPos :: SourcePos
startPos, _) hereData :: String
hereData =
SourcePos
-> ParsecT String UserState (SCBase m) [Token]
-> String
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse SourcePos
startPos ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Token]
readHereData String
hereData
readHereData :: ParsecT String UserState (SCBase m) [Token]
readHereData = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token])
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
doubleQuotedPart ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *).
Stream s m Char =>
ParsecT s UserState m Token
readHereLiteral
readHereLiteral :: ParsecT s UserState m Token
readHereLiteral = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
chars <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s UserState m Char -> ParsecT s UserState m String)
-> ParsecT s UserState m Char -> ParsecT s UserState m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "`$\\"
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
chars
debugHereDoc :: Id -> String -> String -> ParsecT String UserState (SCBase m) ()
debugHereDoc tokenId :: Id
tokenId endToken :: String
endToken doc :: String
doc
| String
endToken String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf` String
doc =
let lookAt :: String -> ParsecT String UserState (SCBase m) ()
lookAt line :: String
line = Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
endToken String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf` String
line) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
tokenId Severity
ErrorC 1042 ("Close matches include '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
line String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' (!= '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
endToken String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"').")
in do
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
tokenId Severity
ErrorC 1041 ("Found '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
endToken String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' further down, but not on a separate line.")
(String -> ParsecT String UserState (SCBase m) ())
-> [String] -> ParsecT String UserState (SCBase m) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) ()
lookAt (String -> [String]
lines String
doc)
| (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
endToken String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf` (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
doc =
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
tokenId Severity
ErrorC 1043 ("Found " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
endToken String -> String -> String
forall a. [a] -> [a] -> [a]
++ " further down, but with wrong casing.")
| Bool
otherwise =
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
tokenId Severity
ErrorC 1044 ("Couldn't find end token `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
endToken String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' in the here document.")
readFilename :: ParsecT String UserState (SCBase m) Token
readFilename = ParsecT String UserState (SCBase m) Token
readNormalWord
readIoFileOp :: ParsecT s UserState m Token
readIoFileOp = [ParsecT s UserState m Token] -> ParsecT s UserState m Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DGREAT, ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_LESSGREAT, ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_GREATAND, ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_LESSAND, ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_CLOBBER, Char -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s a.
Stream s m Char =>
Char -> (Id -> a) -> ParsecT s UserState m a
redirToken '<' Id -> Token
T_Less, Char -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s a.
Stream s m Char =>
Char -> (Id -> a) -> ParsecT s UserState m a
redirToken '>' Id -> Token
T_Greater ]
readIoDuplicate :: ParsecT s UserState m Token
readIoDuplicate = ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m Token -> ParsecT s UserState m Token)
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Token
op <- ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_GREATAND ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_LESSAND
String
target <- ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readIoVariable ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
digitsAndOrDash
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> String -> Token
T_IoDuplicate Id
id Token
op String
target
where
digitsAndOrDash :: ParsecT s u m String
digitsAndOrDash = do
String
str <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
String
dash <- (if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
str then ParsecT s u m String -> ParsecT s u m String
forall a. a -> a
id else String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option "") (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "-"
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT s u m String) -> String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String
str String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
dash
prop_readIoFile :: Bool
prop_readIoFile = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoFile ">> \"$(date +%YYmmDD)\""
readIoFile :: ParsecT String UserState (SCBase m) Token
readIoFile = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "redirection" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Token
op <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, Stream s m Char,
MonadState SystemState m) =>
ParsecT s UserState m Token
readIoFileOp
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token
file <- ParsecT String UserState (SCBase m) Token
readFilename
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_IoFile Id
id Token
op Token
file
readIoVariable :: ParsecT s u m String
readIoVariable = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ do
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
String
x <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> ParsecT s u m String) -> String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ "{" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ "}"
readIoSource :: ParsecT s UserState m String
readIoSource = ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m String -> ParsecT s UserState m String)
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall a b. (a -> b) -> a -> b
$ do
String
x <- String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "&" ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readIoVariable ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
ParsecT s UserState m () -> ParsecT s UserState m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s UserState m () -> ParsecT s UserState m ())
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ ParsecT s UserState m Token -> ParsecT s UserState m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT s UserState m Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, Stream s m Char,
MonadState SystemState m) =>
ParsecT s UserState m Token
readIoFileOp ParsecT s UserState m ()
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m String -> ParsecT s UserState m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "<<")
String -> ParsecT s UserState m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
x
prop_readIoRedirect :: Bool
prop_readIoRedirect = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "3>&2"
prop_readIoRedirect2 :: Bool
prop_readIoRedirect2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "2> lol"
prop_readIoRedirect3 :: Bool
prop_readIoRedirect3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "4>&-"
prop_readIoRedirect4 :: Bool
prop_readIoRedirect4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "&> lol"
prop_readIoRedirect5 :: Bool
prop_readIoRedirect5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "{foo}>&2"
prop_readIoRedirect6 :: Bool
prop_readIoRedirect6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "{foo}<&-"
prop_readIoRedirect7 :: Bool
prop_readIoRedirect7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect "{foo}>&1-"
readIoRedirect :: ParsecT String UserState (SCBase m) Token
readIoRedirect = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
n <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m String
readIoSource
Token
redir <- ParsecT String UserState (SCBase m) Token
readHereString ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readHereDoc ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
readIoDuplicate ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readIoFile
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
skipAnnotationAndWarn
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token -> Token
T_FdRedirect Id
id String
n Token
redir
readRedirectList :: ParsecT String UserState (SCBase m) [Token]
readRedirectList = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect
prop_readHereString :: Bool
prop_readHereString = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readHereString "<<< \"Hello $world\""
readHereString :: ParsecT String UserState (SCBase m) Token
readHereString = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "here string" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "<<<"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token
word <- ParsecT String UserState (SCBase m) Token
readNormalWord
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_HereString Id
id Token
word
readNewlineList :: ParsecT String UserState (SCBase m) String
readNewlineList =
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ((ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m,
Stream s m Char) =>
ParsecT s UserState m Char
carriageReturn) ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing) ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) String
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m ()
checkBadBreak
where
checkBadBreak :: ParsecT s u m ()
checkBadBreak = ParsecT s u m () -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "|&")
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1133
"Unexpected start of line. If breaking lines, |/||/&& should be at the end of the previous one."
readLineBreak :: ParsecT String UserState (SCBase m) ()
readLineBreak = ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readNewlineList
prop_readSeparator1 :: Bool
prop_readSeparator1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "a &; b"
prop_readSeparator2 :: Bool
prop_readSeparator2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "a & b"
prop_readSeparator3 :: Bool
prop_readSeparator3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "a & b"
prop_readSeparator4 :: Bool
prop_readSeparator4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "a > file; b"
prop_readSeparator5 :: Bool
prop_readSeparator5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "curl https://example.com/?foo=moo&bar=cow"
readSeparatorOp :: ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
readSeparatorOp = do
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_AND_IF ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) CaseType
readCaseSeparator)
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "&>")
SourcePos
start <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char
f <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '&'
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ [ParsecT String UserState (SCBase m) ()]
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
do
String
s <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ([String] -> ParsecT String UserState (SCBase m) String)
-> [String]
-> ParsecT String UserState (SCBase m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ParsecT String UserState (SCBase m) String]
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ([ParsecT String UserState (SCBase m) String]
-> ParsecT String UserState (SCBase m) String)
-> ([String] -> [ParsecT String UserState (SCBase m) String])
-> [String]
-> ParsecT String UserState (SCBase m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> ParsecT String UserState (SCBase m) String)
-> [String] -> [ParsecT String UserState (SCBase m) String]
forall a b. (a -> b) -> [a] -> [b]
map (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> (String -> ParsecT String UserState (SCBase m) String)
-> String
-> ParsecT String UserState (SCBase m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string) ([String] -> ParsecT String UserState (SCBase m) String)
-> [String] -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$
["amp;", "gt;", "lt;"]
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1109 "This is an unquoted HTML entity. Replace with corresponding character.",
do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableStart
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1132 "This & terminates the command. Escape it or add space after & to silence."
]
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1045 "It's not 'foo &; bar', just 'foo & bar'."
Char -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. Monad m => a -> m a
return '&'
) ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '&'
SourcePos
end <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
(Char, (SourcePos, SourcePos))
-> ParsecT
String UserState (SCBase m) (Char, (SourcePos, SourcePos))
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
f, (SourcePos
start, SourcePos
end))
readSequentialSep :: ParsecT String UserState (SCBase m) ()
readSequentialSep = ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak) ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readNewlineList
readSeparator :: ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
readSeparator =
do
(Char, (SourcePos, SourcePos))
separator <- ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
readSeparatorOp
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak
(Char, (SourcePos, SourcePos))
-> ParsecT
String UserState (SCBase m) (Char, (SourcePos, SourcePos))
forall (m :: * -> *) a. Monad m => a -> m a
return (Char, (SourcePos, SourcePos))
separator
ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
-> ParsecT
String UserState (SCBase m) (Char, (SourcePos, SourcePos))
-> ParsecT
String UserState (SCBase m) (Char, (SourcePos, SourcePos))
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
do
SourcePos
start <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
readNewlineList
SourcePos
end <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(Char, (SourcePos, SourcePos))
-> ParsecT
String UserState (SCBase m) (Char, (SourcePos, SourcePos))
forall (m :: * -> *) a. Monad m => a -> m a
return ('\n', (SourcePos
start, SourcePos
end))
prop_readSimpleCommand :: Bool
prop_readSimpleCommand = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "echo test > file"
prop_readSimpleCommand2 :: Bool
prop_readSimpleCommand2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "cmd &> file"
prop_readSimpleCommand3 :: Bool
prop_readSimpleCommand3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "export foo=(bar baz)"
prop_readSimpleCommand4 :: Bool
prop_readSimpleCommand4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "typeset -a foo=(lol)"
prop_readSimpleCommand5 :: Bool
prop_readSimpleCommand5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "time if true; then echo foo; fi"
prop_readSimpleCommand6 :: Bool
prop_readSimpleCommand6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "time -p ( ls -l; )"
prop_readSimpleCommand7 :: Bool
prop_readSimpleCommand7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "\\ls"
prop_readSimpleCommand8 :: Bool
prop_readSimpleCommand8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "// Lol"
prop_readSimpleCommand9 :: Bool
prop_readSimpleCommand9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "/* Lolbert */"
prop_readSimpleCommand10 :: Bool
prop_readSimpleCommand10 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "/**** Lolbert */"
prop_readSimpleCommand11 :: Bool
prop_readSimpleCommand11 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "/\\* foo"
prop_readSimpleCommand12 :: Bool
prop_readSimpleCommand12 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "elsif foo"
prop_readSimpleCommand13 :: Bool
prop_readSimpleCommand13 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "ElseIf foo"
prop_readSimpleCommand14 :: Bool
prop_readSimpleCommand14 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSimpleCommand "elseif[$i==2]"
readSimpleCommand :: ParsecT String UserState (SCBase m) Token
readSimpleCommand = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "simple command" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
[Token]
prefix <- [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT String UserState (SCBase m) [Token]
readCmdPrefix
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
skipAnnotationAndWarn
Maybe Token
cmd <- Maybe Token
-> ParsecT String UserState (SCBase m) (Maybe Token)
-> ParsecT String UserState (SCBase m) (Maybe Token)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Maybe Token
forall a. Maybe a
Nothing (ParsecT String UserState (SCBase m) (Maybe Token)
-> ParsecT String UserState (SCBase m) (Maybe Token))
-> ParsecT String UserState (SCBase m) (Maybe Token)
-> ParsecT String UserState (SCBase m) (Maybe Token)
forall a b. (a -> b) -> a -> b
$ Token -> Maybe Token
forall a. a -> Maybe a
Just (Token -> Maybe Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Maybe Token)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String UserState (SCBase m) Token
readCmdName
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ([Token] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Token]
prefix Bool -> Bool -> Bool
&& Maybe Token -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Token
cmd) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected a command"
case Maybe Token
cmd of
Nothing -> do
Id
id1 <- [Token] -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *).
Monad m =>
[Token] -> ParsecT String UserState (SCBase m) Id
getNextIdSpanningTokenList [Token]
prefix
Id
id2 <- Id -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *). Monad m => Id -> SCParser m Id
getNewIdFor Id
id1
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Id -> [Token] -> [Token] -> [Token] -> Token
makeSimpleCommand Id
id1 Id
id2 [Token]
prefix [] []
Just cmd :: Token
cmd -> do
Token -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Token -> ParsecT String UserState (SCBase m) ()
validateCommand Token
cmd
[Token]
suffix <- [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] (ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token])
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) [Token]
-> Token
-> [([String], ParsecT String UserState (SCBase m) [Token])]
-> ParsecT String UserState (SCBase m) [Token]
forall (t :: * -> *) t.
Foldable t =>
t -> Token -> [(t String, t)] -> t
getParser ParsecT String UserState (SCBase m) [Token]
readCmdSuffix Token
cmd [
(["declare", "export", "local", "readonly", "typeset"], ParsecT String UserState (SCBase m) [Token]
readModifierSuffix),
(["time"], ParsecT String UserState (SCBase m) [Token]
readTimeSuffix),
(["let"], ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Token]
readLetSuffix),
(["eval"], ParsecT String UserState (SCBase m) [Token]
readEvalSuffix)
]
Id
id1 <- [Token] -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *).
Monad m =>
[Token] -> ParsecT String UserState (SCBase m) Id
getNextIdSpanningTokenList ([Token]
prefix [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ (Token
cmdToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
suffix))
Id
id2 <- Id -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *). Monad m => Id -> SCParser m Id
getNewIdFor Id
id1
let result :: Token
result = Id -> Id -> [Token] -> [Token] -> [Token] -> Token
makeSimpleCommand Id
id1 Id
id2 [Token]
prefix [Token
cmd] [Token]
suffix
if [String] -> Token -> Bool
forall (t :: * -> *). Foldable t => t String -> Token -> Bool
isCommand ["source", "."] Token
cmd
then Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *). Monad m => Token -> SCParser m Token
readSource Token
result
else Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
result
where
isCommand :: t String -> Token -> Bool
isCommand strings :: t String
strings (T_NormalWord _ [T_Literal _ s :: String
s]) = String
s String -> t String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` t String
strings
isCommand _ _ = Bool
False
getParser :: t -> Token -> [(t String, t)] -> t
getParser def :: t
def cmd :: Token
cmd [] = t
def
getParser def :: t
def cmd :: Token
cmd ((list :: t String
list, action :: t
action):rest :: [(t String, t)]
rest) =
if t String -> Token -> Bool
forall (t :: * -> *). Foldable t => t String -> Token -> Bool
isCommand t String
list Token
cmd
then t
action
else t -> Token -> [(t String, t)] -> t
getParser t
def Token
cmd [(t String, t)]
rest
cStyleComment :: p -> Bool
cStyleComment cmd :: p
cmd =
case p
cmd of
_ -> Bool
False
validateCommand :: Token -> SCParser m ()
validateCommand cmd :: Token
cmd =
case Token
cmd of
(T_NormalWord _ [T_Literal _ "//"]) -> Id -> SCParser m ()
forall (m :: * -> *). Monad m => Id -> SCParser m ()
commentWarning (Token -> Id
getId Token
cmd)
(T_NormalWord _ (T_Literal _ "/" : T_Glob _ "*" :_)) -> Id -> SCParser m ()
forall (m :: * -> *). Monad m => Id -> SCParser m ()
commentWarning (Token -> Id
getId Token
cmd)
(T_NormalWord _ (T_Literal _ str :: String
str:_)) -> do
let cmdString :: String
cmdString = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
takeWhile Char -> Bool
isAlpha String
str
Bool -> SCParser m () -> SCParser m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
cmdString String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["elsif", "elseif"]) (SCParser m () -> SCParser m ()) -> SCParser m () -> SCParser m ()
forall a b. (a -> b) -> a -> b
$
Id -> Severity -> Integer -> String -> SCParser m ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId (Token -> Id
getId Token
cmd) Severity
ErrorC 1131 "Use 'elif' to start another branch."
_ -> () -> SCParser m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
commentWarning :: Id -> SCParser m ()
commentWarning id :: Id
id =
Id -> Severity -> Integer -> String -> SCParser m ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
id Severity
ErrorC 1127 "Was this intended as a comment? Use # in sh."
makeSimpleCommand :: Id -> Id -> [Token] -> [Token] -> [Token] -> Token
makeSimpleCommand id1 :: Id
id1 id2 :: Id
id2 prefix :: [Token]
prefix cmd :: [Token]
cmd suffix :: [Token]
suffix =
let
(preAssigned :: [Token]
preAssigned, preRest :: [Token]
preRest) = (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition Token -> Bool
assignment [Token]
prefix
(preRedirected :: [Token]
preRedirected, preRest2 :: [Token]
preRest2) = (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition Token -> Bool
redirection [Token]
preRest
(postRedirected :: [Token]
postRedirected, postRest :: [Token]
postRest) = (Token -> Bool) -> [Token] -> ([Token], [Token])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition Token -> Bool
redirection [Token]
suffix
redirs :: [Token]
redirs = [Token]
preRedirected [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token]
postRedirected
assigns :: [Token]
assigns = [Token]
preAssigned
args :: [Token]
args = [Token]
cmd [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token]
preRest2 [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token]
postRest
in
Id -> [Token] -> Token -> Token
T_Redirecting Id
id1 [Token]
redirs (Token -> Token) -> Token -> Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_SimpleCommand Id
id2 [Token]
assigns [Token]
args
where
assignment :: Token -> Bool
assignment (T_Assignment {}) = Bool
True
assignment _ = Bool
False
redirection :: Token -> Bool
redirection (T_FdRedirect {}) = Bool
True
redirection _ = Bool
False
readSource :: Monad m => Token -> SCParser m Token
readSource :: Token -> SCParser m Token
readSource t :: Token
t@(T_Redirecting _ _ (T_SimpleCommand cmdId :: Id
cmdId _ (cmd :: Token
cmd:file' :: Token
file':rest' :: [Token]
rest'))) = do
let file :: Token
file = Token -> [Token] -> Token
getFile Token
file' [Token]
rest'
Maybe String
override <- ParsecT String UserState (SCBase m) (Maybe String)
forall (m :: * -> *). MonadState SystemState m => m (Maybe String)
getSourceOverride
let literalFile :: Maybe String
literalFile = do
String
name <- Maybe String
override Maybe String -> Maybe String -> Maybe String
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Token -> Maybe String
getLiteralString Token
file
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> (Bool -> Bool) -> Bool -> Maybe ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Bool
not (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ "~/" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
name
String -> Maybe String
forall (m :: * -> *) a. Monad m => a -> m a
return String
name
case Maybe String
literalFile of
Nothing -> do
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseNoteAtId (Token -> Id
getId Token
file) Severity
WarningC 1090
"Can't follow non-constant source. Use a directive to specify location."
Token -> SCParser m Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
Just filename :: String
filename -> do
Bool
proceed <- String -> ParsecT String UserState (SCBase m) Bool
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
String -> ParsecT s u m Bool
shouldFollow String
filename
if Bool -> Bool
not Bool
proceed
then do
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseNoteAtId (Token -> Id
getId Token
file) Severity
InfoC 1093
"This file appears to be recursively sourced. Ignoring."
Token -> SCParser m Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
else do
SystemInterface m
sys <- (Environment m -> SystemInterface m)
-> ParsecT String UserState (SCBase m) (SystemInterface m)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> SystemInterface m
forall (m :: * -> *). Environment m -> SystemInterface m
systemInterface
(input :: Either String String
input, resolvedFile :: String
resolvedFile) <-
if String
filename String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "/dev/null"
then (Either String String, String)
-> ParsecT
String UserState (SCBase m) (Either String String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Either String String
forall a b. b -> Either a b
Right "", String
filename)
else do
String
currentScript <- (Environment m -> String)
-> ParsecT String UserState (SCBase m) String
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> String
forall (m :: * -> *). Environment m -> String
currentFilename
[String]
paths <- (Annotation -> Maybe String) -> [Annotation] -> [String]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Annotation -> Maybe String
getSourcePath ([Annotation] -> [String])
-> ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> ParsecT String UserState (SCBase m) [Annotation]
forall (f :: * -> *).
MonadState SystemState f =>
Bool -> f [Annotation]
getCurrentAnnotations Bool
True
String
resolved <- m String -> ParsecT String UserState (SCBase m) String
forall (t :: (* -> *) -> * -> *) (t :: (* -> *) -> * -> *)
(t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, MonadTrans t, MonadTrans t, Monad m,
Monad (t (t m)), Monad (t m)) =>
m a -> t (t (t m)) a
system (m String -> ParsecT String UserState (SCBase m) String)
-> m String -> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ SystemInterface m -> String -> [String] -> String -> m String
forall (m :: * -> *).
SystemInterface m -> String -> [String] -> String -> m String
siFindSource SystemInterface m
sys String
currentScript [String]
paths String
filename
Either String String
contents <- m (Either String String)
-> ParsecT String UserState (SCBase m) (Either String String)
forall (t :: (* -> *) -> * -> *) (t :: (* -> *) -> * -> *)
(t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, MonadTrans t, MonadTrans t, Monad m,
Monad (t (t m)), Monad (t m)) =>
m a -> t (t (t m)) a
system (m (Either String String)
-> ParsecT String UserState (SCBase m) (Either String String))
-> m (Either String String)
-> ParsecT String UserState (SCBase m) (Either String String)
forall a b. (a -> b) -> a -> b
$ SystemInterface m -> String -> m (Either String String)
forall (m :: * -> *).
SystemInterface m -> String -> m (Either String String)
siReadFile SystemInterface m
sys String
resolved
(Either String String, String)
-> ParsecT
String UserState (SCBase m) (Either String String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String String
contents, String
resolved)
case Either String String
input of
Left err :: String
err -> do
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseNoteAtId (Token -> Id
getId Token
file) Severity
InfoC 1091 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
"Not following: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err
Token -> SCParser m Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
Right script :: String
script -> do
Id
id1 <- Id -> SCParser m Id
forall (m :: * -> *). Monad m => Id -> SCParser m Id
getNewIdFor Id
cmdId
Id
id2 <- Id -> SCParser m Id
forall (m :: * -> *). Monad m => Id -> SCParser m Id
getNewIdFor Id
cmdId
let included :: ParsecT String UserState (SCBase m) Token
included = do
Token
src <- String -> String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> String -> ParsecT String UserState (SCBase m) Token
subRead String
resolvedFile String
script
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_SourceCommand Id
id1 Token
t (Id -> Token -> Token
T_Include Id
id2 Token
src)
let failed :: ParsecT String UserState (SCBase m) Token
failed = do
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseNoteAtId (Token -> Id
getId Token
file) Severity
WarningC 1094
"Parsing of sourced file failed. Ignoring it."
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
included SCParser m Token -> SCParser m Token -> SCParser m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
failed
where
getFile :: Token -> [Token] -> Token
getFile :: Token -> [Token] -> Token
getFile file :: Token
file (next :: Token
next:rest :: [Token]
rest) =
case Token -> Maybe String
getLiteralString Token
file of
Just "--" -> Token
next
x :: Maybe String
x -> Token
file
getFile file :: Token
file _ = Token
file
getSourcePath :: Annotation -> Maybe String
getSourcePath t :: Annotation
t =
case Annotation
t of
SourcePath x :: String
x -> String -> Maybe String
forall a. a -> Maybe a
Just String
x
_ -> Maybe String
forall a. Maybe a
Nothing
subRead :: String -> String -> ParsecT String UserState (SCBase m) Token
subRead name :: String
name script :: String
script =
Context
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u b.
(Stream s m t, MonadState SystemState m) =>
Context -> ParsecT s u m b -> ParsecT s u m b
withContext (String -> Context
ContextSource String
name) (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) s u b.
MonadState s m =>
ParsecT s u m b -> ParsecT s u m b
inSeparateContext (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$
SourcePos
-> ParsecT String UserState (SCBase m) Token
-> String
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse (String -> SourcePos
initialPos String
name) (Bool -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readScriptFile Bool
True) String
script
readSource t :: Token
t = Token -> SCParser m Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
prop_readPipeline :: Bool
prop_readPipeline = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readPipeline "! cat /etc/issue | grep -i ubuntu"
prop_readPipeline2 :: Bool
prop_readPipeline2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readPipeline "!cat /etc/issue | grep -i ubuntu"
prop_readPipeline3 :: Bool
prop_readPipeline3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readPipeline "for f; do :; done|cat"
readPipeline :: ParsecT String UserState (SCBase m) Token
readPipeline = do
String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
String -> ParsecT s u m a -> ParsecT s u m ()
unexpecting "keyword/token" ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readKeyword
do
(T_Bang id :: Id
id) <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Bang
Token
pipe <- ParsecT String UserState (SCBase m) Token
readPipeSequence
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_Banged Id
id Token
pipe
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
ParsecT String UserState (SCBase m) Token
readPipeSequence
prop_readAndOr :: Bool
prop_readAndOr = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAndOr "grep -i lol foo || exit 1"
prop_readAndOr1 :: Bool
prop_readAndOr1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAndOr "# shellcheck disable=1\nfoo"
prop_readAndOr2 :: Bool
prop_readAndOr2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAndOr "# shellcheck disable=1\n# lol\n# shellcheck disable=3\nfoo"
readAndOr :: ParsecT String UserState (SCBase m) Token
readAndOr = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
apos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
[Annotation]
annotations <- ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotations
Id
aid <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([Annotation] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Annotation]
annotations) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readKeyword
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
apos Severity
ErrorC 1123 "ShellCheck directives are only valid in front of complete compound commands, like 'if', not e.g. individual 'elif' branches."
Token
andOr <- [Annotation]
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u b.
(Stream s m t, MonadState SystemState m) =>
[Annotation] -> ParsecT s u m b -> ParsecT s u m b
withAnnotations [Annotation]
annotations (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
chainr1 ParsecT String UserState (SCBase m) Token
readPipeline (ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
Token
op <- ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_AND_IF ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_OR_IF
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak
(Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token))
-> (Token -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Token -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ case Token
op of T_AND_IF id :: Id
id -> Id -> Token -> Token -> Token
T_AndIf Id
id
T_OR_IF id :: Id
id -> Id -> Token -> Token -> Token
T_OrIf Id
id
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ if [Annotation] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Annotation]
annotations
then Token
andOr
else Id -> [Annotation] -> Token -> Token
T_Annotation Id
aid [Annotation]
annotations Token
andOr
readTermOrNone :: ParsecT String UserState (SCBase m) [Token]
readTermOrNone = do
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Token]
readTerm ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return []
prop_readTerm :: Bool
prop_readTerm = ParsecT String UserState (SCBase Identity) [Token]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Token]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Token]
readTerm "time ( foo; bar; )"
readTerm :: ParsecT String UserState (SCBase m) [Token]
readTerm = do
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
Token
m <- ParsecT String UserState (SCBase m) Token
readAndOr
Token -> ParsecT String UserState (SCBase m) [Token]
readTerm' Token
m
where
readTerm' :: Token -> ParsecT String UserState (SCBase m) [Token]
readTerm' current :: Token
current =
do
(sep :: Char
sep, (start :: SourcePos
start, end :: SourcePos
end)) <- ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Char, (SourcePos, SourcePos))
readSeparator
Id
id <- SourcePos -> SourcePos -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
SourcePos -> SourcePos -> ParsecT s UserState m Id
getNextIdBetween SourcePos
start SourcePos
end
Token
more <- Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option (Id -> Token
T_EOF Id
id) ParsecT String UserState (SCBase m) Token
readAndOr
case Token
more of (T_EOF _) -> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Id -> Char -> Token -> Token
transformWithSeparator Id
id Char
sep Token
current]
_ -> do
[Token]
list <- Token -> ParsecT String UserState (SCBase m) [Token]
readTerm' Token
more
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return (Id -> Char -> Token -> Token
transformWithSeparator Id
id Char
sep Token
current Token -> [Token] -> [Token]
forall a. a -> [a] -> [a]
: [Token]
list)
ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token
current]
where
transformWithSeparator :: Id -> Char -> Token -> Token
transformWithSeparator i :: Id
i '&' = Id -> Token -> Token
T_Backgrounded Id
i
transformWithSeparator i :: Id
i _ = Token -> Token
forall a. a -> a
id
readPipeSequence :: ParsecT String UserState (SCBase m) Token
readPipeSequence = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
(cmds :: [Token]
cmds, pipes :: [Token]
pipes) <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall s (m :: * -> *) t u a a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m ([a], [a])
sepBy1WithSeparators ParsecT String UserState (SCBase m) Token
readCommand
(ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
readPipe ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` (ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak))
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_Pipeline Id
id [Token]
pipes [Token]
cmds
where
sepBy1WithSeparators :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m ([a], [a])
sepBy1WithSeparators p :: ParsecT s u m a
p s :: ParsecT s u m a
s = do
let elems :: ParsecT s u m ([a], [a])
elems = ParsecT s u m a
p ParsecT s u m a
-> (a -> ParsecT s u m ([a], [a])) -> ParsecT s u m ([a], [a])
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \x :: a
x -> ([a], [a]) -> ParsecT s u m ([a], [a])
forall (m :: * -> *) a. Monad m => a -> m a
return ([a
x], [])
let seps :: ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a]))
seps = do
a
separator <- ParsecT s u m a
s
(([a], [a]) -> ([a], [a]) -> ([a], [a]))
-> ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a]))
forall (m :: * -> *) a. Monad m => a -> m a
return ((([a], [a]) -> ([a], [a]) -> ([a], [a]))
-> ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a])))
-> (([a], [a]) -> ([a], [a]) -> ([a], [a]))
-> ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a]))
forall a b. (a -> b) -> a -> b
$ \(a :: [a]
a,b :: [a]
b) (c :: [a]
c,d :: [a]
d) -> ([a]
a[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
c, [a]
b [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
d [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
separator])
ParsecT s u m ([a], [a])
forall a. ParsecT s u m ([a], [a])
elems ParsecT s u m ([a], [a])
-> ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a]))
-> ParsecT s u m ([a], [a])
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (a -> a -> a) -> ParsecT s u m a
`chainl1` ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a]))
forall a. ParsecT s u m (([a], [a]) -> ([a], [a]) -> ([a], [a]))
seps
readPipe :: ParsecT s UserState m Token
readPipe = do
ParsecT s UserState m Token -> ParsecT s UserState m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_OR_IF
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '|'
String
qualifier <- String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "&" ParsecT s UserState m String
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s UserState m String
forall (m :: * -> *) a. Monad m => a -> m a
return ""
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Pipe Id
id ('|'Char -> String -> String
forall a. a -> [a] -> [a]
:String
qualifier)
readCommand :: ParsecT String UserState (SCBase m) Token
readCommand = [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
readCompoundCommand,
ParsecT String UserState (SCBase m) Token
readCoProc,
ParsecT String UserState (SCBase m) Token
readSimpleCommand
]
readCmdName :: ParsecT String UserState (SCBase m) Token
readCmdName = do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ())
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\'
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
variableChars
ParsecT String UserState (SCBase m) Token
readCmdWord
readCmdWord :: ParsecT String UserState (SCBase m) Token
readCmdWord = do
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
skipAnnotationAndWarn
ParsecT String UserState (SCBase m) Token
readNormalWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
skipAnnotationAndWarn :: ParsecT s UserState m ()
skipAnnotationAndWarn = ParsecT s UserState m String -> ParsecT s UserState m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s UserState m String -> ParsecT s UserState m ())
-> ParsecT s UserState m String -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT s UserState m String -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m String -> ParsecT s UserState m String)
-> (ParsecT s UserState m String -> ParsecT s UserState m String)
-> ParsecT s UserState m String
-> ParsecT s UserState m String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT s UserState m String -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s UserState m String -> ParsecT s UserState m String)
-> ParsecT s UserState m String -> ParsecT s UserState m String
forall a b. (a -> b) -> a -> b
$ ParsecT s UserState m String
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m String
readAnnotationPrefix
Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1126 "Place shellcheck directives before commands, not after."
ParsecT s UserState m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readAnyComment
prop_readIfClause :: Bool
prop_readIfClause = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIfClause "if false; then foo; elif true; then stuff; more stuff; else cows; fi"
prop_readIfClause2 :: Bool
prop_readIfClause2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIfClause "if false; then; echo oo; fi"
prop_readIfClause3 :: Bool
prop_readIfClause3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIfClause "if false; then true; else; echo lol; fi"
prop_readIfClause4 :: Bool
prop_readIfClause4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIfClause "if false; then true; else if true; then echo lol; fi; fi"
prop_readIfClause5 :: Bool
prop_readIfClause5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIfClause "if false; then true; else\nif true; then echo lol; fi; fi"
readIfClause :: ParsecT String UserState (SCBase m) Token
readIfClause = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "if expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(condition :: [Token]
condition, action :: [Token]
action) <- ParsecT String UserState (SCBase m) ([Token], [Token])
readIfPart
[([Token], [Token])]
elifs <- ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) [([Token], [Token])]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) ([Token], [Token])
readElifPart
[Token]
elses <- [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT String UserState (SCBase m) [Token]
readElsePart
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Fi ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
`orFail` do
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1046 "Couldn't find 'fi' for this 'if'."
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1047 "Expected 'fi' matching previously mentioned 'if'."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "Expected 'fi'"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [([Token], [Token])] -> [Token] -> Token
T_IfExpression Id
id (([Token]
condition, [Token]
action)([Token], [Token]) -> [([Token], [Token])] -> [([Token], [Token])]
forall a. a -> [a] -> [a]
:[([Token], [Token])]
elifs) [Token]
elses
verifyNotEmptyIf :: String -> ParsecT String UserState (SCBase m) ()
verifyNotEmptyIf s :: String
s =
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (do
SourcePos
emptyPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ (ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Fi ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Elif ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Else)
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
emptyPos Severity
ErrorC 1048 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ "Can't have empty " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ " clauses (use 'true' as a no-op).")
readIfPart :: ParsecT String UserState (SCBase m) ([Token], [Token])
readIfPart = do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_If
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
[Token]
condition <- ParsecT String UserState (SCBase m) [Token]
readTerm
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m ()
ifNextToken (ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Fi ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Elif ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Else) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1049 "Did you forget the 'then' for this 'if'?"
String
-> ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "then clause" (ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token]))
-> ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Then ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
`orFail` do
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1050 "Expected 'then'."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "Expected 'then'"
ParsecT String UserState (SCBase m) Token
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t (m :: * -> *) u a.
(Stream s m t, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi Severity
ErrorC 1051 "Semicolons directly after 'then' are not allowed. Just remove it."
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) ()
verifyNotEmptyIf "then"
[Token]
action <- ParsecT String UserState (SCBase m) [Token]
readTerm
([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall (m :: * -> *) a. Monad m => a -> m a
return ([Token]
condition, [Token]
action)
readElifPart :: ParsecT String UserState (SCBase m) ([Token], [Token])
readElifPart = String
-> ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "elif clause" (ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token]))
-> ParsecT String UserState (SCBase m) ([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Elif
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
[Token]
condition <- ParsecT String UserState (SCBase m) [Token]
readTerm
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m ()
ifNextToken (ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Fi ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Elif ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Else) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1049 "Did you forget the 'then' for this 'elif'?"
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Then
ParsecT String UserState (SCBase m) Token
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t (m :: * -> *) u a.
(Stream s m t, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi Severity
ErrorC 1052 "Semicolons directly after 'then' are not allowed. Just remove it."
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) ()
verifyNotEmptyIf "then"
[Token]
action <- ParsecT String UserState (SCBase m) [Token]
readTerm
([Token], [Token])
-> ParsecT String UserState (SCBase m) ([Token], [Token])
forall (m :: * -> *) a. Monad m => a -> m a
return ([Token]
condition, [Token]
action)
readElsePart :: ParsecT String UserState (SCBase m) [Token]
readElsePart = String
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "else clause" (ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token])
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Else
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_If
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1075 "Use 'elif' instead of 'else if' (or put 'if' on new line if nesting)."
ParsecT String UserState (SCBase m) Token
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t (m :: * -> *) u a.
(Stream s m t, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi Severity
ErrorC 1053 "Semicolons directly after 'else' are not allowed. Just remove it."
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
String -> ParsecT String UserState (SCBase m) ()
verifyNotEmptyIf "else"
ParsecT String UserState (SCBase m) [Token]
readTerm
ifNextToken :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m ()
ifNextToken parser :: ParsecT s u m a
parser action :: ParsecT s u m a
action =
ParsecT s u m a -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s u m a -> ParsecT s u m ())
-> ParsecT s u m a -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m a -> ParsecT s u m a)
-> (ParsecT s u m a -> ParsecT s u m a)
-> ParsecT s u m a
-> ParsecT s u m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m a -> ParsecT s u m a)
-> ParsecT s u m a -> ParsecT s u m a
forall a b. (a -> b) -> a -> b
$ ParsecT s u m a
parser
ParsecT s u m a
action
prop_readSubshell :: Bool
prop_readSubshell = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSubshell "( cd /foo; tar cf stuff.tar * )"
readSubshell :: ParsecT String UserState (SCBase m) Token
readSubshell = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "explicit subshell" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
[Token]
list <- ParsecT String UserState (SCBase m) [Token]
readCompoundList
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected ) closing the subshell"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Subshell Id
id [Token]
list
prop_readBraceGroup :: Bool
prop_readBraceGroup = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraceGroup "{ a; b | c | d; e; }"
prop_readBraceGroup2 :: Bool
prop_readBraceGroup2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraceGroup "{foo;}"
prop_readBraceGroup3 :: Bool
prop_readBraceGroup3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBraceGroup "{(foo)}"
readBraceGroup :: ParsecT String UserState (SCBase m) Token
readBraceGroup = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "brace group" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacingOrFail ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "("
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1054 "You need a space after the '{'.")
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1055 "You need at least one command here. Use 'true;' as a no-op."
[Token]
list <- ParsecT String UserState (SCBase m) [Token]
readTerm
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1056 "Expected a '}'. If you have one, try a ; or \\n in front of it."
String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Missing '}'"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_BraceGroup Id
id [Token]
list
prop_readBatsTest :: Bool
prop_readBatsTest = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readBatsTest "@test 'can parse' {\n true\n}"
readBatsTest :: ParsecT String UserState (SCBase m) Token
readBatsTest = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "bats @test" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "@test"
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token
name <- ParsecT String UserState (SCBase m) Token
readNormalWord
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token
test <- ParsecT String UserState (SCBase m) Token
readBraceGroup
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token -> Token
T_BatsTest Id
id Token
name Token
test
prop_readWhileClause :: Bool
prop_readWhileClause = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readWhileClause "while [[ -e foo ]]; do sleep 1; done"
readWhileClause :: ParsecT String UserState (SCBase m) Token
readWhileClause = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "while loop" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Id
kwId <- Token -> Id
getId (Token -> Id)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Id
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_While
[Token]
condition <- ParsecT String UserState (SCBase m) [Token]
readTerm
[Token]
statements <- Id -> ParsecT String UserState (SCBase m) [Token]
readDoGroup Id
kwId
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_WhileExpression Id
id [Token]
condition [Token]
statements
prop_readUntilClause :: Bool
prop_readUntilClause = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readUntilClause "until kill -0 $PID; do sleep 1; done"
readUntilClause :: ParsecT String UserState (SCBase m) Token
readUntilClause = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "until loop" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Id
kwId <- Token -> Id
getId (Token -> Id)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Id
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Until
[Token]
condition <- ParsecT String UserState (SCBase m) [Token]
readTerm
[Token]
statements <- Id -> ParsecT String UserState (SCBase m) [Token]
readDoGroup Id
kwId
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> [Token] -> Token
T_UntilExpression Id
id [Token]
condition [Token]
statements
readDoGroup :: Id -> ParsecT String UserState (SCBase m) [Token]
readDoGroup kwId :: Id
kwId = do
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Done
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
kwId Severity
ErrorC 1057 "Did you forget the 'do' for this loop?")
Token
doKw <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Do ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
`orFail` do
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1058 "Expected 'do'."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "Expected 'do'"
ParsecT String UserState (SCBase m) Token
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t (m :: * -> *) u a.
(Stream s m t, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi Severity
ErrorC 1059 "No semicolons directly after 'do'."
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Done
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId (Token -> Id
getId Token
doKw) Severity
ErrorC 1060 "Can't have empty do clauses (use 'true' as a no-op).")
[Token]
commands <- ParsecT String UserState (SCBase m) [Token]
readCompoundList
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Done ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
`orFail` do
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId (Token -> Id
getId Token
doKw) Severity
ErrorC 1061 "Couldn't find 'done' for this 'do'."
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1062 "Expected 'done' matching previously mentioned 'do'."
String -> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a. Monad m => a -> m a
return "Expected 'done'"
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token]
commands
prop_readForClause :: Bool
prop_readForClause = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for f in *; do rm \"$f\"; done"
prop_readForClause3 :: Bool
prop_readForClause3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for f; do foo; done"
prop_readForClause4 :: Bool
prop_readForClause4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for((i=0; i<10; i++)); do echo $i; done"
prop_readForClause5 :: Bool
prop_readForClause5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for ((i=0;i<10 && n>x;i++,--n))\ndo \necho $i\ndone"
prop_readForClause6 :: Bool
prop_readForClause6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for ((;;))\ndo echo $i\ndone"
prop_readForClause7 :: Bool
prop_readForClause7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for ((;;)) do echo $i\ndone"
prop_readForClause8 :: Bool
prop_readForClause8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for ((;;)) ; do echo $i\ndone"
prop_readForClause9 :: Bool
prop_readForClause9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for i do true; done"
prop_readForClause10 :: Bool
prop_readForClause10= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for ((;;)) { true; }"
prop_readForClause12 :: Bool
prop_readForClause12= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for $a in *; do echo \"$a\"; done"
prop_readForClause13 :: Bool
prop_readForClause13= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readForClause "for foo\nin\\\n bar\\\n baz\ndo true; done"
readForClause :: ParsecT String UserState (SCBase m) Token
readForClause = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "for loop" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(T_For id :: Id
id) <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_For
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Id -> ParsecT String UserState (SCBase m) Token
readArithmetic Id
id ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Id -> ParsecT String UserState (SCBase m) Token
readRegular Id
id
where
readArithmetic :: Id -> ParsecT String UserState (SCBase m) Token
readArithmetic id :: Id
id = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "arithmetic for condition" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "(("
Token
x <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token
y <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token
z <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "))"
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readSequentialSep ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
[Token]
group <- ParsecT String UserState (SCBase m) [Token]
readBraced ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Id -> ParsecT String UserState (SCBase m) [Token]
readDoGroup Id
id
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase 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]
group
readBraced :: ParsecT String UserState (SCBase m) [Token]
readBraced = do
(T_BraceGroup _ list :: [Token]
list) <- ParsecT String UserState (SCBase m) Token
readBraceGroup
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token]
list
readRegular :: Id -> ParsecT String UserState (SCBase m) Token
readRegular id :: Id
id = do
ParsecT String UserState (SCBase m) Char
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t (m :: * -> *) u a.
(Stream s m t, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn (Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '$') Severity
ErrorC 1086
"Don't use $ on the iterator name in for loops."
String
name <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
[Token]
values <- ParsecT String UserState (SCBase m) [Token]
readInClause ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readSequentialSep ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [])
[Token]
group <- Id -> ParsecT String UserState (SCBase m) [Token]
readDoGroup Id
id
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> [Token] -> Token
T_ForIn Id
id String
name [Token]
values [Token]
group
prop_readSelectClause1 :: Bool
prop_readSelectClause1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSelectClause "select foo in *; do echo $foo; done"
prop_readSelectClause2 :: Bool
prop_readSelectClause2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readSelectClause "select foo; do echo $foo; done"
readSelectClause :: ParsecT String UserState (SCBase m) Token
readSelectClause = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "select loop" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
(T_Select id :: Id
id) <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Select
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Id -> [Token] -> ParsecT String UserState (SCBase m) Token
typ <- ParsecT
String
UserState
(SCBase m)
(Id -> [Token] -> ParsecT String UserState (SCBase m) Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Id -> [Token] -> m Token)
readRegular
[Token]
group <- Id -> ParsecT String UserState (SCBase m) [Token]
readDoGroup Id
id
Id -> [Token] -> ParsecT String UserState (SCBase m) Token
typ Id
id [Token]
group
where
readRegular :: ParsecT String UserState (SCBase m) (Id -> [Token] -> m Token)
readRegular = do
String
name <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
[Token]
values <- ParsecT String UserState (SCBase m) [Token]
readInClause ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readSequentialSep ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [])
(Id -> [Token] -> m Token)
-> ParsecT String UserState (SCBase m) (Id -> [Token] -> m Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Id -> [Token] -> m Token)
-> ParsecT String UserState (SCBase m) (Id -> [Token] -> m Token))
-> (Id -> [Token] -> m Token)
-> ParsecT String UserState (SCBase m) (Id -> [Token] -> m Token)
forall a b. (a -> b) -> a -> b
$ \id :: Id
id group :: [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 -> String -> [Token] -> [Token] -> Token
T_SelectIn Id
id String
name [Token]
values [Token]
group)
readInClause :: ParsecT String UserState (SCBase m) [Token]
readInClause = do
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_In
[Token]
things <- ParsecT String UserState (SCBase m) Token
readCmdWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill`
(ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Do)
do {
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Do;
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s UserState m ()
parseNote Severity
ErrorC 1063 "You need a line feed or semicolon before the 'do'.";
} ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do {
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m Token
g_Semi;
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing;
}
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token]
things
prop_readCaseClause :: Bool
prop_readCaseClause = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCaseClause "case foo in a ) lol; cow;; b|d) fooo; esac"
prop_readCaseClause2 :: Bool
prop_readCaseClause2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCaseClause "case foo\n in * ) echo bar;; esac"
prop_readCaseClause3 :: Bool
prop_readCaseClause3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCaseClause "case foo\n in * ) echo bar & ;; esac"
prop_readCaseClause4 :: Bool
prop_readCaseClause4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCaseClause "case foo\n in *) echo bar ;& bar) foo; esac"
prop_readCaseClause5 :: Bool
prop_readCaseClause5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCaseClause "case foo\n in *) echo bar;;& foo) baz;; esac"
readCaseClause :: ParsecT String UserState (SCBase m) Token
readCaseClause = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "case expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Case
Token
word <- ParsecT String UserState (SCBase m) Token
readNormalWord
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_In ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected 'in'"
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak
[(CaseType, [Token], [Token])]
list <- ParsecT String UserState (SCBase m) [(CaseType, [Token], [Token])]
readCaseList
ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Esac ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected 'esac' to close the case statement"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> [(CaseType, [Token], [Token])] -> Token
T_CaseExpression Id
id Token
word [(CaseType, [Token], [Token])]
list
readCaseList :: ParsecT String UserState (SCBase m) [(CaseType, [Token], [Token])]
readCaseList = ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
-> ParsecT
String UserState (SCBase m) [(CaseType, [Token], [Token])]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
readCaseItem
readCaseItem :: ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
readCaseItem = String
-> ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
-> ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "case item" (ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
-> ParsecT
String UserState (SCBase m) (CaseType, [Token], [Token]))
-> ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
-> ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Esac
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m String
readAnnotationPrefix
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1124 "ShellCheck directives are only valid in front of complete commands like 'case' statements, not individual case branches."
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Lparen
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
[Token]
pattern' <- ParsecT String UserState (SCBase m) [Token]
readPattern
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Rparen ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1085
"Did you forget to move the ;; after extending this case item?"
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected ) to open a new case item"
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak
[Token]
list <- (ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) CaseType
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) CaseType
readCaseSeparator ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return []) ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) [Token]
readCompoundList
CaseType
separator <- ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) CaseType
readCaseSeparator ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) CaseType
forall s u (m :: * -> *) a a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
`attempting` do
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Rparen
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1074
"Did you forget the ;; after the previous case item?"
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak
(CaseType, [Token], [Token])
-> ParsecT String UserState (SCBase m) (CaseType, [Token], [Token])
forall (m :: * -> *) a. Monad m => a -> m a
return (CaseType
separator, [Token]
pattern', [Token]
list)
readCaseSeparator :: ParsecT String UserState (SCBase m) CaseType
readCaseSeparator = [ParsecT String UserState (SCBase m) CaseType]
-> ParsecT String UserState (SCBase m) CaseType
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
String -> (Id -> ()) -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ";;&" (() -> Id -> ()
forall a b. a -> b -> a
const ()) ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CaseType -> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a. Monad m => a -> m a
return CaseType
CaseContinue,
String -> (Id -> ()) -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ";&" (() -> Id -> ()
forall a b. a -> b -> a
const ()) ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CaseType -> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a. Monad m => a -> m a
return CaseType
CaseFallThrough,
ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DSEMI ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CaseType -> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a. Monad m => a -> m a
return CaseType
CaseBreak,
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readLineBreak ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Esac) ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) CaseType
-> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CaseType -> ParsecT String UserState (SCBase m) CaseType
forall (m :: * -> *) a. Monad m => a -> m a
return CaseType
CaseBreak
]
prop_readFunctionDefinition :: Bool
prop_readFunctionDefinition = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "foo() { command foo --lol \"$@\"; }"
prop_readFunctionDefinition1 :: Bool
prop_readFunctionDefinition1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "foo (){ command foo --lol \"$@\"; }"
prop_readFunctionDefinition4 :: Bool
prop_readFunctionDefinition4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "foo(a, b) { true; }"
prop_readFunctionDefinition5 :: Bool
prop_readFunctionDefinition5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition ":(){ :|:;}"
prop_readFunctionDefinition6 :: Bool
prop_readFunctionDefinition6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "?(){ foo; }"
prop_readFunctionDefinition7 :: Bool
prop_readFunctionDefinition7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "..(){ cd ..; }"
prop_readFunctionDefinition8 :: Bool
prop_readFunctionDefinition8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "foo() (ls)"
prop_readFunctionDefinition9 :: Bool
prop_readFunctionDefinition9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "function foo { true; }"
prop_readFunctionDefinition10 :: Bool
prop_readFunctionDefinition10= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "function foo () { true; }"
prop_readFunctionDefinition11 :: Bool
prop_readFunctionDefinition11= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "function foo{\ntrue\n}"
prop_readFunctionDefinition12 :: Bool
prop_readFunctionDefinition12= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "function []!() { true; }"
prop_readFunctionDefinition13 :: Bool
prop_readFunctionDefinition13= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readFunctionDefinition "@require(){ true; }"
readFunctionDefinition :: ParsecT String UserState (SCBase m) Token
readFunctionDefinition = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "function" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Id -> Token -> Token
functionSignature <- ParsecT String UserState (SCBase m) (Id -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Id -> Token -> Token)
readFunctionSignature
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "{(") ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1064 "Expected a { to open the function definition."
Token
group <- ParsecT String UserState (SCBase m) Token
readBraceGroup ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readSubshell
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
functionSignature Id
id Token
group
where
readFunctionSignature :: ParsecT String UserState (SCBase m) (Id -> Token -> Token)
readFunctionSignature =
ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) (Id -> Token -> Token)
readWithFunction ParsecT String UserState (SCBase m) (Id -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Id -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m (Id -> Token -> Token)
readWithoutFunction
where
readWithFunction :: ParsecT String UserState (SCBase m) (Id -> Token -> Token)
readWithFunction = do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ do
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "function"
ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
String
name <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
extendedFunctionChars
String
spaces <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Bool
hasParens <- ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Bool
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m Bool
wasIncluded ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, Stream s m Char,
MonadState SystemState m) =>
ParsecT s UserState m ()
readParens
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
hasParens Bool -> Bool -> Bool
&& String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
spaces) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
ParsecT String UserState (SCBase m) Char
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t (m :: * -> *) u a.
(Stream s m t, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m a
-> Severity -> Integer -> String -> ParsecT s u m ()
acceptButWarn (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "{("))
Severity
ErrorC 1095 "You need a space or linefeed between the function name and body."
(Id -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Id -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Id -> Token -> Token))
-> (Id -> Token -> Token)
-> ParsecT String UserState (SCBase m) (Id -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ \id :: Id
id -> Id
-> FunctionKeyword
-> FunctionParentheses
-> String
-> Token
-> Token
T_Function Id
id (Bool -> FunctionKeyword
FunctionKeyword Bool
True) (Bool -> FunctionParentheses
FunctionParentheses Bool
hasParens) String
name
readWithoutFunction :: ParsecT s UserState m (Id -> Token -> Token)
readWithoutFunction = ParsecT s UserState m (Id -> Token -> Token)
-> ParsecT s UserState m (Id -> Token -> Token)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m (Id -> Token -> Token)
-> ParsecT s UserState m (Id -> Token -> Token))
-> ParsecT s UserState m (Id -> Token -> Token)
-> ParsecT s UserState m (Id -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ do
String
name <- ParsecT s UserState m Char -> ParsecT s UserState m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s UserState m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
functionChars
Bool -> ParsecT s UserState m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> ParsecT s UserState m ())
-> Bool -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ String
name String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= "time"
ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, Stream s m Char,
MonadState SystemState m) =>
ParsecT s UserState m ()
readParens
(Id -> Token -> Token)
-> ParsecT s UserState m (Id -> Token -> Token)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Id -> Token -> Token)
-> ParsecT s UserState m (Id -> Token -> Token))
-> (Id -> Token -> Token)
-> ParsecT s UserState m (Id -> Token -> Token)
forall a b. (a -> b) -> a -> b
$ \id :: Id
id -> Id
-> FunctionKeyword
-> FunctionParentheses
-> String
-> Token
-> Token
T_Function Id
id (Bool -> FunctionKeyword
FunctionKeyword Bool
False) (Bool -> FunctionParentheses
FunctionParentheses Bool
True) String
name
readParens :: ParsecT s UserState m ()
readParens = do
ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Lparen
ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Rparen ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1065 "Trying to declare parameters? Don't. Use () and refer to params as $1, $2.."
ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s UserState m Char -> ParsecT s UserState m String)
-> ParsecT s UserState m Char -> ParsecT s UserState m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\n){"
ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Rparen
() -> ParsecT s UserState m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
prop_readCoProc1 :: Bool
prop_readCoProc1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCoProc "coproc foo { echo bar; }"
prop_readCoProc2 :: Bool
prop_readCoProc2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCoProc "coproc { echo bar; }"
prop_readCoProc3 :: Bool
prop_readCoProc3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCoProc "coproc echo bar"
readCoProc :: ParsecT String UserState (SCBase m) Token
readCoProc = String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "coproc" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ do
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "coproc"
ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace
[ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ IncompleteInterval -> ParsecT String UserState (SCBase m) Token
readCompoundCoProc IncompleteInterval
start, IncompleteInterval -> ParsecT String UserState (SCBase m) Token
readSimpleCoProc IncompleteInterval
start ]
where
readCompoundCoProc :: IncompleteInterval -> ParsecT String UserState (SCBase m) Token
readCompoundCoProc start :: IncompleteInterval
start = do
Maybe String
var <- ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) (Maybe String)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) (Maybe String))
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) (Maybe String)
forall a b. (a -> b) -> a -> b
$
ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
whitespace
Token
body <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m Token -> ParsecT s UserState m Token
readBody ParsecT String UserState (SCBase m) Token
readCompoundCommand
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Maybe String -> Token -> Token
T_CoProc Id
id Maybe String
var Token
body
readSimpleCoProc :: IncompleteInterval -> ParsecT String UserState (SCBase m) Token
readSimpleCoProc start :: IncompleteInterval
start = do
Token
body <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Monad m =>
ParsecT s UserState m Token -> ParsecT s UserState m Token
readBody ParsecT String UserState (SCBase m) Token
readSimpleCommand
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Maybe String -> Token -> Token
T_CoProc Id
id Maybe String
forall a. Maybe a
Nothing Token
body
readBody :: ParsecT s UserState m Token -> ParsecT s UserState m Token
readBody parser :: ParsecT s UserState m Token
parser = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Token
body <- ParsecT s UserState m Token
parser
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> Token
T_CoProcBody Id
id Token
body
readPattern :: ParsecT String UserState (SCBase m) [Token]
readPattern = (ParsecT String UserState (SCBase m) Token
readNormalWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing) ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy1` (Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '|' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing)
prop_readCompoundCommand :: Bool
prop_readCompoundCommand = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCompoundCommand "{ echo foo; }>/dev/null"
readCompoundCommand :: ParsecT String UserState (SCBase m) Token
readCompoundCommand = do
Token
cmd <- [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
readBraceGroup,
String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> (SourcePos -> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) p.
Monad m =>
String
-> SCParser m p
-> SCParser m p
-> (SourcePos -> SCParser m ())
-> SCParser m p
readAmbiguous "((" ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticExpression ParsecT String UserState (SCBase m) Token
readSubshell (\pos :: SourcePos
pos ->
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
WarningC 1105 "Shells disambiguate (( differently or not at all. For subshell, add spaces around ( . For ((, fix parsing errors."),
ParsecT String UserState (SCBase m) Token
readSubshell,
ParsecT String UserState (SCBase m) Token
readCondition,
ParsecT String UserState (SCBase m) Token
readWhileClause,
ParsecT String UserState (SCBase m) Token
readUntilClause,
ParsecT String UserState (SCBase m) Token
readIfClause,
ParsecT String UserState (SCBase m) Token
readForClause,
ParsecT String UserState (SCBase m) Token
readSelectClause,
ParsecT String UserState (SCBase m) Token
readCaseClause,
ParsecT String UserState (SCBase m) Token
readBatsTest,
ParsecT String UserState (SCBase m) Token
readFunctionDefinition
]
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
[Token]
redirs <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
readIoRedirect
Id
id <- [Token] -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *).
Monad m =>
[Token] -> ParsecT String UserState (SCBase m) Id
getNextIdSpanningTokenList (Token
cmdToken -> [Token] -> [Token]
forall a. a -> [a] -> [a]
:[Token]
redirs)
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([Token] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Token]
redirs) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
needsSeparator)
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
WarningC 1013 "Bash requires ; or \\n here, after redirecting nested compound commands."
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token -> Token
T_Redirecting Id
id [Token]
redirs Token
cmd
where
needsSeparator :: ParsecT String UserState (SCBase m) Token
needsSeparator = [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Then, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Else, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Elif, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Fi, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Do, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Done, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Esac, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
ParsecT s UserState m Token
g_Rbrace ]
readCompoundList :: ParsecT String UserState (SCBase m) [Token]
readCompoundList = ParsecT String UserState (SCBase m) [Token]
readTerm
readCompoundListOrEmpty :: ParsecT String UserState (SCBase m) [Token]
readCompoundListOrEmpty = do
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
ParsecT String UserState (SCBase m) [Token]
readTerm ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return []
readCmdPrefix :: ParsecT String UserState (SCBase m) [Token]
readCmdPrefix = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Token
readIoRedirect ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readAssignmentWord)
readCmdSuffix :: ParsecT String UserState (SCBase m) [Token]
readCmdSuffix = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Token
readIoRedirect ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readCmdWord)
readModifierSuffix :: ParsecT String UserState (SCBase m) [Token]
readModifierSuffix = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Token
readIoRedirect ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readWellFormedAssignment ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readCmdWord)
readTimeSuffix :: ParsecT String UserState (SCBase m) [Token]
readTimeSuffix = do
[Token]
flags <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
readFlag
Token
pipeline <- ParsecT String UserState (SCBase m) Token
readPipeline
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Token] -> ParsecT String UserState (SCBase m) [Token])
-> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ [Token]
flags [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Token
pipeline]
where
readFlag :: ParsecT String UserState (SCBase m) Token
readFlag = do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-'
ParsecT String UserState (SCBase m) Token
readCmdWord
readLetSuffix :: Monad m => SCParser m [Token]
readLetSuffix :: SCParser m [Token]
readLetSuffix = ParsecT String UserState (SCBase m) Token -> SCParser m [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIoRedirect ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readLetExpression ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCmdWord)
where
readLetExpression :: Monad m => SCParser m Token
readLetExpression :: SCParser m Token
readLetExpression = do
SourcePos
startPos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
expression <- SCParser m Token -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) s u a.
(Stream s m Char, MonadState s m) =>
ParsecT s u m a -> ParsecT s u m String
readStringForParser SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readCmdWord
let (unQuoted :: String
unQuoted, newPos :: SourcePos
newPos) = String -> SourcePos -> (String, SourcePos)
kludgeAwayQuotes String
expression SourcePos
startPos
SourcePos -> SCParser m Token -> String -> SCParser m Token
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse SourcePos
newPos SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents String
unQuoted
kludgeAwayQuotes :: String -> SourcePos -> (String, SourcePos)
kludgeAwayQuotes :: String -> SourcePos -> (String, SourcePos)
kludgeAwayQuotes s :: String
s p :: SourcePos
p =
case String
s of
first :: Char
first:rest :: String
rest@(_:_) ->
let (last :: Char
last:backwards :: String
backwards) = String -> String
forall a. [a] -> [a]
reverse String
rest
middle :: String
middle = String -> String
forall a. [a] -> [a]
reverse String
backwards
in
if Char
first Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` "'\"" Bool -> Bool -> Bool
&& Char
first Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
last
then (String
middle, SourcePos -> Char -> SourcePos
updatePosChar SourcePos
p Char
first)
else (String
s, SourcePos
p)
x :: String
x -> (String
s, SourcePos
p)
readEvalSuffix :: ParsecT String UserState (SCBase m) [Token]
readEvalSuffix = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String UserState (SCBase m) Token
readIoRedirect ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readCmdWord ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *) u b.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m b
evalFallback)
where
evalFallback :: ParsecT s u m b
evalFallback = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
WarningC 1098 "Quote/escape special characters when using eval, e.g. eval \"a=(b)\"."
String -> ParsecT s u m b
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Unexpected parentheses. Make sure to quote when eval'ing as shell parsers differ."
readStringForParser :: ParsecT s u m a -> ParsecT s u m String
readStringForParser parser :: ParsecT s u m a
parser = do
SourcePos
pos <- ParsecT s u m SourcePos -> ParsecT s u m SourcePos
forall s (m :: * -> *) s u b.
MonadState s m =>
ParsecT s u m b -> ParsecT s u m b
inSeparateContext (ParsecT s u m SourcePos -> ParsecT s u m SourcePos)
-> ParsecT s u m SourcePos -> ParsecT s u m SourcePos
forall a b. (a -> b) -> a -> b
$ ParsecT s u m SourcePos -> ParsecT s u m SourcePos
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m a
parser ParsecT s u m a
-> ParsecT s u m SourcePos -> ParsecT s u m SourcePos
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition)
SourcePos -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
SourcePos -> ParsecT s u m String
readUntil SourcePos
pos
where
readUntil :: SourcePos -> ParsecT s u m String
readUntil endPos :: SourcePos
endPos = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT s u m Char -> ParsecT s u m () -> ParsecT s u m String
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill` (ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition ParsecT s u m SourcePos
-> (SourcePos -> ParsecT s u m ()) -> ParsecT s u m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Bool -> ParsecT s u m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> ParsecT s u m ())
-> (SourcePos -> Bool) -> SourcePos -> ParsecT s u m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SourcePos -> SourcePos -> Bool
forall a. Eq a => a -> a -> Bool
== SourcePos
endPos))
readLiteralForParser :: ParsecT s UserState m a -> ParsecT s UserState m Token
readLiteralForParser parser :: ParsecT s UserState m a
parser = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- ParsecT s UserState m a -> ParsecT s UserState m String
forall s (m :: * -> *) s u a.
(Stream s m Char, MonadState s m) =>
ParsecT s u m a -> ParsecT s u m String
readStringForParser ParsecT s UserState m a
parser
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
prop_readAssignmentWord :: Bool
prop_readAssignmentWord = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "a=42"
prop_readAssignmentWord2 :: Bool
prop_readAssignmentWord2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "b=(1 2 3)"
prop_readAssignmentWord3 :: Bool
prop_readAssignmentWord3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "$b = 13"
prop_readAssignmentWord4 :: Bool
prop_readAssignmentWord4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "b = $(lol)"
prop_readAssignmentWord5 :: Bool
prop_readAssignmentWord5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "b+=lol"
prop_readAssignmentWord6 :: Bool
prop_readAssignmentWord6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "b += (1 2 3)"
prop_readAssignmentWord7 :: Bool
prop_readAssignmentWord7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "a[3$n'']=42"
prop_readAssignmentWord8 :: Bool
prop_readAssignmentWord8 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "a[4''$(cat foo)]=42"
prop_readAssignmentWord9 :: Bool
prop_readAssignmentWord9 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "IFS= "
prop_readAssignmentWord9a :: Bool
prop_readAssignmentWord9a= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "foo="
prop_readAssignmentWord9b :: Bool
prop_readAssignmentWord9b= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "foo= "
prop_readAssignmentWord9c :: Bool
prop_readAssignmentWord9c= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "foo= #bar"
prop_readAssignmentWord10 :: Bool
prop_readAssignmentWord10= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "foo$n=42"
prop_readAssignmentWord11 :: Bool
prop_readAssignmentWord11= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "foo=([a]=b [c] [d]= [e f )"
prop_readAssignmentWord12 :: Bool
prop_readAssignmentWord12= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "a[b <<= 3 + c]='thing'"
prop_readAssignmentWord13 :: Bool
prop_readAssignmentWord13= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "var=( (1 2) (3 4) )"
prop_readAssignmentWord14 :: Bool
prop_readAssignmentWord14= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "var=( 1 [2]=(3 4) )"
prop_readAssignmentWord15 :: Bool
prop_readAssignmentWord15= ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readAssignmentWord "var=(1 [2]=(3 4))"
readAssignmentWord :: ParsecT String UserState (SCBase m) Token
readAssignmentWord = Bool -> ParsecT String UserState (SCBase m) Token
readAssignmentWordExt Bool
True
readWellFormedAssignment :: ParsecT String UserState (SCBase m) Token
readWellFormedAssignment = Bool -> ParsecT String UserState (SCBase m) Token
readAssignmentWordExt Bool
False
readAssignmentWordExt :: Bool -> ParsecT String UserState (SCBase m) Token
readAssignmentWordExt lenient :: Bool
lenient = ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
lenient (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '$' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s UserState m ()
parseNote Severity
ErrorC 1066 "Don't use $ on the left side of assignments.")
String
variable <- ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readVariableName
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
lenient (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) Token
readNormalDollar ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
ErrorC
1067 "For indirection, use arrays, declare \"var$n=value\", or (for sh) read/eval.")
[Token]
indices <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Token
readArrayIndex
Bool
hasLeftSpace <- (String -> Bool)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
AssignmentMode
op <- ParsecT String UserState (SCBase m) AssignmentMode
forall s (m :: * -> *) (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m,
MonadReader (Environment m) m) =>
ParsecT s u m AssignmentMode
readAssignmentOp
Bool
hasRightSpace <- (String -> Bool)
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Bool
isEndOfCommand <- (Maybe () -> Bool)
-> ParsecT String UserState (SCBase m) (Maybe ())
-> ParsecT String UserState (SCBase m) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe () -> Bool
forall a. Maybe a -> Bool
isJust (ParsecT String UserState (SCBase m) (Maybe ())
-> ParsecT String UserState (SCBase m) Bool)
-> ParsecT String UserState (SCBase m) (Maybe ())
-> ParsecT String UserState (SCBase m) Bool
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) (Maybe ())
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "\r\n;&|)") ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof))
if Bool -> Bool
not Bool
hasLeftSpace Bool -> Bool -> Bool
&& (Bool
hasRightSpace Bool -> Bool -> Bool
|| Bool
isEndOfCommand)
then do
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
variable String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= "IFS" Bool -> Bool -> Bool
&& Bool
hasRightSpace Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
isEndOfCommand) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
WarningC 1007
"Remove space after = if trying to assign a value (for empty string, use var='' ... )."
Token
value <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s. Monad m => ParsecT s UserState m Token
readEmptyLiteral
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> AssignmentMode -> String -> [Token] -> Token -> Token
T_Assignment Id
id AssignmentMode
op String
variable [Token]
indices Token
value
else do
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
hasLeftSpace Bool -> Bool -> Bool
|| Bool
hasRightSpace) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
parseNoteAt SourcePos
pos Severity
ErrorC 1068 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
"Don't put spaces around the "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ (if AssignmentMode
op AssignmentMode -> AssignmentMode -> Bool
forall a. Eq a => a -> a -> Bool
== AssignmentMode
Append
then "+= when appending"
else "= in assignments")
String -> String -> String
forall a. [a] -> [a] -> [a]
++ " (or quote to make it literal)."
Token
value <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArray ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
readNormalWord
ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> AssignmentMode -> String -> [Token] -> Token -> Token
T_Assignment Id
id AssignmentMode
op String
variable [Token]
indices Token
value
where
readAssignmentOp :: ParsecT s u m AssignmentMode
readAssignmentOp = do
SourcePos
pos <- ParsecT s u m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String -> ParsecT s u m String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
String -> ParsecT s u m a -> ParsecT s u m ()
unexpecting "" (ParsecT s u m String -> ParsecT s u m ())
-> ParsecT s u m String -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "==="
[ParsecT s u m AssignmentMode] -> ParsecT s u m AssignmentMode
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "+=" ParsecT s u m String
-> ParsecT s u m AssignmentMode -> ParsecT s u m AssignmentMode
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> AssignmentMode -> ParsecT s u m AssignmentMode
forall (m :: * -> *) a. Monad m => a -> m a
return AssignmentMode
Append,
do
ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "==")
SourcePos -> Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1097
"Unexpected ==. For assignment, use =. For comparison, use [/[[."
AssignmentMode -> ParsecT s u m AssignmentMode
forall (m :: * -> *) a. Monad m => a -> m a
return AssignmentMode
Assign,
String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "=" ParsecT s u m String
-> ParsecT s u m AssignmentMode -> ParsecT s u m AssignmentMode
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> AssignmentMode -> ParsecT s u m AssignmentMode
forall (m :: * -> *) a. Monad m => a -> m a
return AssignmentMode
Assign
]
readEmptyLiteral :: ParsecT s UserState m Token
readEmptyLiteral = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id ""
readArrayIndex :: ParsecT String UserState (SCBase m) Token
readArrayIndex = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '['
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
String
str <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) s u a.
(Stream s m Char, MonadState s m) =>
ParsecT s u m a -> ParsecT s u m String
readStringForParser ParsecT String UserState (SCBase m) Token
readIndexSpan
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ']'
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> SourcePos -> String -> Token
T_UnparsedIndex Id
id SourcePos
pos String
str
readArray :: Monad m => SCParser m Token
readArray :: SCParser m Token
readArray = String -> SCParser m Token -> SCParser m Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "array assignment" (SCParser m Token -> SCParser m Token)
-> SCParser m Token -> SCParser m Token
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
opening <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
opening Severity
ErrorC 1116 "Missing $ on a $((..)) expression? (or use ( ( for arrays)."
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
[Token]
words <- SCParser m Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readElement SCParser m Token
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a a.
(Stream s m t, Show t) =>
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m [a]
`reluctantlyTill` Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')' ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "Expected ) to close array assignment"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> SCParser m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> SCParser m Token) -> Token -> SCParser m Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Array Id
id [Token]
words
where
readElement :: ParsecT String UserState (SCBase m) Token
readElement = (ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIndexed ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readRegular) ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
readIndexed :: ParsecT String UserState (SCBase m) Token
readIndexed = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Token]
index <- ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token])
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall a b. (a -> b) -> a -> b
$ do
[Token]
x <- ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArrayIndex
Char -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '='
[Token] -> ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *) a. Monad m => a -> m a
return [Token]
x
Token
value <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readRegular ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s. Monad m => ParsecT s UserState m Token
nothing
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token -> Token
T_IndexedElement Id
id [Token]
index Token
value
readRegular :: ParsecT String UserState (SCBase m) Token
readRegular = ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArray ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readNormalWord
nothing :: ParsecT s UserState m Token
nothing = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id ""
tryToken :: String -> (Id -> a) -> ParsecT s UserState m a
tryToken s :: String
s t :: Id -> a
t = ParsecT s UserState m a -> ParsecT s UserState m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m a -> ParsecT s UserState m a)
-> ParsecT s UserState m a -> ParsecT s UserState m a
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String -> ParsecT s UserState m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
s
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
a -> ParsecT s UserState m a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> ParsecT s UserState m a) -> a -> ParsecT s UserState m a
forall a b. (a -> b) -> a -> b
$ Id -> a
t Id
id
redirToken :: Char -> (Id -> a) -> ParsecT s UserState m a
redirToken c :: Char
c t :: Id -> a
t = ParsecT s UserState m a -> ParsecT s UserState m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s UserState m a -> ParsecT s UserState m a)
-> ParsecT s UserState m a -> ParsecT s UserState m a
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT s UserState m Char -> ParsecT s UserState m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 (ParsecT s UserState m Char -> ParsecT s UserState m ())
-> ParsecT s UserState m Char -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
a -> ParsecT s UserState m a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> ParsecT s UserState m a) -> a -> ParsecT s UserState m a
forall a b. (a -> b) -> a -> b
$ Id -> a
t Id
id
tryWordToken :: String -> (Id -> b) -> ParsecT String UserState (SCBase m) b
tryWordToken s :: String
s t :: Id -> b
t = String -> (Id -> b) -> ParsecT String UserState (SCBase m) b
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryParseWordToken String
s Id -> b
t ParsecT String UserState (SCBase m) b
-> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) b
forall s (m :: * -> *) t u b a.
Stream s m t =>
ParsecT s u m b -> ParsecT s u m a -> ParsecT s u m b
`thenSkip` ParsecT String UserState (SCBase m) String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing
tryParseWordToken :: String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryParseWordToken keyword :: String
keyword t :: Id -> a
t = ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) a)
-> ParsecT String UserState (SCBase m) a
-> ParsecT String UserState (SCBase m) a
forall a b. (a -> b) -> a -> b
$ do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String
str <- String -> ParsecT String UserState (SCBase m) String
forall (t :: * -> *) s (m :: * -> *) u.
(Traversable t, Stream s m Char) =>
t Char -> ParsecT s u m (t Char)
anycaseString String
keyword
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
Char
c <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) Char
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
let warning :: Integer -> ParsecT s u m ()
warning code :: Integer
code = Severity -> Integer -> String -> ParsecT s u m ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC Integer
code (String -> ParsecT s u m ()) -> String -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ "You need a space before the " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
c] String -> String -> String
forall a. [a] -> [a] -> [a]
++ "."
case Char
c of
'[' -> Integer -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> ParsecT s u m ()
warning 1069
'#' -> Integer -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> ParsecT s u m ()
warning 1099
'!' -> Integer -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> ParsecT s u m ()
warning 1129
':' -> Integer -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Integer -> ParsecT s u m ()
warning 1130
_ -> () -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
keywordSeparator
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String
str String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
keyword) (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1081 (String -> ParsecT String UserState (SCBase m) ())
-> String -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
"Scripts are case sensitive. Use '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
keyword String -> String -> String
forall a. [a] -> [a] -> [a]
++ "', not '" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str String -> String -> String
forall a. [a] -> [a] -> [a]
++ "'."
a -> ParsecT String UserState (SCBase m) a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> ParsecT String UserState (SCBase m) a)
-> a -> ParsecT String UserState (SCBase m) a
forall a b. (a -> b) -> a -> b
$ Id -> a
t Id
id
anycaseString :: t Char -> ParsecT s u m (t Char)
anycaseString =
(Char -> ParsecT s u m Char) -> t Char -> ParsecT s u m (t Char)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
anycaseChar
where
anycaseChar :: Char -> ParsecT s u m Char
anycaseChar c :: Char
c = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char (Char -> Char
toLower Char
c) ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char (Char -> Char
toUpper Char
c)
g_AND_IF :: ParsecT s UserState m Token
g_AND_IF = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "&&" Id -> Token
T_AND_IF
g_OR_IF :: ParsecT s UserState m Token
g_OR_IF = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "||" Id -> Token
T_OR_IF
g_DSEMI :: ParsecT s UserState m Token
g_DSEMI = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ";;" Id -> Token
T_DSEMI
g_DLESS :: ParsecT s UserState m Token
g_DLESS = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "<<" Id -> Token
T_DLESS
g_DGREAT :: ParsecT s UserState m Token
g_DGREAT = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ">>" Id -> Token
T_DGREAT
g_LESSAND :: ParsecT s UserState m Token
g_LESSAND = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "<&" Id -> Token
T_LESSAND
g_GREATAND :: ParsecT s UserState m Token
g_GREATAND = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ">&" Id -> Token
T_GREATAND
g_LESSGREAT :: ParsecT s UserState m Token
g_LESSGREAT = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "<>" Id -> Token
T_LESSGREAT
g_DLESSDASH :: ParsecT s UserState m Token
g_DLESSDASH = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "<<-" Id -> Token
T_DLESSDASH
g_CLOBBER :: ParsecT s UserState m Token
g_CLOBBER = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ">|" Id -> Token
T_CLOBBER
g_OPERATOR :: ParsecT s UserState m Token
g_OPERATOR = ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_AND_IF ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_OR_IF ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DSEMI ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DLESSDASH ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DLESS ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DGREAT ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_LESSAND ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_GREATAND ParsecT s UserState m Token
-> ParsecT s UserState m Token -> ParsecT s UserState m Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_LESSGREAT
g_If :: ParsecT String UserState (SCBase m) Token
g_If = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "if" Id -> Token
T_If
g_Then :: ParsecT String UserState (SCBase m) Token
g_Then = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "then" Id -> Token
T_Then
g_Else :: ParsecT String UserState (SCBase m) Token
g_Else = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "else" Id -> Token
T_Else
g_Elif :: ParsecT String UserState (SCBase m) Token
g_Elif = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "elif" Id -> Token
T_Elif
g_Fi :: ParsecT String UserState (SCBase m) Token
g_Fi = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "fi" Id -> Token
T_Fi
g_Do :: ParsecT String UserState (SCBase m) Token
g_Do = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "do" Id -> Token
T_Do
g_Done :: ParsecT String UserState (SCBase m) Token
g_Done = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "done" Id -> Token
T_Done
g_Case :: ParsecT String UserState (SCBase m) Token
g_Case = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "case" Id -> Token
T_Case
g_Esac :: ParsecT String UserState (SCBase m) Token
g_Esac = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "esac" Id -> Token
T_Esac
g_While :: ParsecT String UserState (SCBase m) Token
g_While = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "while" Id -> Token
T_While
g_Until :: ParsecT String UserState (SCBase m) Token
g_Until = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "until" Id -> Token
T_Until
g_For :: ParsecT String UserState (SCBase m) Token
g_For = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "for" Id -> Token
T_For
g_Select :: ParsecT String UserState (SCBase m) Token
g_Select = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "select" Id -> Token
T_Select
g_In :: ParsecT String UserState (SCBase m) Token
g_In = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "in" Id -> Token
T_In ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
skipAnnotationAndWarn
g_Lbrace :: ParsecT String UserState (SCBase m) Token
g_Lbrace = String
-> (Id -> Token) -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a.
Monad m =>
String -> (Id -> a) -> ParsecT String UserState (SCBase m) a
tryWordToken "{" Id -> Token
T_Lbrace
g_Rbrace :: ParsecT s UserState m Token
g_Rbrace = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token
T_Rbrace Id
id
g_Lparen :: ParsecT s UserState m Token
g_Lparen = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken "(" Id -> Token
T_Lparen
g_Rparen :: ParsecT s UserState m Token
g_Rparen = String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ")" Id -> Token
T_Rparen
g_Bang :: ParsecT s UserState m Token
g_Bang = do
IncompleteInterval
start <- ParsecT s UserState m IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '!'
Id
id <- IncompleteInterval -> ParsecT s UserState m Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT s UserState m String -> ParsecT s UserState m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT s UserState m String
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m String
spacing1 ParsecT s UserState m ()
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do
SourcePos
pos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1035
"You are missing a required space after the !."
Token -> ParsecT s UserState m Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT s UserState m Token)
-> Token -> ParsecT s UserState m Token
forall a b. (a -> b) -> a -> b
$ Id -> Token
T_Bang Id
id
g_Semi :: ParsecT s UserState m Token
g_Semi = do
ParsecT s UserState m Token -> ParsecT s UserState m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 ParsecT s UserState m Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DSEMI
String -> (Id -> Token) -> ParsecT s UserState m Token
forall (m :: * -> *) s (m :: * -> *) a.
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
String -> (Id -> a) -> ParsecT s UserState m a
tryToken ";" Id -> Token
T_Semi
keywordSeparator :: ParsecT String UserState (SCBase m) ()
keywordSeparator =
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacingOrFail) ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf ";()[<>&|")
readKeyword :: ParsecT String UserState (SCBase m) Token
readKeyword = [ParsecT String UserState (SCBase m) Token]
-> ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Then, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Else, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Elif, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Fi, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Do, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Done, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
g_Esac, ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s.
Stream s m Char =>
ParsecT s UserState m Token
g_Rbrace, ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Rparen, ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_DSEMI ]
ifParse :: ParsecT s u m a
-> ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
ifParse p :: ParsecT s u m a
p t :: ParsecT s u m a
t f :: ParsecT s u m a
f =
(ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m a
p) ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m a
t) ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m a
f
prop_readShebang1 :: Bool
prop_readShebang1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang "#!/bin/sh\n"
prop_readShebang2 :: Bool
prop_readShebang2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang "!# /bin/sh\n"
prop_readShebang3 :: Bool
prop_readShebang3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang "#shellcheck shell=/bin/sh\n"
prop_readShebang4 :: Bool
prop_readShebang4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang "! /bin/sh"
prop_readShebang5 :: Bool
prop_readShebang5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang "\n#!/bin/sh"
prop_readShebang6 :: Bool
prop_readShebang6 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang " # Copyright \n!#/bin/bash"
prop_readShebang7 :: Bool
prop_readShebang7 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang "# Copyright \nfoo\n#!/bin/bash"
readShebang :: ParsecT String UserState (SCBase m) Token
readShebang = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
anyShebang ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
readMissingBang ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
withHeader
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
String
str <- ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String)
-> ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\r\n"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) Char
forall (m :: * -> *) (m :: * -> *) s.
(MonadState SystemState m, MonadReader (Environment m) m,
Stream s m Char) =>
ParsecT s UserState m Char
carriageReturn
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> Token
T_Literal Id
id String
str
where
anyShebang :: ParsecT String UserState (SCBase m) ()
anyShebang = [ParsecT String UserState (SCBase m) ()]
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ([ParsecT String UserState (SCBase m) ()]
-> ParsecT String UserState (SCBase m) ())
-> [ParsecT String UserState (SCBase m) ()]
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> [ParsecT String UserState (SCBase m) ()]
-> [ParsecT String UserState (SCBase m) ()]
forall a b. (a -> b) -> [a] -> [b]
map ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try [
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
readCorrect,
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
readSwapped,
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
readTooManySpaces,
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s.
(MonadReader (Environment m) m, MonadState SystemState m,
Stream s m Char) =>
ParsecT s UserState m ()
readMissingHash
]
readCorrect :: ParsecT s u m ()
readCorrect = ParsecT s u m String -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT s u m String -> ParsecT s u m ())
-> ParsecT s u m String -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "#!"
readSwapped :: ParsecT String UserState (SCBase m) ()
readSwapped = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
String -> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "!#"
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Id
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
Id -> Severity -> Integer -> String -> SCParser m ()
parseProblemAtId Id
id Severity
ErrorC 1084
"Use #!, not !#, for the shebang."
skipSpaces :: ParsecT s UserState m Bool
skipSpaces = (String -> Bool)
-> ParsecT s UserState m String -> ParsecT s UserState m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) (ParsecT s UserState m String -> ParsecT s UserState m Bool)
-> ParsecT s UserState m String -> ParsecT s UserState m Bool
forall a b. (a -> b) -> a -> b
$ ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
readTooManySpaces :: ParsecT s UserState m ()
readTooManySpaces = do
SourcePos
startPos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Bool
startSpaces <- ParsecT s UserState m Bool
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Bool
skipSpaces
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '#'
SourcePos
middlePos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Bool
middleSpaces <- ParsecT s UserState m Bool
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Bool
skipSpaces
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '!'
Bool -> ParsecT s UserState m () -> ParsecT s UserState m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
startSpaces (ParsecT s UserState m () -> ParsecT s UserState m ())
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
startPos Severity
ErrorC 1114
"Remove leading spaces before the shebang."
Bool -> ParsecT s UserState m () -> ParsecT s UserState m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
middleSpaces (ParsecT s UserState m () -> ParsecT s UserState m ())
-> ParsecT s UserState m () -> ParsecT s UserState m ()
forall a b. (a -> b) -> a -> b
$
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
middlePos Severity
ErrorC 1115
"Remove spaces between # and ! in the shebang."
readMissingHash :: ParsecT s UserState m ()
readMissingHash = do
SourcePos
pos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '!'
ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
ensurePathAhead
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1104
"Use #!, not just !, for the shebang."
readMissingBang :: ParsecT s UserState m ()
readMissingBang = do
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '#'
SourcePos
pos <- ParsecT s UserState m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
ensurePathAhead
SourcePos
-> Severity -> Integer -> String -> ParsecT s UserState m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1113
"Use #!, not just #, for the shebang."
ensurePathAhead :: ParsecT s UserState m Char
ensurePathAhead = ParsecT s UserState m Char -> ParsecT s UserState m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (ParsecT s UserState m Char -> ParsecT s UserState m Char)
-> ParsecT s UserState m Char -> ParsecT s UserState m Char
forall a b. (a -> b) -> a -> b
$ do
ParsecT s UserState m Char -> ParsecT s UserState m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s UserState m Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
Char -> ParsecT s UserState m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '/'
withHeader :: ParsecT String UserState (SCBase m) ()
withHeader = ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
headerLine
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
anyShebang ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<*
SourcePos
-> Severity
-> Integer
-> String
-> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1128 "The shebang must be on the first line. Delete blanks and move comments."
headerLine :: ParsecT String UserState (SCBase m) Char
headerLine = do
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
notFollowedBy2 ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
anyShebang
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Char
linewhitespace
ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readAnyComment
ParsecT String UserState (SCBase m) Char
forall (m :: * -> *). Monad m => SCParser m Char
linefeed
verifyEof :: ParsecT String UserState (SCBase m) ()
verifyEof = ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> [ParsecT String UserState (SCBase m) ()]
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a b.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
ifParsable ParsecT String UserState (SCBase m) Token
forall s (m :: * -> *) (m :: * -> *).
(Stream s m Char, MonadReader (Environment m) m,
MonadState SystemState m) =>
ParsecT s UserState m Token
g_Lparen (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1088 "Parsing stopped here. Invalid use of parentheses?",
ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a b.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
ifParsable ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readKeyword (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1089 "Parsing stopped here. Is this keyword correctly matched up?",
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1070 "Parsing stopped here. Mismatched keywords or invalid parentheses?"
]
where
ifParsable :: ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
ifParsable p :: ParsecT s u m a
p action :: ParsecT s u m b
action = do
ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT s u m a
p)
ParsecT s u m b
action
readConfigFile :: Monad m => FilePath -> SCParser m [Annotation]
readConfigFile :: String -> SCParser m [Annotation]
readConfigFile filename :: String
filename = do
Bool
shouldIgnore <- (Environment m -> Bool) -> ParsecT String UserState (SCBase m) Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> Bool
forall (m :: * -> *). Environment m -> Bool
ignoreRC
if Bool
shouldIgnore then [Annotation] -> SCParser m [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return [] else String -> SCParser m [Annotation]
forall (m :: * -> *) s u.
Monad m =>
String
-> ParsecT
s u (ReaderT (Environment m) (StateT SystemState m)) [Annotation]
read' String
filename
where
read' :: String
-> ParsecT
s u (ReaderT (Environment m) (StateT SystemState m)) [Annotation]
read' filename :: String
filename = do
SystemInterface m
sys <- (Environment m -> SystemInterface m)
-> ParsecT
s
u
(ReaderT (Environment m) (StateT SystemState m))
(SystemInterface m)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> SystemInterface m
forall (m :: * -> *). Environment m -> SystemInterface m
systemInterface
Maybe (String, String)
contents <- m (Maybe (String, String))
-> ParsecT
s
u
(ReaderT (Environment m) (StateT SystemState m))
(Maybe (String, String))
forall (t :: (* -> *) -> * -> *) (t :: (* -> *) -> * -> *)
(t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, MonadTrans t, MonadTrans t, Monad m,
Monad (t (t m)), Monad (t m)) =>
m a -> t (t (t m)) a
system (m (Maybe (String, String))
-> ParsecT
s
u
(ReaderT (Environment m) (StateT SystemState m))
(Maybe (String, String)))
-> m (Maybe (String, String))
-> ParsecT
s
u
(ReaderT (Environment m) (StateT SystemState m))
(Maybe (String, String))
forall a b. (a -> b) -> a -> b
$ SystemInterface m -> String -> m (Maybe (String, String))
forall (m :: * -> *).
SystemInterface m -> String -> m (Maybe (String, String))
siGetConfig SystemInterface m
sys String
filename
case Maybe (String, String)
contents of
Nothing -> [Annotation]
-> ParsecT
s u (ReaderT (Environment m) (StateT SystemState m)) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return []
Just (file :: String
file, str :: String
str) -> String
-> String
-> ParsecT
s u (ReaderT (Environment m) (StateT SystemState m)) [Annotation]
forall (m :: * -> *) s u.
Monad m =>
String -> String -> ParsecT s u (SCBase m) [Annotation]
readConfig String
file String
str
readConfig :: String -> String -> ParsecT s u (SCBase m) [Annotation]
readConfig filename :: String
filename contents :: String
contents = do
Either ParseError [Annotation]
result <- SCBase m (Either ParseError [Annotation])
-> ParsecT s u (SCBase m) (Either ParseError [Annotation])
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (SCBase m (Either ParseError [Annotation])
-> ParsecT s u (SCBase m) (Either ParseError [Annotation]))
-> SCBase m (Either ParseError [Annotation])
-> ParsecT s u (SCBase m) (Either ParseError [Annotation])
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) [Annotation]
-> UserState
-> String
-> String
-> SCBase m (Either ParseError [Annotation])
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> u -> String -> s -> m (Either ParseError a)
runParserT ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs UserState
initialUserState String
filename String
contents
case Either ParseError [Annotation]
result of
Right result :: [Annotation]
result ->
[Annotation] -> ParsecT s u (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return [Annotation]
result
Left err :: ParseError
err -> do
Severity -> Integer -> String -> ParsecT s u (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1134 (String -> ParsecT s u (SCBase m) ())
-> String -> ParsecT s u (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ String -> ParseError -> String
errorFor String
filename ParseError
err
[Annotation] -> ParsecT s u (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return []
errorFor :: String -> ParseError -> String
errorFor filename :: String
filename err :: ParseError
err =
let line :: String
line = "line " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> (SourcePos -> Int) -> SourcePos -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourcePos -> Int
sourceLine (SourcePos -> String) -> SourcePos -> String
forall a b. (a -> b) -> a -> b
$ ParseError -> SourcePos
errorPos ParseError
err)
suggestion :: String
suggestion = [Message] -> String
getStringFromParsec ([Message] -> String) -> [Message] -> String
forall a b. (a -> b) -> a -> b
$ ParseError -> [Message]
errorMessages ParseError
err
in
"Failed to process " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
filename String -> String -> String
forall a. [a] -> [a] -> [a]
++ ", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
line String -> String -> String
forall a. [a] -> [a] -> [a]
++ ": "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
suggestion
prop_readConfigKVs1 :: Bool
prop_readConfigKVs1 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs "disable=1234"
prop_readConfigKVs2 :: Bool
prop_readConfigKVs2 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs "# Comment\ndisable=1234 # Comment\n"
prop_readConfigKVs3 :: Bool
prop_readConfigKVs3 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs ""
prop_readConfigKVs4 :: Bool
prop_readConfigKVs4 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs "\n\n\n\n\t \n"
prop_readConfigKVs5 :: Bool
prop_readConfigKVs5 = ParsecT String UserState (SCBase Identity) [Annotation]
-> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs "# shellcheck accepts annotation-like comments in rc files\ndisable=1234"
readConfigKVs :: ParsecT String UserState (SCBase m) [Annotation]
readConfigKVs = do
ParsecT String UserState (SCBase m) [()]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [()]
anySpacingOrComment
[[Annotation]]
annotations <- ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [[Annotation]]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotationWithoutPrefix ParsecT String UserState (SCBase m) [Annotation]
-> ParsecT String UserState (SCBase m) [()]
-> ParsecT String UserState (SCBase m) [Annotation]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String UserState (SCBase m) [()]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [()]
anySpacingOrComment)
ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
[Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Annotation] -> ParsecT String UserState (SCBase m) [Annotation])
-> [Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall a b. (a -> b) -> a -> b
$ [[Annotation]] -> [Annotation]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Annotation]]
annotations
=
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) [()]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacingOrFail ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) String
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
readAnyComment)
prop_readScript1 :: Bool
prop_readScript1 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "#!/bin/bash\necho hello world\n"
prop_readScript2 :: Bool
prop_readScript2 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "#!/bin/bash\r\necho hello world\n"
prop_readScript3 :: Bool
prop_readScript3 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "#!/bin/bash\necho hello\xA0world"
prop_readScript4 :: Bool
prop_readScript4 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "#!/usr/bin/perl\nfoo=("
prop_readScript5 :: Bool
prop_readScript5 = ParsecT String UserState (SCBase Identity) Token -> String -> Bool
forall a.
ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk ParsecT String UserState (SCBase Identity) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript "#!/bin/bash\n#This is an empty script\n\n"
readScriptFile :: Bool -> ParsecT String UserState (SCBase m) Token
readScriptFile sourced :: Bool
sourced = do
IncompleteInterval
start <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ do
ParsecT String UserState (SCBase m) String
forall s (m :: * -> *) u.
(Stream s m Char, MonadState SystemState m) =>
ParsecT s u m String
readUtf8Bom
Severity
-> Integer -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *) s u.
(MonadState SystemState m, MonadReader (Environment m) m) =>
Severity -> Integer -> String -> ParsecT s u m ()
parseProblem Severity
ErrorC 1082
"This file has a UTF-8 BOM. Remove it with: LC_CTYPE=C sed '1s/^...//' < yourscript ."
Token
shebang <- ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readShebang ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s. Monad m => ParsecT s UserState m Token
readEmptyLiteral
let (T_Literal _ shebangString :: String
shebangString) = Token
shebang
ParsecT String UserState (SCBase m) String
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) String
allspacing
IncompleteInterval
annotationStart <- ParsecT String UserState (SCBase m) IncompleteInterval
forall (m :: * -> *) s u.
Monad m =>
ParsecT s u m IncompleteInterval
startSpan
[Annotation]
fileAnnotations <- ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Annotation]
readAnnotations
[Annotation]
rcAnnotations <- if Bool
sourced
then [Annotation] -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *) a. Monad m => a -> m a
return []
else do
String
filename <- (Environment m -> String)
-> ParsecT String UserState (SCBase m) String
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> String
forall (m :: * -> *). Environment m -> String
currentFilename
String -> ParsecT String UserState (SCBase m) [Annotation]
forall (m :: * -> *). Monad m => String -> SCParser m [Annotation]
readConfigFile String
filename
let annotations :: [Annotation]
annotations = [Annotation]
fileAnnotations [Annotation] -> [Annotation] -> [Annotation]
forall a. [a] -> [a] -> [a]
++ [Annotation]
rcAnnotations
Id
annotationId <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
annotationStart
let shellAnnotationSpecified :: Bool
shellAnnotationSpecified =
(Annotation -> Bool) -> [Annotation] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\x :: Annotation
x -> case Annotation
x of ShellOverride {} -> Bool
True; _ -> Bool
False) [Annotation]
annotations
Bool
shellFlagSpecified <- Maybe Shell -> Bool
forall a. Maybe a -> Bool
isJust (Maybe Shell -> Bool)
-> ParsecT String UserState (SCBase m) (Maybe Shell)
-> ParsecT String UserState (SCBase m) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Environment m -> Maybe Shell)
-> ParsecT String UserState (SCBase m) (Maybe Shell)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Mr.asks Environment m -> Maybe Shell
forall (m :: * -> *). Environment m -> Maybe Shell
shellTypeOverride
let ignoreShebang :: Bool
ignoreShebang = Bool
shellAnnotationSpecified Bool -> Bool -> Bool
|| Bool
shellFlagSpecified
Bool
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
ignoreShebang (ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ())
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$
SourcePos -> String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) (m :: * -> *).
(MonadReader (Environment m) m, MonadState SystemState m) =>
SourcePos -> String -> m ()
verifyShebang SourcePos
pos (String -> String
getShell String
shebangString)
if Bool
ignoreShebang Bool -> Bool -> Bool
|| String -> Maybe Bool
isValidShell (String -> String
getShell String
shebangString) Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False
then do
[Token]
commands <- [Annotation]
-> ParsecT String UserState (SCBase m) [Token]
-> ParsecT String UserState (SCBase m) [Token]
forall s (m :: * -> *) t u b.
(Stream s m t, MonadState SystemState m) =>
[Annotation] -> ParsecT s u m b -> ParsecT s u m b
withAnnotations [Annotation]
annotations ParsecT String UserState (SCBase m) [Token]
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) [Token]
readCompoundListOrEmpty
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
ParsecT String UserState (SCBase m) ()
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) ()
verifyEof
let script :: Token
script = Id -> [Annotation] -> Token -> Token
T_Annotation Id
annotationId [Annotation]
annotations (Token -> Token) -> Token -> Token
forall a b. (a -> b) -> a -> b
$
Id -> Token -> [Token] -> Token
T_Script Id
id Token
shebang [Token]
commands
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *). Monad m => Token -> SCParser m Token
reparseIndices Token
script
else do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
Id
id <- IncompleteInterval -> ParsecT String UserState (SCBase m) Id
forall (m :: * -> *) s.
Monad m =>
IncompleteInterval -> ParsecT s UserState m Id
endSpan IncompleteInterval
start
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> Token -> [Token] -> Token
T_Script Id
id Token
shebang []
where
basename :: String -> String
basename s :: String
s = String -> String
forall a. [a] -> [a]
reverse (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '/') (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
s
getShell :: String -> String
getShell sb :: String
sb =
case String -> [String]
words String
sb of
[] -> ""
[x :: String
x] -> String -> String
basename String
x
(first :: String
first:second :: String
second:_) ->
if String -> String
basename String
first String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "env"
then String
second
else String -> String
basename String
first
verifyShebang :: SourcePos -> String -> m ()
verifyShebang pos :: SourcePos
pos s :: String
s = do
case String -> Maybe Bool
isValidShell String
s of
Just True -> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just False -> SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1071 "ShellCheck only supports sh/bash/dash/ksh scripts. Sorry!"
Nothing -> SourcePos -> Severity -> Integer -> String -> m ()
forall (m :: * -> *) (m :: * -> *).
(MonadState SystemState m, MonadReader (Environment m) m) =>
SourcePos -> Severity -> Integer -> String -> m ()
parseProblemAt SourcePos
pos Severity
ErrorC 1008 "This shebang was unrecognized. ShellCheck only supports sh/bash/dash/ksh. Add a 'shell' directive to specify."
isValidShell :: String -> Maybe Bool
isValidShell s :: String
s =
let good :: Bool
good = String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== "" Bool -> Bool -> Bool
|| (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
s) [String]
goodShells
bad :: Bool
bad = (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
s) [String]
badShells
in
if Bool
good
then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
else if Bool
bad
then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False
else Maybe Bool
forall a. Maybe a
Nothing
goodShells :: [String]
goodShells = [
"sh",
"ash",
"dash",
"bash",
"bats",
"ksh"
]
badShells :: [String]
badShells = [
"awk",
"csh",
"expect",
"perl",
"python",
"ruby",
"tcsh",
"zsh"
]
readUtf8Bom :: ParsecT s u m String
readUtf8Bom = String -> ParsecT s u m String -> ParsecT s u m String
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "Byte Order Mark" (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "\xFEFF"
readScript :: ParsecT String UserState (SCBase m) Token
readScript = Bool -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
Bool -> ParsecT String UserState (SCBase m) Token
readScriptFile Bool
False
debugParse :: SCParser Identity v -> String -> Either ParseError v
debugParse p :: SCParser Identity v
p string :: String
string = Identity (Either ParseError v) -> Either ParseError v
forall a. Identity a -> a
runIdentity (Identity (Either ParseError v) -> Either ParseError v)
-> Identity (Either ParseError v) -> Either ParseError v
forall a b. (a -> b) -> a -> b
$ do
(res :: Either ParseError v
res, _) <- Environment Identity
-> SCParser Identity v
-> String
-> String
-> Identity (Either ParseError v, SystemState)
forall (m :: * -> *) v.
Monad m =>
Environment m
-> SCParser m v
-> String
-> String
-> m (Either ParseError v, SystemState)
runParser Environment Identity
testEnvironment SCParser Identity v
p "-" String
string
Either ParseError v -> Identity (Either ParseError v)
forall (m :: * -> *) a. Monad m => a -> m a
return Either ParseError v
res
debugParseScript :: String -> ParseResult
debugParseScript string :: String
string =
ParseResult
result {
prTokenPositions :: Map Id (Position, Position)
prTokenPositions = [(Id, (Position, Position))] -> Map Id (Position, Position)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [
(Int -> Id
Id 0, (Position
newPosition {
posFile :: String
posFile = "removed for clarity",
posLine :: Integer
posLine = -1,
posColumn :: Integer
posColumn = -1
}, Position
newPosition {
posFile :: String
posFile = "removed for clarity",
posLine :: Integer
posLine = -1,
posColumn :: Integer
posColumn = -1
}))]
}
where
result :: ParseResult
result = Identity ParseResult -> ParseResult
forall a. Identity a -> a
runIdentity (Identity ParseResult -> ParseResult)
-> Identity ParseResult -> ParseResult
forall a b. (a -> b) -> a -> b
$
SystemInterface Identity -> ParseSpec -> Identity ParseResult
forall (m :: * -> *).
Monad m =>
SystemInterface m -> ParseSpec -> m ParseResult
parseScript ([(String, String)] -> SystemInterface Identity
mockedSystemInterface []) (ParseSpec -> Identity ParseResult)
-> ParseSpec -> Identity ParseResult
forall a b. (a -> b) -> a -> b
$ ParseSpec
newParseSpec {
psFilename :: String
psFilename = "debug",
psScript :: String
psScript = String
string
}
testEnvironment :: Environment Identity
testEnvironment =
Environment :: forall (m :: * -> *).
SystemInterface m
-> Bool -> Bool -> String -> Maybe Shell -> Environment m
Environment {
systemInterface :: SystemInterface Identity
systemInterface = ([(String, String)] -> SystemInterface Identity
mockedSystemInterface []),
checkSourced :: Bool
checkSourced = Bool
False,
currentFilename :: String
currentFilename = "myscript",
ignoreRC :: Bool
ignoreRC = Bool
False,
shellTypeOverride :: Maybe Shell
shellTypeOverride = Maybe Shell
forall a. Maybe a
Nothing
}
isOk :: ParsecT String UserState (SCBase Identity) a -> String -> Bool
isOk p :: ParsecT String UserState (SCBase Identity) a
p s :: String
s = ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
forall a.
ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
parsesCleanly ParsecT String UserState (SCBase Identity) a
p String
s Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
isWarning :: ParsecT String UserState (SCBase Identity) a -> String -> Bool
isWarning p :: ParsecT String UserState (SCBase Identity) a
p s :: String
s = ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
forall a.
ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
parsesCleanly ParsecT String UserState (SCBase Identity) a
p String
s Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False
isNotOk :: ParsecT String UserState (SCBase Identity) a -> String -> Bool
isNotOk p :: ParsecT String UserState (SCBase Identity) a
p s :: String
s = ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
forall a.
ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
parsesCleanly ParsecT String UserState (SCBase Identity) a
p String
s Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Bool
forall a. Maybe a
Nothing
parsesCleanly :: ParsecT String UserState (SCBase Identity) a
-> String -> Maybe Bool
parsesCleanly parser :: ParsecT String UserState (SCBase Identity) a
parser string :: String
string = Identity (Maybe Bool) -> Maybe Bool
forall a. Identity a -> a
runIdentity (Identity (Maybe Bool) -> Maybe Bool)
-> Identity (Maybe Bool) -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ do
(res :: Either ParseError UserState
res, sys :: SystemState
sys) <- Environment Identity
-> SCParser Identity UserState
-> String
-> String
-> Identity (Either ParseError UserState, SystemState)
forall (m :: * -> *) v.
Monad m =>
Environment m
-> SCParser m v
-> String
-> String
-> m (Either ParseError v, SystemState)
runParser Environment Identity
testEnvironment
(ParsecT String UserState (SCBase Identity) a
parser ParsecT String UserState (SCBase Identity) a
-> ParsecT String UserState (SCBase Identity) ()
-> ParsecT String UserState (SCBase Identity) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase Identity) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT String UserState (SCBase Identity) ()
-> SCParser Identity UserState -> SCParser Identity UserState
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SCParser Identity UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState) "-" String
string
case (Either ParseError UserState
res, SystemState
sys) of
(Right userState :: UserState
userState, systemState :: SystemState
systemState) ->
Maybe Bool -> Identity (Maybe Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Bool -> Identity (Maybe Bool))
-> Maybe Bool -> Identity (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ Bool -> Maybe Bool
forall a. a -> Maybe a
Just (Bool -> Maybe Bool)
-> ([ParseNote] -> Bool) -> [ParseNote] -> Maybe Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ParseNote] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([ParseNote] -> Maybe Bool) -> [ParseNote] -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ UserState -> [ParseNote]
parseNotes UserState
userState [ParseNote] -> [ParseNote] -> [ParseNote]
forall a. [a] -> [a] -> [a]
++ SystemState -> [ParseNote]
parseProblems SystemState
systemState
(Left _, _) -> Maybe Bool -> Identity (Maybe Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Bool
forall a. Maybe a
Nothing
dump :: Show a => a -> a
dump :: a -> a
dump x :: a
x = String -> a -> a
forall a. String -> a -> a
trace (a -> String
forall a. Show a => a -> String
show a
x) a
x
dumps :: Show x => x -> a -> a
dumps :: x -> a -> a
dumps t :: x
t = String -> a -> a
forall a. String -> a -> a
trace (x -> String
forall a. Show a => a -> String
show x
t)
parseWithNotes :: ParsecT s b m a -> ParsecT s b m (a, b)
parseWithNotes parser :: ParsecT s b m a
parser = do
a
item <- ParsecT s b m a
parser
b
state <- ParsecT s b m b
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
(a, b) -> ParsecT s b m (a, b)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
item, b
state)
compareNotes :: ParseNote -> ParseNote -> Ordering
compareNotes (ParseNote pos1 :: SourcePos
pos1 pos1' :: SourcePos
pos1' level1 :: Severity
level1 _ s1 :: String
s1) (ParseNote pos2 :: SourcePos
pos2 pos2' :: SourcePos
pos2' level2 :: Severity
level2 _ s2 :: String
s2) = (SourcePos, SourcePos, Severity)
-> (SourcePos, SourcePos, Severity) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (SourcePos
pos1, SourcePos
pos1', Severity
level1) (SourcePos
pos2, SourcePos
pos2', Severity
level2)
sortNotes :: [ParseNote] -> [ParseNote]
sortNotes = (ParseNote -> ParseNote -> Ordering) -> [ParseNote] -> [ParseNote]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy ParseNote -> ParseNote -> Ordering
compareNotes
makeErrorFor :: ParseError -> ParseNote
makeErrorFor parsecError :: ParseError
parsecError =
SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
pos SourcePos
pos Severity
ErrorC 1072 (String -> ParseNote) -> String -> ParseNote
forall a b. (a -> b) -> a -> b
$
[Message] -> String
getStringFromParsec ([Message] -> String) -> [Message] -> String
forall a b. (a -> b) -> a -> b
$ ParseError -> [Message]
errorMessages ParseError
parsecError
where
pos :: SourcePos
pos = ParseError -> SourcePos
errorPos ParseError
parsecError
getStringFromParsec :: [Message] -> String
getStringFromParsec errors :: [Message]
errors =
case (Message -> Maybe String) -> [Message] -> [Maybe String]
forall a b. (a -> b) -> [a] -> [b]
map Message -> Maybe String
f [Message]
errors of
r :: [Maybe String]
r -> [String] -> String
unwords (Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take 1 ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [Maybe String] -> [String]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe String] -> [String]) -> [Maybe String] -> [String]
forall a b. (a -> b) -> a -> b
$ [Maybe String] -> [Maybe String]
forall a. [a] -> [a]
reverse [Maybe String]
r) String -> String -> String
forall a. [a] -> [a] -> [a]
++
" Fix any mentioned problems and try again."
where
f :: Message -> Maybe String
f err :: Message
err =
case Message
err of
UnExpect s :: String
s -> Maybe String
forall a. Maybe a
Nothing
SysUnExpect s :: String
s -> Maybe String
forall a. Maybe a
Nothing
Expect s :: String
s -> Maybe String
forall a. Maybe a
Nothing
Message s :: String
s -> if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
s then Maybe String
forall a. Maybe a
Nothing else String -> Maybe String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ "."
runParser :: Monad m =>
Environment m ->
SCParser m v ->
String ->
String ->
m (Either ParseError v, SystemState)
runParser :: Environment m
-> SCParser m v
-> String
-> String
-> m (Either ParseError v, SystemState)
runParser env :: Environment m
env p :: SCParser m v
p filename :: String
filename contents :: String
contents =
StateT SystemState m (Either ParseError v)
-> SystemState -> m (Either ParseError v, SystemState)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
Ms.runStateT
(ReaderT
(Environment m) (StateT SystemState m) (Either ParseError v)
-> Environment m -> StateT SystemState m (Either ParseError v)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
Mr.runReaderT
(SCParser m v
-> UserState
-> String
-> String
-> ReaderT
(Environment m) (StateT SystemState m) (Either ParseError v)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> u -> String -> s -> m (Either ParseError a)
runParserT SCParser m v
p UserState
initialUserState String
filename String
contents)
Environment m
env)
SystemState
initialSystemState
system :: m a -> t (t (t m)) a
system = t (t m) a -> t (t (t m)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (t (t m) a -> t (t (t m)) a)
-> (m a -> t (t m) a) -> m a -> t (t (t m)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m a -> t (t m) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (t m a -> t (t m) a) -> (m a -> t m a) -> m a -> t (t m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
parseShell :: Environment m -> String -> String -> m ParseResult
parseShell env :: Environment m
env name :: String
name contents :: String
contents = do
(result :: Either ParseError (Token, UserState)
result, state :: SystemState
state) <- Environment m
-> SCParser m (Token, UserState)
-> String
-> String
-> m (Either ParseError (Token, UserState), SystemState)
forall (m :: * -> *) v.
Monad m =>
Environment m
-> SCParser m v
-> String
-> String
-> m (Either ParseError v, SystemState)
runParser Environment m
env (ParsecT String UserState (SCBase m) Token
-> SCParser m (Token, UserState)
forall (m :: * -> *) s b a.
Monad m =>
ParsecT s b m a -> ParsecT s b m (a, b)
parseWithNotes ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readScript) String
name String
contents
case Either ParseError (Token, UserState)
result of
Right (script :: Token
script, userstate :: UserState
userstate) ->
ParseResult -> m ParseResult
forall (m :: * -> *) a. Monad m => a -> m a
return ParseResult
newParseResult {
prComments :: [PositionedComment]
prComments = (ParseNote -> PositionedComment)
-> [ParseNote] -> [PositionedComment]
forall a b. (a -> b) -> [a] -> [b]
map ParseNote -> PositionedComment
toPositionedComment ([ParseNote] -> [PositionedComment])
-> [ParseNote] -> [PositionedComment]
forall a b. (a -> b) -> a -> b
$ [ParseNote] -> [ParseNote]
forall a. Eq a => [a] -> [a]
nub ([ParseNote] -> [ParseNote]) -> [ParseNote] -> [ParseNote]
forall a b. (a -> b) -> a -> b
$ UserState -> [ParseNote]
parseNotes UserState
userstate [ParseNote] -> [ParseNote] -> [ParseNote]
forall a. [a] -> [a] -> [a]
++ SystemState -> [ParseNote]
parseProblems SystemState
state,
prTokenPositions :: Map Id (Position, Position)
prTokenPositions = ((SourcePos, SourcePos) -> (Position, Position))
-> Map Id (SourcePos, SourcePos) -> Map Id (Position, Position)
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (SourcePos, SourcePos) -> (Position, Position)
startEndPosToPos (UserState -> Map Id (SourcePos, SourcePos)
positionMap UserState
userstate),
prRoot :: Maybe Token
prRoot = Token -> Maybe Token
forall a. a -> Maybe a
Just (Token -> Maybe Token) -> Token -> Maybe Token
forall a b. (a -> b) -> a -> b
$
Token -> Map Id [Token] -> Token
reattachHereDocs Token
script (UserState -> Map Id [Token]
hereDocMap UserState
userstate)
}
Left err :: ParseError
err ->
ParseResult -> m ParseResult
forall (m :: * -> *) a. Monad m => a -> m a
return ParseResult
newParseResult {
prComments :: [PositionedComment]
prComments =
(ParseNote -> PositionedComment)
-> [ParseNote] -> [PositionedComment]
forall a b. (a -> b) -> [a] -> [b]
map ParseNote -> PositionedComment
toPositionedComment ([ParseNote] -> [PositionedComment])
-> [ParseNote] -> [PositionedComment]
forall a b. (a -> b) -> a -> b
$
[Context] -> [ParseNote]
notesForContext (SystemState -> [Context]
contextStack SystemState
state)
[ParseNote] -> [ParseNote] -> [ParseNote]
forall a. [a] -> [a] -> [a]
++ [ParseError -> ParseNote
makeErrorFor ParseError
err]
[ParseNote] -> [ParseNote] -> [ParseNote]
forall a. [a] -> [a] -> [a]
++ SystemState -> [ParseNote]
parseProblems SystemState
state,
prTokenPositions :: Map Id (Position, Position)
prTokenPositions = Map Id (Position, Position)
forall k a. Map k a
Map.empty,
prRoot :: Maybe Token
prRoot = Maybe Token
forall a. Maybe a
Nothing
}
notesForContext :: [Context] -> [ParseNote]
notesForContext list :: [Context]
list = ((Context -> ParseNote) -> Context -> ParseNote)
-> [Context -> ParseNote] -> [Context] -> [ParseNote]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (Context -> ParseNote) -> Context -> ParseNote
forall a b. (a -> b) -> a -> b
($) [Context -> ParseNote
first, Context -> ParseNote
second] ([Context] -> [ParseNote]) -> [Context] -> [ParseNote]
forall a b. (a -> b) -> a -> b
$ (Context -> Bool) -> [Context] -> [Context]
forall a. (a -> Bool) -> [a] -> [a]
filter Context -> Bool
isName [Context]
list
where
isName :: Context -> Bool
isName (ContextName _ _) = Bool
True
isName _ = Bool
False
first :: Context -> ParseNote
first (ContextName pos :: SourcePos
pos str :: String
str) = SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
pos SourcePos
pos Severity
ErrorC 1073 (String -> ParseNote) -> String -> ParseNote
forall a b. (a -> b) -> a -> b
$
"Couldn't parse this " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str String -> String -> String
forall a. [a] -> [a] -> [a]
++ ". Fix to allow more checks."
second :: Context -> ParseNote
second (ContextName pos :: SourcePos
pos str :: String
str) = SourcePos
-> SourcePos -> Severity -> Integer -> String -> ParseNote
ParseNote SourcePos
pos SourcePos
pos Severity
InfoC 1009 (String -> ParseNote) -> String -> ParseNote
forall a b. (a -> b) -> a -> b
$
"The mentioned syntax error was in this " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str String -> String -> String
forall a. [a] -> [a] -> [a]
++ "."
reparseIndices :: Token -> ParsecT String UserState (SCBase m) Token
reparseIndices root :: Token
root =
(Token -> ParsecT String UserState (SCBase m) ())
-> (Token -> ParsecT String UserState (SCBase m) ())
-> (Token -> ParsecT String UserState (SCBase m) Token)
-> Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
(Token -> m ())
-> (Token -> m ()) -> (Token -> m Token) -> Token -> m Token
analyze Token -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *). Monad m => Token -> m ()
blank Token -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *). Monad m => Token -> m ()
blank Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *). Monad m => Token -> SCParser m Token
f Token
root
where
associative :: [String]
associative = Token -> [String]
getAssociativeArrays Token
root
isAssociative :: String -> Bool
isAssociative s :: String
s = String
s String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
associative
f :: Token -> ParsecT String UserState (SCBase m) Token
f (T_Assignment id :: Id
id mode :: AssignmentMode
mode name :: String
name indices :: [Token]
indices value :: Token
value) = do
[Token]
newIndices <- (Token -> ParsecT String UserState (SCBase m) Token)
-> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (String -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> Token -> ParsecT String UserState (SCBase m) Token
fixAssignmentIndex String
name) [Token]
indices
Token
newValue <- case Token
value of
(T_Array id2 :: Id
id2 words :: [Token]
words) -> do
[Token]
newWords <- (Token -> ParsecT String UserState (SCBase m) Token)
-> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (String -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> Token -> ParsecT String UserState (SCBase m) Token
fixIndexElement String
name) [Token]
words
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token
T_Array Id
id2 [Token]
newWords
x :: Token
x -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
x
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> AssignmentMode -> String -> [Token] -> Token -> Token
T_Assignment Id
id AssignmentMode
mode String
name [Token]
newIndices Token
newValue
f (TA_Variable id :: Id
id name :: String
name indices :: [Token]
indices) = do
[Token]
newIndices <- (Token -> ParsecT String UserState (SCBase m) Token)
-> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (String -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> Token -> ParsecT String UserState (SCBase m) Token
fixAssignmentIndex String
name) [Token]
indices
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> String -> [Token] -> Token
TA_Variable Id
id String
name [Token]
newIndices
f t :: Token
t = Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
fixIndexElement :: String -> Token -> ParsecT String UserState (SCBase m) Token
fixIndexElement name :: String
name word :: Token
word =
case Token
word of
T_IndexedElement id :: Id
id indices :: [Token]
indices value :: Token
value -> do
[Token]
new <- (Token -> ParsecT String UserState (SCBase m) Token)
-> [Token] -> ParsecT String UserState (SCBase m) [Token]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (String -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String -> Token -> ParsecT String UserState (SCBase m) Token
fixAssignmentIndex String
name) [Token]
indices
Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> ParsecT String UserState (SCBase m) Token)
-> Token -> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ Id -> [Token] -> Token -> Token
T_IndexedElement Id
id [Token]
new Token
value
_ -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
word
fixAssignmentIndex :: String -> Token -> ParsecT String UserState (SCBase m) Token
fixAssignmentIndex name :: String
name word :: Token
word =
case Token
word of
T_UnparsedIndex id :: Id
id pos :: SourcePos
pos src :: String
src ->
String
-> SourcePos -> String -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
String
-> SourcePos -> String -> ParsecT String UserState (SCBase m) Token
parsed String
name SourcePos
pos String
src
_ -> Token -> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a. Monad m => a -> m a
return Token
word
parsed :: String
-> SourcePos -> String -> ParsecT String UserState (SCBase m) Token
parsed name :: String
name pos :: SourcePos
pos src :: String
src =
if String -> Bool
isAssociative String
name
then SourcePos
-> ParsecT String UserState (SCBase m) Token
-> String
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse SourcePos
pos (String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "associative array index" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readIndexSpan) String
src
else SourcePos
-> ParsecT String UserState (SCBase m) Token
-> String
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s u b.
Monad m =>
SourcePos -> ParsecT s u m b -> s -> ParsecT s u m b
subParse SourcePos
pos (String
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) s t u b.
(Stream s m t, MonadState SystemState m) =>
String -> ParsecT s u m b -> ParsecT s u m b
called "arithmetic array index expression" (ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token)
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall a b. (a -> b) -> a -> b
$ ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) Token
-> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String UserState (SCBase m) Token
forall (m :: * -> *).
Monad m =>
ParsecT String UserState (SCBase m) Token
readArithmeticContents) String
src
reattachHereDocs :: Token -> Map Id [Token] -> Token
reattachHereDocs root :: Token
root map :: Map Id [Token]
map =
(Token -> Token) -> Token -> Token
doTransform Token -> Token
f Token
root
where
f :: Token -> Token
f t :: Token
t@(T_HereDoc id :: Id
id dash :: Dashed
dash quote :: Quoted
quote string :: String
string []) = Token -> Maybe Token -> Token
forall a. a -> Maybe a -> a
fromMaybe Token
t (Maybe Token -> Token) -> Maybe Token -> Token
forall a b. (a -> b) -> a -> b
$ do
[Token]
list <- Id -> Map Id [Token] -> Maybe [Token]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Id
id Map Id [Token]
map
Token -> Maybe Token
forall (m :: * -> *) a. Monad m => a -> m a
return (Token -> Maybe Token) -> Token -> Maybe Token
forall a b. (a -> b) -> a -> b
$ Id -> Dashed -> Quoted -> String -> [Token] -> Token
T_HereDoc Id
id Dashed
dash Quoted
quote String
string [Token]
list
f t :: Token
t = Token
t
toPositionedComment :: ParseNote -> PositionedComment
(ParseNote start :: SourcePos
start end :: SourcePos
end severity :: Severity
severity code :: Integer
code message :: String
message) =
PositionedComment
newPositionedComment {
pcStartPos :: Position
pcStartPos = (SourcePos -> Position
posToPos SourcePos
start)
, pcEndPos :: Position
pcEndPos = (SourcePos -> Position
posToPos SourcePos
end)
, pcComment :: Comment
pcComment = Comment
newComment {
cSeverity :: Severity
cSeverity = Severity
severity
, cCode :: Integer
cCode = Integer
code
, cMessage :: String
cMessage = String
message
}
}
posToPos :: SourcePos -> Position
posToPos :: SourcePos -> Position
posToPos sp :: SourcePos
sp = Position
newPosition {
posFile :: String
posFile = SourcePos -> String
sourceName SourcePos
sp,
posLine :: Integer
posLine = Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ SourcePos -> Int
sourceLine SourcePos
sp,
posColumn :: Integer
posColumn = Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ SourcePos -> Int
sourceColumn SourcePos
sp
}
startEndPosToPos :: (SourcePos, SourcePos) -> (Position, Position)
startEndPosToPos :: (SourcePos, SourcePos) -> (Position, Position)
startEndPosToPos (s :: SourcePos
s, e :: SourcePos
e) = (SourcePos -> Position
posToPos SourcePos
s, SourcePos -> Position
posToPos SourcePos
e)
parseScript :: Monad m =>
SystemInterface m -> ParseSpec -> m ParseResult
parseScript :: SystemInterface m -> ParseSpec -> m ParseResult
parseScript sys :: SystemInterface m
sys spec :: ParseSpec
spec =
Environment m -> String -> String -> m ParseResult
forall (m :: * -> *).
Monad m =>
Environment m -> String -> String -> m ParseResult
parseShell Environment m
env (ParseSpec -> String
psFilename ParseSpec
spec) (ParseSpec -> String
psScript ParseSpec
spec)
where
env :: Environment m
env = Environment :: forall (m :: * -> *).
SystemInterface m
-> Bool -> Bool -> String -> Maybe Shell -> Environment m
Environment {
systemInterface :: SystemInterface m
systemInterface = SystemInterface m
sys,
checkSourced :: Bool
checkSourced = ParseSpec -> Bool
psCheckSourced ParseSpec
spec,
currentFilename :: String
currentFilename = ParseSpec -> String
psFilename ParseSpec
spec,
ignoreRC :: Bool
ignoreRC = ParseSpec -> Bool
psIgnoreRC ParseSpec
spec,
shellTypeOverride :: Maybe Shell
shellTypeOverride = ParseSpec -> Maybe Shell
psShellTypeOverride ParseSpec
spec
}
tryWithErrors :: Monad m => SCParser m v -> SCParser m v
tryWithErrors :: SCParser m v -> SCParser m v
tryWithErrors parser :: SCParser m v
parser = do
UserState
userstate <- ParsecT String UserState (SCBase m) UserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
[Context]
oldContext <- ParsecT String UserState (SCBase m) [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
String
input <- ParsecT String UserState (SCBase m) String
forall (m :: * -> *) s u. Monad m => ParsecT s u m s
getInput
SourcePos
pos <- ParsecT String UserState (SCBase m) SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Either ParseError (v, SourcePos, String, UserState)
result <- SCBase m (Either ParseError (v, SourcePos, String, UserState))
-> ParsecT
String
UserState
(SCBase m)
(Either ParseError (v, SourcePos, String, UserState))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (SCBase m (Either ParseError (v, SourcePos, String, UserState))
-> ParsecT
String
UserState
(SCBase m)
(Either ParseError (v, SourcePos, String, UserState)))
-> SCBase m (Either ParseError (v, SourcePos, String, UserState))
-> ParsecT
String
UserState
(SCBase m)
(Either ParseError (v, SourcePos, String, UserState))
forall a b. (a -> b) -> a -> b
$ ParsecT
String UserState (SCBase m) (v, SourcePos, String, UserState)
-> UserState
-> String
-> String
-> SCBase m (Either ParseError (v, SourcePos, String, UserState))
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> u -> String -> s -> m (Either ParseError a)
runParserT (SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s u. Monad m => SourcePos -> ParsecT s u m ()
setPosition SourcePos
pos ParsecT String UserState (SCBase m) ()
-> ParsecT
String UserState (SCBase m) (v, SourcePos, String, UserState)
-> ParsecT
String UserState (SCBase m) (v, SourcePos, String, UserState)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SCParser m v
-> ParsecT
String UserState (SCBase m) (v, SourcePos, String, UserState)
forall (m :: * -> *) c d a.
Monad m =>
ParsecT c d m a -> ParsecT c d m (a, SourcePos, c, d)
getResult SCParser m v
parser) UserState
userstate (SourcePos -> String
sourceName SourcePos
pos) String
input
case Either ParseError (v, SourcePos, String, UserState)
result of
Right (result :: v
result, endPos :: SourcePos
endPos, endInput :: String
endInput, endState :: UserState
endState) -> do
ParsecT String UserState (SCBase m) Char
-> ParsecT String UserState (SCBase m) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT String UserState (SCBase m) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
-> ParsecT String UserState (SCBase m) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String UserState (SCBase m) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
UserState -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) u s. Monad m => u -> ParsecT s u m ()
putState UserState
endState
SourcePos -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s u. Monad m => SourcePos -> ParsecT s u m ()
setPosition SourcePos
endPos
String -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *) s u. Monad m => s -> ParsecT s u m ()
setInput String
endInput
v -> SCParser m v
forall (m :: * -> *) a. Monad m => a -> m a
return v
result
Left err :: ParseError
err -> do
[Context]
newContext <- ParsecT String UserState (SCBase m) [Context]
forall (f :: * -> *). MonadState SystemState f => f [Context]
getCurrentContexts
ParseNote -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *). MonadState SystemState m => ParseNote -> m ()
addParseProblem (ParseNote -> ParsecT String UserState (SCBase m) ())
-> ParseNote -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ ParseError -> ParseNote
makeErrorFor ParseError
err
(ParseNote -> ParsecT String UserState (SCBase m) ())
-> [ParseNote] -> ParsecT String UserState (SCBase m) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ParseNote -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *). MonadState SystemState m => ParseNote -> m ()
addParseProblem ([ParseNote] -> ParsecT String UserState (SCBase m) ())
-> [ParseNote] -> ParsecT String UserState (SCBase m) ()
forall a b. (a -> b) -> a -> b
$ [Context] -> [ParseNote]
notesForContext [Context]
newContext
[Context] -> ParsecT String UserState (SCBase m) ()
forall (m :: * -> *). MonadState SystemState m => [Context] -> m ()
setCurrentContexts [Context]
oldContext
String -> SCParser m v
forall (m :: * -> *) a. MonadFail m => String -> m a
fail ""
where
getResult :: ParsecT c d m a -> ParsecT c d m (a, SourcePos, c, d)
getResult p :: ParsecT c d m a
p = do
a
result <- ParsecT c d m a
p
SourcePos
endPos <- ParsecT c d m SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
c
endInput <- ParsecT c d m c
forall (m :: * -> *) s u. Monad m => ParsecT s u m s
getInput
d
endState <- ParsecT c d m d
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
(a, SourcePos, c, d) -> ParsecT c d m (a, SourcePos, c, d)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
result, SourcePos
endPos, c
endInput, d
endState)
return []
runTests :: IO Bool
runTests = Bool
Bool -> Property
[(String, Property)] -> (Property -> IO Result) -> IO Bool
Property -> IO Result
forall prop. Testable prop => prop -> IO Result
forall prop. Testable prop => prop -> Property
runQuickCheckAll :: [(String, Property)] -> (Property -> IO Result) -> IO Bool
property :: forall prop. Testable prop => prop -> Property
quickCheckResult :: forall prop. Testable prop => prop -> IO Result
prop_readScript5 :: Bool
prop_readScript4 :: Bool
prop_readScript3 :: Bool
prop_readScript2 :: Bool
prop_readScript1 :: Bool
prop_readConfigKVs5 :: Bool
prop_readConfigKVs4 :: Bool
prop_readConfigKVs3 :: Bool
prop_readConfigKVs2 :: Bool
prop_readConfigKVs1 :: Bool
prop_readShebang7 :: Bool
prop_readShebang6 :: Bool
prop_readShebang5 :: Bool
prop_readShebang4 :: Bool
prop_readShebang3 :: Bool
prop_readShebang2 :: Bool
prop_readShebang1 :: Bool
prop_readAssignmentWord15 :: Bool
prop_readAssignmentWord14 :: Bool
prop_readAssignmentWord13 :: Bool
prop_readAssignmentWord12 :: Bool
prop_readAssignmentWord11 :: Bool
prop_readAssignmentWord10 :: Bool
prop_readAssignmentWord9c :: Bool
prop_readAssignmentWord9b :: Bool
prop_readAssignmentWord9a :: Bool
prop_readAssignmentWord9 :: Bool
prop_readAssignmentWord8 :: Bool
prop_readAssignmentWord7 :: Bool
prop_readAssignmentWord6 :: Bool
prop_readAssignmentWord5 :: Bool
prop_readAssignmentWord4 :: Bool
prop_readAssignmentWord3 :: Bool
prop_readAssignmentWord2 :: Bool
prop_readAssignmentWord :: Bool
prop_readCompoundCommand :: Bool
prop_readCoProc3 :: Bool
prop_readCoProc2 :: Bool
prop_readCoProc1 :: Bool
prop_readFunctionDefinition13 :: Bool
prop_readFunctionDefinition12 :: Bool
prop_readFunctionDefinition11 :: Bool
prop_readFunctionDefinition10 :: Bool
prop_readFunctionDefinition9 :: Bool
prop_readFunctionDefinition8 :: Bool
prop_readFunctionDefinition7 :: Bool
prop_readFunctionDefinition6 :: Bool
prop_readFunctionDefinition5 :: Bool
prop_readFunctionDefinition4 :: Bool
prop_readFunctionDefinition1 :: Bool
prop_readFunctionDefinition :: Bool
prop_readCaseClause5 :: Bool
prop_readCaseClause4 :: Bool
prop_readCaseClause3 :: Bool
prop_readCaseClause2 :: Bool
prop_readCaseClause :: Bool
prop_readSelectClause2 :: Bool
prop_readSelectClause1 :: Bool
prop_readForClause13 :: Bool
prop_readForClause12 :: Bool
prop_readForClause10 :: Bool
prop_readForClause9 :: Bool
prop_readForClause8 :: Bool
prop_readForClause7 :: Bool
prop_readForClause6 :: Bool
prop_readForClause5 :: Bool
prop_readForClause4 :: Bool
prop_readForClause3 :: Bool
prop_readForClause :: Bool
prop_readUntilClause :: Bool
prop_readWhileClause :: Bool
prop_readBatsTest :: Bool
prop_readBraceGroup3 :: Bool
prop_readBraceGroup2 :: Bool
prop_readBraceGroup :: Bool
prop_readSubshell :: Bool
prop_readIfClause5 :: Bool
prop_readIfClause4 :: Bool
prop_readIfClause3 :: Bool
prop_readIfClause2 :: Bool
prop_readIfClause :: Bool
prop_readTerm :: Bool
prop_readAndOr2 :: Bool
prop_readAndOr1 :: Bool
prop_readAndOr :: Bool
prop_readPipeline3 :: Bool
prop_readPipeline2 :: Bool
prop_readPipeline :: Bool
prop_readSimpleCommand14 :: Bool
prop_readSimpleCommand13 :: Bool
prop_readSimpleCommand12 :: Bool
prop_readSimpleCommand11 :: Bool
prop_readSimpleCommand10 :: Bool
prop_readSimpleCommand9 :: Bool
prop_readSimpleCommand8 :: Bool
prop_readSimpleCommand7 :: Bool
prop_readSimpleCommand6 :: Bool
prop_readSimpleCommand5 :: Bool
prop_readSimpleCommand4 :: Bool
prop_readSimpleCommand3 :: Bool
prop_readSimpleCommand2 :: Bool
prop_readSimpleCommand :: Bool
prop_readSeparator5 :: Bool
prop_readSeparator4 :: Bool
prop_readSeparator3 :: Bool
prop_readSeparator2 :: Bool
prop_readSeparator1 :: Bool
prop_readHereString :: Bool
prop_readIoRedirect7 :: Bool
prop_readIoRedirect6 :: Bool
prop_readIoRedirect5 :: Bool
prop_readIoRedirect4 :: Bool
prop_readIoRedirect3 :: Bool
prop_readIoRedirect2 :: Bool
prop_readIoRedirect :: Bool
prop_readIoFile :: Bool
prop_readHereDoc21 :: Bool
prop_readHereDoc20 :: Bool
prop_readHereDoc17 :: Bool
prop_readHereDoc16 :: Bool
prop_readHereDoc15 :: Bool
prop_readHereDoc14 :: Bool
prop_readHereDoc13 :: Bool
prop_readHereDoc12 :: Bool
prop_readHereDoc11 :: Bool
prop_readHereDoc10 :: Bool
prop_readHereDoc9 :: Bool
prop_readHereDoc8 :: Bool
prop_readHereDoc7 :: Bool
prop_readHereDoc6 :: Bool
prop_readHereDoc5 :: Bool
prop_readHereDoc4 :: Bool
prop_readHereDoc3 :: Bool
prop_readHereDoc2 :: Bool
prop_readHereDoc :: Bool
prop_readDollarLonely5 :: Bool
prop_readDollarLonely4 :: Bool
prop_readDollarLonely3 :: Bool
prop_readDollarLonely2 :: Bool
prop_readDollarLonely1 :: Bool
prop_readDollarVariable5 :: Bool
prop_readDollarVariable4 :: Bool
prop_readDollarVariable3 :: Bool
prop_readDollarVariable2 :: Bool
prop_readDollarVariable :: Bool
prop_readDollarExpansion3 :: Bool
prop_readDollarExpansion2 :: Bool
prop_readDollarExpansion1 :: Bool
prop_readDollarBraced4 :: Bool
prop_readDollarBraced3 :: Bool
prop_readDollarBraced2 :: Bool
prop_readDollarBraced1 :: Bool
prop_readDollarBraceCommandExpansion2 :: Bool
prop_readDollarBraceCommandExpansion1 :: Bool
prop_readArithmeticExpression :: Bool
prop_readDollarArithmetic2 :: Bool
prop_readDollarArithmetic :: Bool
prop_readDollarDoubleQuote :: Bool
prop_readDollarSingleQuote :: Bool
prop_readDollarExpression3 :: Bool
prop_readDollarExpression2 :: Bool
prop_readDollarExpression1 :: Bool
prop_readBraced8 :: Bool
prop_readBraced7 :: Bool
prop_readBraced6 :: Bool
prop_readBraced5 :: Bool
prop_readBraced4 :: Bool
prop_readBraced3 :: Bool
prop_readBraced2 :: Bool
prop_readBraced :: Bool
prop_readExtglob8 :: Bool
prop_readExtglob7 :: Bool
prop_readExtglob6 :: Bool
prop_readExtglob5 :: Bool
prop_readExtglob4 :: Bool
prop_readExtglob2 :: Bool
prop_readExtglob1 :: Bool
prop_readGlob8 :: Bool
prop_readGlob7 :: Bool
prop_readGlob6 :: Bool
prop_readGlob5 :: Bool
prop_readGlob4 :: Bool
prop_readGlob3 :: Bool
prop_readGlob2 :: Bool
prop_readGlob1 :: Bool
prop_readDoubleQuoted10 :: Bool
prop_readDoubleQuoted8 :: Bool
prop_readDoubleQuoted7 :: Bool
prop_readDoubleQuoted6 :: Bool
prop_readDoubleQuoted5 :: Bool
prop_readDoubleQuoted4 :: Bool
prop_readDoubleQuoted3 :: Bool
prop_readDoubleQuoted2 :: Bool
prop_readDoubleQuoted :: Bool
prop_readBackTicked8 :: Bool
prop_readBackTicked7 :: Bool
prop_readBackTicked6 :: Bool
prop_readBackTicked5 :: Bool
prop_readBackTicked4 :: Bool
prop_readBackTicked3 :: Bool
prop_readBackTicked2 :: Bool
prop_readBackTicked :: Bool
prop_readSingleQuoted8 :: Bool
prop_readSingleQuoted7 :: Bool
prop_readSingleQuoted6 :: Bool
prop_readSingleQuoted5 :: Bool
prop_readSingleQuoted4 :: Bool
prop_readSingleQuoted2 :: Bool
prop_readSingleQuoted :: Bool
prop_readProcSub3 :: Bool
prop_readProcSub2 :: Bool
prop_readProcSub1 :: Bool
prop_readNormalWord12 :: Bool
prop_readNormalWord11 :: Bool
prop_readNormalWord10 :: Bool
prop_readNormalWord9 :: Bool
prop_readNormalWord8 :: Bool
prop_readNormalWord7 :: Bool
prop_readNormalWord6 :: Bool
prop_readNormalWord5 :: Bool
prop_readNormalWord4 :: Bool
prop_readNormalWord3 :: Bool
prop_readNormalWord2 :: Bool
prop_readNormalWord :: Bool
prop_readAnnotation6 :: Bool
prop_readAnnotation5 :: Bool
prop_readAnnotation4 :: Bool
prop_readAnnotation3 :: Bool
prop_readAnnotation2 :: Bool
prop_readAnnotation1 :: Bool
prop_readCondition23 :: Bool
prop_readCondition22 :: Bool
prop_readCondition21 :: Bool
prop_readCondition20 :: Bool
prop_readCondition19 :: Bool
prop_readCondition18 :: Bool
prop_readCondition17 :: Bool
prop_readCondition16 :: Bool
prop_readCondition15 :: Bool
prop_readCondition14 :: Bool
prop_readCondition13 :: Bool
prop_readCondition12 :: Bool
prop_readCondition11 :: Bool
prop_readCondition10b :: Bool
prop_readCondition10a :: Bool
prop_readCondition10 :: Bool
prop_readCondition9 :: Bool
prop_readCondition8 :: Bool
prop_readCondition7 :: Bool
prop_readCondition6 :: Bool
prop_readCondition5b :: Bool
prop_readCondition5a :: Bool
prop_readCondition5 :: Bool
prop_readCondition4 :: Bool
prop_readCondition3 :: Bool
prop_readCondition2 :: Bool
prop_readCondition :: Bool
prop_a23 :: Bool
prop_a22 :: Bool
prop_a21 :: Bool
prop_a20 :: Bool
prop_a19 :: Bool
prop_a18 :: Bool
prop_a17 :: Bool
prop_a16 :: Bool
prop_a15 :: Bool
prop_a14 :: Bool
prop_a13 :: Bool
prop_a12 :: Bool
prop_a11 :: Bool
prop_a10 :: Bool
prop_a9 :: Bool
prop_a8 :: Bool
prop_a7 :: Bool
prop_a6 :: Bool
prop_a5 :: Bool
prop_a4 :: Bool
prop_a3 :: Bool
prop_a2 :: Bool
prop_a1 :: Bool
prop_allspacing3 :: Bool
prop_allspacing2 :: Bool
prop_allspacing :: Bool
prop_spacing :: Bool
$quickCheckAll