0 | module TTImp.Interactive.Completion
7 | import Libraries.Data.WithDefault
12 | = NameCompletion String
13 | | CommandCompletion String
14 | | PragmaCompletion (Maybe KwPragma) String
20 | parseTask : (line : String) -> Maybe (String, Task)
22 | let (indnt, focus) = break (not . isSpace) line in
24 | StrCons '%' rest => case break isSpace rest of
25 | (pref, "") => pure (indnt, PragmaCompletion Nothing pref)
26 | (prag, rest) => do let prag = "%" ++ prag
27 | let (spcs, rest) = break (not . isSpace) rest
28 | let [kwprag] = filter ((prag ==) . show) allPragmas
30 | pure (concat {t = List} [indnt, prag, spcs]
31 | , PragmaCompletion (Just kwprag) rest)
32 | StrCons ':' rest => pure (indnt, CommandCompletion rest)
33 | _ => let ("", rest) = bimap Prelude.reverse Prelude.reverse
34 | $
break (\ x => not (isAlphaNum x || x > chr 160))
35 | $
Prelude.reverse line
36 | | (pref, rest) => pure (rest, NameCompletion pref)
40 | nameCompletion : {auto c : Ref Ctxt Defs} ->
41 | (pref : String) -> Core (List String)
42 | nameCompletion pref = do
43 | log "ide-mode.completion" 30 $
"Looking at name completions for \{show pref}"
45 | let cns = currentNS defs
46 | nms <- flip mapMaybeM !(allNames (gamma defs)) $
\ nsn => do
48 | log "ide-mode.completion" 50 $
"Looking at \{show nsn}"
49 | let (ns, n) = splitNS nsn
50 | let True = pref `isPrefixOf` nameRoot n
51 | | False => pure Nothing
53 | Just def <- lookupCtxtExact nsn (gamma defs)
54 | | Nothing => pure Nothing
55 | let True = visibleIn cns nsn (collapseDefault $
visibility def)
56 | | False => pure Nothing
58 | pure (map show $
nub nms)
61 | oneOfCompletion : String -> List String -> Maybe (List String)
62 | oneOfCompletion pref candidates = do
63 | let cs@(_ :: _) = filter (pref `isPrefixOf`) candidates
72 | pragmaCompletion : {auto c : Ref Ctxt Defs} ->
73 | (prag : Maybe KwPragma) -> (pref : String) ->
74 | Core (Maybe (String, List String))
75 | pragmaCompletion Nothing pref = pure $
do
76 | let ps@(_ :: _) = flip List.mapMaybe allPragmas $
\ prag => do
77 | let prag = show prag
78 | guard ("%" ++ pref `isPrefixOf` prag)
82 | pragmaCompletion (Just kw) pref = go (pragmaArgs kw) (break isSpace pref) where
84 | go : List PragmaArg -> (String, String) -> Core (Maybe (String, List String))
85 | go (AName {} :: _) (here, "") = do
86 | ns@(_ :: _) <- nameCompletion here
88 | pure (Just ("", ns))
89 | go (AnOnOff :: _) (here, "") = pure (("",) <$> oneOfCompletion here ["on", "off"])
90 | go (AnOptionalLoggingTopic :: _) (here, "") = do
91 | let StrCons '"' here = strM here
93 | let lvls@(_ :: _) = filter ((here `isPrefixOf`) . fst) knownTopics
95 | pure (Just ("", map (show . fst) lvls))
96 | go (ALangExt :: _) (here, "") = pure (("",) <$> oneOfCompletion here (map show allLangExts))
97 | go (ATotalityLevel :: _) (here, "") = pure (("",) <$> oneOfCompletion here ["partial", "covering", "total"])
98 | go (_ :: args) (skip, rest) =
99 | let (indnt, rest) = break (not . isSpace) rest in
100 | map (mapFst ((skip ++ indnt) ++)) <$> go args (break isSpace rest)
101 | go _ (_, _) = pure Nothing
107 | completion : {auto c : Ref Ctxt Defs} ->
108 | (line : String) -> Core (Maybe (String, List String))
109 | completion line = do
110 | let Just (ctxt, task) = parseTask line
111 | | _ => pure Nothing
113 | NameCompletion pref => (Just . (ctxt,)) <$> nameCompletion pref
114 | PragmaCompletion mprag pref => map (mapFst (ctxt ++)) <$> pragmaCompletion mprag pref
115 | CommandCompletion pref => case words pref of
116 | ["logging"] => pure $
Just (ctxt ++ ":logging", map ((" " ++) . show . fst) knownTopics)
117 | [pref] => let commands = concatMap fst parserCommandsForHelp in
118 | pure $
map ((ctxt,) . map (":" ++)) $
oneOfCompletion pref commands
119 | ["logging", w] => pure $
map (ctxt ++ ":logging ",) (oneOfCompletion w (map (show . fst) knownTopics))