@@ -49,24 +49,22 @@ commands = map fst cmdArgs
4949-- | A specification of the arguments that tactics can take
5050data TacticArg = NameTArg -- ^ Names: n1, n2, n3, ... n
5151 | ExprTArg
52− | TacticTArg
53− | CommasTArg TacticArg
54− | AltTArg TacticArg TacticArg
52+ | AltsTArg
5553
5654-- | A list of available tactics and their argument requirements
5755tacticArgs :: [(String, Maybe TacticArg)]
58−tacticArgs = [ ("intro", Just $ CommasTArg NameTArg)
56+tacticArgs = [ ("intro", Nothing)
5957 , ("intros", Nothing)
60− , ("refine", Just NameTArg)
61− , ("rewrite", Just NameTArg)
58+ , ("refine", Just ExprTArg)
59+ , ("rewrite", Just ExprTArg)
6260 , ("let", Nothing) -- FIXME syntax for let
63− , ("focus", Just NameTArg)
61+ , ("focus", Just ExprTArg)
6462 , ("exact", Just ExprTArg)
6563 , ("reflect", Just ExprTArg)
66− , ("try", Just $ AltTArg TacticTArg TacticTArg)
64+ , ("try", Just AltsTArg)
6765 ] ++ map (\x -> (x, Nothing)) [
68− "compute", "trivial", "solve", "attack", "state",
69− "term", "undo", "qed", "abandon", ":q"
66+ "intro", "intros", "compute", "trivial", "solve", "attack",
67+ "state", "term", "undo", "qed", "abandon", ":q"
7068 ]
7169tactics = map fst tacticArgs
7270
@@ -100,12 +98,12 @@ completeWith ns n = if uniqueExists
10098 where prefixMatches = filter (isPrefixOf n) ns
10199 uniqueExists = n `elem` prefixMatches
102100
103−completeName :: String -> Idris [Completion]
104−completeName n = do ns <- names
105− return $ completeWith ns n
101+completeName :: [String] -> String -> Idris [Completion]
102+completeName extra n = do ns <- names
103+ return $ completeWith (extra ++ ns) n
106104
107−completeExpr :: CompletionFunc Idris
108−completeExpr = completeWord Nothing " \t" completeName
105+completeExpr :: [String] -> CompletionFunc Idris
106+completeExpr extra = completeWord Nothing " \t" (completeName extra)
109107
110108completeOption :: CompletionFunc Idris
111109completeOption = completeWord Nothing " \t" completeOpt
@@ -118,24 +116,28 @@ isWhitespace = (flip elem) " \t\n"
118116completeCmd :: String -> CompletionFunc Idris
119117completeCmd cmd (prev, next) = fromMaybe completeCmdName $ fmap completeArg $ lookup cmd cmdArgs
120118 where completeArg FileArg = completeFilename (prev, next)
121− completeArg NameArg = completeExpr (prev, next) -- FIXME only complete one name
119+ completeArg NameArg = completeExpr [] (prev, next) -- FIXME only complete one name
122120 completeArg OptionArg = completeOption (prev, next)
123121 completeArg ModuleArg = noCompletion (prev, next) -- FIXME do later
124− completeArg ExprArg = completeExpr (prev, next)
122+ completeArg ExprArg = completeExpr [] (prev, next)
125123 completeCmdName = return $ ("", completeWith commands cmd)
126124
127125replCompletion :: CompletionFunc Idris
128126replCompletion (prev, next) = case firstWord of
129127 ':':cmdName -> completeCmd (':':cmdName) (prev, next)
130− _ -> completeExpr (prev, next)
128+ _ -> completeExpr [] (prev, next)
131129 where firstWord = fst $ break isWhitespace $ dropWhile isWhitespace $ reverse prev
132130
133131
134−completeTactic :: String -> CompletionFunc Idris
135−completeTactic tac (prev, next) = return $ completeTacName tac
132+completeTactic :: [String] -> String -> CompletionFunc Idris
133+completeTactic as tac (prev, next) = fromMaybe completeTacName $ fmap completeArg $ lookup tac tacticArgs
136134 where completeTacName = return $ ("", completeWith tactics tac)
135+ completeArg Nothing = noCompletion (prev, next)
136+ completeArg (Just NameTArg) = noCompletion (prev, next) -- this is for binding new names!
137+ completeArg (Just ExprTArg) = completeExpr as (prev, next)
138+ completeArg (Just AltsTArg) = noCompletion (prev, next) -- TODO
137139
138140
139−proverCompletion :: CompletionFunc Idris
140−proverCompletion (prev, next) = completeTactic firstWord (prev, next)
141+proverCompletion :: [String] -> CompletionFunc Idris
142+proverCompletion assumptions (prev, next) = completeTactic assumptions firstWord (prev, next)
141143 where firstWord = fst $ break isWhitespace $ dropWhile isWhitespace $ reverse prev