50 lines
1.8 KiB
Agda
50 lines
1.8 KiB
Agda
-- For shared code between REPL and LSP
|
||
module Commands
|
||
|
||
import Prelude
|
||
import Lib.ProcessModule
|
||
import Lib.Types
|
||
import Lib.TopContext
|
||
import Lib.Common
|
||
import Data.List1
|
||
import Lib.Tokenizer
|
||
import Lib.Token
|
||
import Lib.Elab
|
||
|
||
-- For now we cheat and assume capitalized directories are a module component
|
||
decomposeName : String → String × String
|
||
decomposeName fn =
|
||
go Nil $ Lin <>< split (fst $ splitFileName fn) "/"
|
||
where
|
||
go : List String → SnocList String → String × String
|
||
go acc Lin = (".", joinBy "." acc)
|
||
go acc (xs :< x) = if isUpper $ strIndex x 0
|
||
then go (x :: acc) xs
|
||
else (joinBy "/" (xs :< x <>> Nil), joinBy "." acc)
|
||
|
||
-- The cheap version of type at point, find the token, lookup in global context
|
||
-- Later we will either get good FC for entries or scan them all and build a cache.
|
||
getHoverInfo : FileSource → String → Int → Int → M (Maybe (String × FC))
|
||
getHoverInfo repo modns row col = do
|
||
mod <- processModule emptyFC repo Nil modns
|
||
-- not necessarily loaded into top... (Maybe push this down into that branch of processModule)
|
||
modifyTop [ defs := mod.modDefs; metaCtx := mod.modMetaCtx; ops := mod.ctxOps; imported := mod.modDeps ]
|
||
top <- getTop
|
||
|
||
-- Find the token at the point
|
||
let lines = split mod.modSource "\n"
|
||
let line = fromMaybe "" (getAt' row lines)
|
||
let (Right toks) = tokenise "" line | Left _ => pure Nothing
|
||
let (Just name) = getTok toks | _ => pure Nothing
|
||
|
||
-- Lookup the name
|
||
let (Just e) = lookupRaw name top | _ => pure Nothing
|
||
pure $ Just ("\{show e.name} : \{rpprint Nil e.type}", e.fc)
|
||
|
||
where
|
||
getTok : List BTok → Maybe String
|
||
getTok Nil = Nothing
|
||
getTok (tok :: toks) =
|
||
if tok.bounds.startCol <= col && (col <= tok.bounds.endCol)
|
||
then Just $ value tok else getTok toks
|