[commit: ghc] master: Tweak lookup semantics for GHCi macros (7e4406b)
git at git.haskell.org
git at git.haskell.org
Mon Nov 4 08:14:33 UTC 2013
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/7e4406b282647587384981f6b5ee8d7c6309373d/ghc
>---------------------------------------------------------------
commit 7e4406b282647587384981f6b5ee8d7c6309373d
Author: Herbert Valerio Riedel <hvr at gnu.org>
Date: Sat Nov 2 11:58:09 2013 +0100
Tweak lookup semantics for GHCi macros
This changes the prefix-based lookup to prefer macros over builtins only if
the macro name matches an existing builtin name. See #8305 for more details.
Signed-off-by: Herbert Valerio Riedel <hvr at gnu.org>
>---------------------------------------------------------------
7e4406b282647587384981f6b5ee8d7c6309373d
ghc/InteractiveUI.hs | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs
index eb32aa6..5413a1a 100644
--- a/ghc/InteractiveUI.hs
+++ b/ghc/InteractiveUI.hs
@@ -986,15 +986,23 @@ lookupCommand' ":" = return Nothing
lookupCommand' str' = do
macros <- liftIO $ readIORef macros_ref
ghci_cmds <- ghci_commands `fmap` getGHCiState
- let{ (str, cmds) = case str' of
- ':' : rest -> (rest, ghci_cmds) -- "::" selects a builtin command
- _ -> (str', macros ++ ghci_cmds) } -- otherwise prefer macros
- -- look for exact match first, then the first prefix match
- return $ case [ c | c <- cmds, str == cmdName c ] of
- c:_ -> Just c
- [] -> case [ c | c@(s,_,_) <- cmds, str `isPrefixOf` s ] of
- [] -> Nothing
- c:_ -> Just c
+ let (str, xcmds) = case str' of
+ ':' : rest -> (rest, []) -- "::" selects a builtin command
+ _ -> (str', macros) -- otherwise include macros in lookup
+
+ lookupExact s = find $ (s ==) . cmdName
+ lookupPrefix s = find $ (s `isPrefixOf`) . cmdName
+
+ builtinPfxMatch = lookupPrefix str ghci_cmds
+
+ -- first, look for exact match (while preferring macros); then, look
+ -- for first prefix match (preferring builtins), *unless* a macro
+ -- overrides the builtin; see #8305 for motivation
+ return $ lookupExact str xcmds <|>
+ lookupExact str ghci_cmds <|>
+ (builtinPfxMatch >>= \c -> lookupExact (cmdName c) xcmds) <|>
+ builtinPfxMatch <|>
+ lookupPrefix str xcmds
getCurrentBreakSpan :: GHCi (Maybe SrcSpan)
getCurrentBreakSpan = do
More information about the ghc-commits
mailing list