summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Parser/Expr.hs12
-rw-r--r--src/Parser/Shell.hs16
2 files changed, 23 insertions, 5 deletions
diff --git a/src/Parser/Expr.hs b/src/Parser/Expr.hs
index 2d0b770..b2c6b84 100644
--- a/src/Parser/Expr.hs
+++ b/src/Parser/Expr.hs
@@ -14,6 +14,7 @@ module Parser.Expr (
variable,
constructor,
+ someExpansion, expansionTypeCheck,
expressionExpansion,
stringExpansion,
@@ -110,10 +111,8 @@ someExpansion = do
, between (char '{') (char '}') (someExpr FunctionTerm)
]
-expressionExpansion :: forall a. ExprType a => Text -> TestParser (Expr a)
-expressionExpansion tname = do
- off <- stateOffset <$> getParserState
- SomeExpr e <- someExpansion
+expansionTypeCheck :: forall a. ExprType a => Int -> Text -> SomeExpr -> TestParser (Expr a)
+expansionTypeCheck off tname (SomeExpr e) = do
let err = do
registerParseError $ FancyError off $ S.singleton $ ErrorFail $ T.unpack $ T.concat
[ tname, T.pack " expansion not defined for '", textExprType e, T.pack "'" ]
@@ -121,6 +120,11 @@ expressionExpansion tname = do
maybe err (return . (<$> e)) $ listToMaybe $ catMaybes [ cast (id :: a -> a), exprExpansionConvTo, exprExpansionConvFrom ]
+expressionExpansion :: forall a. ExprType a => Text -> TestParser (Expr a)
+expressionExpansion tname = do
+ off <- stateOffset <$> getParserState
+ expansionTypeCheck off tname =<< someExpansion
+
stringExpansion :: TestParser (Expr Text)
stringExpansion = expressionExpansion "string"
diff --git a/src/Parser/Shell.hs b/src/Parser/Shell.hs
index 8c8ef46..2d6026a 100644
--- a/src/Parser/Shell.hs
+++ b/src/Parser/Shell.hs
@@ -99,10 +99,24 @@ parseArgument = choice
parseArguments :: TestParser (Expr ShellArguments)
parseArguments = do
arglists <- many $ choice
- [ expressionExpansion "shell arguments" <* sc
+ [ do
+ off <- stateOffset <$> getParserState
+ se <- someExpansion
+ choice
+ [ do
+ notFollowedBy space1
+ arg <- expansionTypeCheck off "shell argument" se
+ txt <- parseTextArgument
+ return $ joinArgument <$> arg <*> txt
+ , do
+ expansionTypeCheck off "shell arguments" se <* sc
+ ]
, fmap (ShellArguments . (: [])) <$> parseArgument
]
return $ fmap mconcat $ foldr (liftA2 (:)) (Pure []) $ arglists
+ where
+ joinArgument (ShellArgument x) y = ShellArguments [ ShellArgument (x <> y) ]
+ joinArgument ax y = ShellArguments [ ax, ShellArgument y ]
parseCommand :: TestParser (Expr ShellCommand)
parseCommand = label "shell statement" $ do