summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Holdermans <stefan@holdermans.nl>2020-04-20 21:51:57 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-05-21 12:16:08 -0400
commita0b79e1b16887371d5cd14d53a607772ca730fb5 (patch)
tree3722888cc606656e6a7a5c110e2ae3b8ec410cf1
parent82663959d2f1ddbb514a652593bc8064fd69d6aa (diff)
downloadhaskell-a0b79e1b16887371d5cd14d53a607772ca730fb5.tar.gz
Allow GHCi :script file names in double quotes
This patch updates the user interface of GHCi so that file names passed to the ':script' command can be wrapped in double quotes. For example: :script "foo bar.script" The implementation uses a modified version of 'words' that treats character sequences enclosed in double quotes as single words. Fixes #18027.
-rw-r--r--ghc/GHCi/UI.hs7
-rw-r--r--testsuite/tests/ghci/should_run/T18027.script1
-rw-r--r--testsuite/tests/ghci/should_run/T18027.stdout1
3 files changed, 7 insertions, 2 deletions
diff --git a/ghc/GHCi/UI.hs b/ghc/GHCi/UI.hs
index c1fce215c3..36e27dd5b4 100644
--- a/ghc/GHCi/UI.hs
+++ b/ghc/GHCi/UI.hs
@@ -2267,12 +2267,15 @@ scriptCmd ws = do
[s] -> runScript s
_ -> throwGhcException (CmdLineError "syntax: :script <filename>")
--- | A version of 'words' that does not break on backslash-escaped spaces.
--- E.g., 'words\' "lorem\\ ipsum dolor"' yields '["lorem ipsum", "dolor"]'.
+-- | A version of 'words' that treats sequences enclosed in double quotes as
+-- single words and that does not break on backslash-escaped spaces.
+-- E.g., 'words\' "\"lorem ipsum\" dolor"' and 'words\' "lorem\\ ipsum dolor"'
+-- yield '["lorem ipsum", "dolor"]'.
-- Used to scan for file paths in 'scriptCmd'.
words' :: String -> [String]
words' s = case dropWhile isSpace s of
"" -> []
+ s'@('\"' : _) | [(w, s'')] <- reads s' -> w : words' s''
s' -> go id s'
where
go acc [] = [acc []]
diff --git a/testsuite/tests/ghci/should_run/T18027.script b/testsuite/tests/ghci/should_run/T18027.script
index fd839d2392..bb13844f81 100644
--- a/testsuite/tests/ghci/should_run/T18027.script
+++ b/testsuite/tests/ghci/should_run/T18027.script
@@ -1 +1,2 @@
:script T18027\ SPACE\ IN\ FILE\ NAME.script
+:script "T18027 SPACE IN FILE NAME.script"
diff --git a/testsuite/tests/ghci/should_run/T18027.stdout b/testsuite/tests/ghci/should_run/T18027.stdout
index d81cc0710e..daaac9e303 100644
--- a/testsuite/tests/ghci/should_run/T18027.stdout
+++ b/testsuite/tests/ghci/should_run/T18027.stdout
@@ -1 +1,2 @@
42
+42