@@ -1,4 +1,4 @@
1−module Idris.Completion (replCompletion) where
1+module Idris.Completion (replCompletion, proverCompletion) where
3import Core.Evaluate (ctxtAlist)
3import Core.Evaluate (ctxtAlist)
4import Core.TT
4import Core.TT
@@ -46,6 +46,30 @@ cmdArgs = [ (":t", ExprArg)
47commands = map fst cmdArgs
47commands = map fst cmdArgs
49+-- | A specification of the arguments that tactics can take
50+data TacticArg = NameTArg -- ^ Names: n1, n2, n3, ... n
53+ | CommasTArg TacticArg
54+ | AltTArg TacticArg TacticArg
56+-- | A list of available tactics and their argument requirements
57+tacticArgs :: [(String, Maybe TacticArg)]
58+tacticArgs = [ ("intro", Just $ CommasTArg NameTArg)
59+ , ("intros", Nothing)
60+ , ("refine", Just NameTArg)
61+ , ("rewrite", Just NameTArg)
62+ , ("let", Nothing) -- FIXME syntax for let
63+ , ("focus", Just NameTArg)
64+ , ("exact", Just ExprTArg)
65+ , ("reflect", Just ExprTArg)
66+ , ("try", Just $ AltTArg TacticTArg TacticTArg)
67+ ] ++ map (\x -> (x, Nothing)) [
68+ "compute", "trivial", "solve", "attack", "state",
69+ "term", "undo", "qed", "abandon", ":q"
71+tactics = map fst tacticArgs
49-- | Convert a name into a string usable for completion. Filters out names
73-- | Convert a name into a string usable for completion. Filters out names
50-- that users probably don't want to see.
74-- that users probably don't want to see.
51nameString :: Name -> Maybe String
75nameString :: Name -> Maybe String
@@ -57,16 +81,18 @@ nameString _ = Nothing
58-- FIXME: Respect module imports
82-- FIXME: Respect module imports
59-- | Get the user-visible names from the current interpreter state.
83-- | Get the user-visible names from the current interpreter state.
60−names :: StateT IState IO [String]
84+names :: Idris[String]
61names = do i <- get
85names = do i <- get
62 let ctxt = tt_ctxt i
86 let ctxt = tt_ctxt i
63 return $ nub $ mapMaybe (nameString . fst) $ ctxtAlist ctxt
87 return $ nub $ mapMaybe (nameString . fst) $ ctxtAlist ctxt
66−modules :: StateT IState IO [String]
90+modules :: Idris [String]
67modules = do i <- get
91modules = do i <- get
68 return $ map show $ imported i
92 return $ map show $ imported i
70completeWith :: [String] -> String -> [Completion]
96completeWith :: [String] -> String -> [Completion]
71completeWith ns n = if uniqueExists
97completeWith ns n = if uniqueExists
72 then [simpleCompletion n]
98 then [simpleCompletion n]
@@ -74,14 +100,14 @@ completeWith ns n = if uniqueExists
74 where prefixMatches = filter (isPrefixOf n) ns
100 where prefixMatches = filter (isPrefixOf n) ns
75 uniqueExists = n `elem` prefixMatches
101 uniqueExists = n `elem` prefixMatches
77−completeName :: String -> StateT IState IO [Completion]
103+completeName :: String -> Idris [Completion]
78completeName n = do ns <- names
104completeName n = do ns <- names
79 return $ completeWith ns n
105 return $ completeWith ns n
81−completeExpr :: CompletionFunc (StateT IState IO)
107+completeExpr :: CompletionFunc Idris
82completeExpr = completeWord Nothing " \t" completeName
108completeExpr = completeWord Nothing " \t" completeName
84−completeOption :: CompletionFunc (StateT IState IO)
110+completeOption :: CompletionFunc Idris
85completeOption = completeWord Nothing " \t" completeOpt
111completeOption = completeWord Nothing " \t" completeOpt
86 where completeOpt = return . (completeWith ["errorcontext", "showimplicits"])
112 where completeOpt = return . (completeWith ["errorcontext", "showimplicits"])
@@ -89,8 +115,8 @@ isWhitespace :: Char -> Bool
89isWhitespace = (flip elem) " \t\n"
115isWhitespace = (flip elem) " \t\n"
91-- | Get the completion function for a particular command
117-- | Get the completion function for a particular command
92−completeCmd :: String -> CompletionFunc (StateT IState IO)
118+completeCmd :: String -> CompletionFunc Idris
93−completeCmd cmd (prev, next) = fromMaybe completeCmdName (fmap completeArg $ lookup cmd cmdArgs)
119+completeCmd cmd (prev, next) = fromMaybe completeCmdName $ fmap completeArg $ lookup cmd cmdArgs
94 where completeArg FileArg = completeFilename (prev, next)
120 where completeArg FileArg = completeFilename (prev, next)
95 completeArg NameArg = completeExpr (prev, next) -- FIXME only complete one name
121 completeArg NameArg = completeExpr (prev, next) -- FIXME only complete one name
96 completeArg OptionArg = completeOption (prev, next)
122 completeArg OptionArg = completeOption (prev, next)
@@ -98,8 +124,18 @@ completeCmd cmd (prev, next) = fromMaybe completeCmdName (fmap completeArg $ loo
98 completeArg ExprArg = completeExpr (prev, next)
124 completeArg ExprArg = completeExpr (prev, next)
99 completeCmdName = return $ ("", completeWith commands cmd)
125 completeCmdName = return $ ("", completeWith commands cmd)
101−replCompletion :: CompletionFunc (StateT IState IO)
127+replCompletion :: CompletionFunc Idris
102replCompletion (prev, next) = case firstWord of
128replCompletion (prev, next) = case firstWord of
103 ':':cmdName -> completeCmd (':':cmdName) (prev, next)
129 ':':cmdName -> completeCmd (':':cmdName) (prev, next)
104 _ -> completeExpr (prev, next)
130 _ -> completeExpr (prev, next)
105− where firstWord = fst $ break isWhitespace $ dropWhile isWhitespace $ reverse prev
131+ where firstWord = fst $ break isWhitespace $ dropWhile isWhitespace $ reverse prev
134+completeTactic :: String -> CompletionFunc Idris
135+completeTactic tac (prev, next) = return $ completeTacName tac
136+ where completeTacName = return $ ("", completeWith tactics tac)
139+proverCompletion :: CompletionFunc Idris
140+proverCompletion (prev, next) = completeTactic firstWord (prev, next)
141+ where firstWord = fst $ break isWhitespace $ dropWhile isWhitespace $ reverse prev