@@ -6,6 +6,7 @@ import Core.TT
6import Core.CoreParser (opChars)
6import Core.CoreParser (opChars)
8import Idris.AbsSyntaxTree
8import Idris.AbsSyntaxTree
10import Control.Monad.State.Strict
11import Control.Monad.State.Strict
@@ -14,40 +15,11 @@ import Data.Maybe
15import System.Console.Haskeline
16import System.Console.Haskeline
17−-- TODO: add specific classes of identifiers to complete, fx metavariables
18+
18−-- | A specification of the arguments that REPL commands can take
19+fst4 :: (a, b, c, d) -> a
19−data CmdArg = ExprArg -- ^ The command takes an expression
20+fst4 (a, b, c, d) = a
20− | NameArg -- ^ The command takes a name
21+
21− | FileArg -- ^ The command takes a file
22+commands = concatMap fst4 help
22− | ModuleArg -- ^ The command takes a module name
23− | OptionArg -- ^ The command takes an option
24− | MetaVarArg -- ^ The command takes a metavariable
26−-- | Information about how to complete the various commands
27−cmdArgs :: [(String, CmdArg)]
28−cmdArgs = [ (":t", ExprArg)
30− , (":missing", NameArg)
33− , (":total", NameArg)
36− , (":m", ModuleArg) -- NOTE: Argumentless form is a different command
38− , (":prove", MetaVarArg)
40− , (":addproof", NameArg)
41− , (":rmproof", NameArg)
42− , (":showproof", NameArg)
44− , (":compile", FileArg)
46− , (":javascript", FileArg)
47− , (":set", OptionArg)
48− , (":unset", OptionArg)
50−commands = map fst cmdArgs
52-- | A specification of the arguments that tactics can take
24-- | A specification of the arguments that tactics can take
53data TacticArg = NameTArg -- ^ Names: n1, n2, n3, ... n
25data TacticArg = NameTArg -- ^ Names: n1, n2, n3, ... n
@@ -124,15 +96,22 @@ completeOption = completeWord Nothing " \t" completeOpt
124isWhitespace :: Char -> Bool
96isWhitespace :: Char -> Bool
125isWhitespace = (flip elem) " \t\n"
97isWhitespace = (flip elem) " \t\n"
99+lookupInHelp :: String -> Maybe CmdArg
100+lookupInHelp cmd = lookupInHelp' cmd help
101+ where lookupInHelp' cmd ((cmds, _, _, arg):xs) | elem cmd cmds = Just arg
102+ | otherwise = lookupInHelp' cmd xs
103+ lookupInHelp' cmd [] = Nothing
127-- | Get the completion function for a particular command
105-- | Get the completion function for a particular command
128completeCmd :: String -> CompletionFunc Idris
106completeCmd :: String -> CompletionFunc Idris
129−completeCmd cmd (prev, next) = fromMaybe completeCmdName $ fmap completeArg $ lookup cmd cmdArgs
107+completeCmd cmd (prev, next) = fromMaybe completeCmdName $ fmap completeArg $ lookupInHelp cmd
130 where completeArg FileArg = completeFilename (prev, next)
108 where completeArg FileArg = completeFilename (prev, next)
131 completeArg NameArg = completeExpr [] (prev, next) -- FIXME only complete one name
109 completeArg NameArg = completeExpr [] (prev, next) -- FIXME only complete one name
132 completeArg OptionArg = completeOption (prev, next)
110 completeArg OptionArg = completeOption (prev, next)
133 completeArg ModuleArg = noCompletion (prev, next) -- FIXME do later
111 completeArg ModuleArg = noCompletion (prev, next) -- FIXME do later
134 completeArg ExprArg = completeExpr [] (prev, next)
112 completeArg ExprArg = completeExpr [] (prev, next)
135 completeArg MetaVarArg = completeMetaVar (prev, next) -- FIXME only complete one name
113 completeArg MetaVarArg = completeMetaVar (prev, next) -- FIXME only complete one name
114+ completeArg NoArg = noCompletion (prev, next)
136 completeCmdName = return $ ("", completeWith commands cmd)
115 completeCmdName = return $ ("", completeWith commands cmd)
138-- | Complete REPL commands and defined identifiers
117-- | Complete REPL commands and defined identifiers