Skip to content

Commit e384604

Browse files
committed
wip
1 parent 1f464da commit e384604

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

src/Language/PureScript/Ide.hs

+21-11
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import Database.SQLite.Simple (Only(Only))
6060
import Database.SQLite.Simple.ToField (ToField(..))
6161
import Language.PureScript.Ide.Filter.Declaration (declarationTypeToText)
6262
import Data.ByteString.Lazy qualified as Lazy
63+
import Data.Aeson qualified as Aeson
6364

6465
-- | Accepts a Command and runs it against psc-ide's State. This is the main
6566
-- entry point for the server.
@@ -99,15 +100,24 @@ handleCommand c = case c of
99100
AddClause l wca ->
100101
MultilineTextResult <$> CS.addClause l wca
101102
FindUsages moduleName ident namespace -> do
102-
Map.lookup moduleName <$> getAllModules Nothing >>= \case
103-
Nothing -> throwError (GeneralError "Module not found")
104-
Just decls -> do
105-
case find (\d -> namespaceForDeclaration (discardAnn d) == namespace
106-
&& identifierFromIdeDeclaration (discardAnn d) == ident) decls of
107-
Nothing -> throwError (GeneralError "Declaration not found")
108-
Just declaration -> do
109-
let sourceModule = fromMaybe moduleName (declaration & _idaAnnotation & _annExportedFrom)
110-
UsagesResult . foldMap toList <$> findUsages (discardAnn declaration) sourceModule
103+
r :: [Only Lazy.ByteString] <- runQuery $ unlines
104+
[ "select a.span"
105+
, "from dependencies d join asts a on d.module_name = a.module_name"
106+
, "where d.dependency = '" <> runModuleName moduleName <> "' and a.name = '" <> ident <> "'"
107+
]
108+
109+
pure $ UsagesResult (mapMaybe (\(Only span) -> Aeson.decode span) r)
110+
111+
112+
-- Map.lookup moduleName <$> getAllModules Nothing >>= \case
113+
-- Nothing -> throwError (GeneralError "Module not found")
114+
-- Just decls -> do
115+
-- case find (\d -> namespaceForDeclaration (discardAnn d) == namespace
116+
-- && identifierFromIdeDeclaration (discardAnn d) == ident) decls of
117+
-- Nothing -> throwError (GeneralError "Declaration not found")
118+
-- Just declaration -> do
119+
-- let sourceModule = fromMaybe moduleName (declaration & _idaAnnotation & _annExportedFrom)
120+
-- UsagesResult . foldMap toList <$> findUsages (discardAnn declaration) sourceModule
111121
Import fp outfp _ (AddImplicitImport mn) -> do
112122
rs <- addImplicitImport fp mn
113123
answerRequest outfp rs
@@ -168,8 +178,8 @@ findDeclarations filters currentModule completionOptions = do
168178
foldMap (\maxResults -> " limit " <> show maxResults ) (coMaxResults =<< completionOptions)
169179

170180
let matches = rows <&> \(m, decl) -> (Match (ModuleName m, deserialise decl), [])
171-
172-
pure $ CompletionResult $ completionFromMatch <$> matches
181+
182+
pure $ CompletionResult $ completionFromMatch <$> matches
173183

174184
sqliteFile :: Ide m => m FilePath
175185
sqliteFile = outputDirectory <&> ( </> "cache.db")

src/Language/PureScript/Make/IdeCache.hs

+37-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Codec.Serialise qualified as Serialise
99
import Control.Concurrent (threadDelay)
1010
import Control.Exception (try)
1111
import System.FilePath ((</>), takeDirectory)
12-
import Language.PureScript.Names (runModuleName, ProperName (runProperName), runIdent)
12+
import Language.PureScript.Names (runModuleName, ProperName (runProperName), runIdent, disqualify, Ident (..))
1313
import Language.PureScript.Externs (ExternsFile(..), ExternsImport(..))
1414
import Data.Foldable (for_)
1515
import Control.Monad.IO.Class (MonadIO (liftIO))
@@ -31,21 +31,42 @@ import Language.PureScript.Docs.AsMarkdown (codeToString, declAsMarkdown, runDoc
3131
import Codec.Serialise (serialise)
3232
import Data.Aeson (encode)
3333
import Debug.Trace qualified as Debug
34-
import Language.PureScript.AST.Declarations (Module)
34+
import Language.PureScript.AST.Declarations (Module, Expr (Var), getModuleDeclarations)
3535
import Language.PureScript.Ide.Filter.Declaration (DeclarationType (..))
3636
import Data.Aeson qualified as Aeson
37+
import Language.PureScript.AST.Traversals (everywhereOnValuesM)
38+
import Protolude (identity)
3739

3840
sqliteExtern :: (MonadIO m) => FilePath -> Module -> Docs.Module -> ExternsFile -> m ()
3941
sqliteExtern outputDir m docs extern = liftIO $ do
4042
conn <- SQLite.open db
4143

44+
-- Debug.traceM $ show m
45+
46+
let (doDecl, _, _) = everywhereOnValuesM (pure . identity) (\expr -> case expr of
47+
Var ss i -> do
48+
let iv = disqualify i
49+
case iv of
50+
Ident t -> do
51+
withRetry $ SQLite.executeNamed conn
52+
"insert into asts (module_name, name, span) values (:module_name, :name, :span)"
53+
[ ":module_name" := runModuleName ( efModuleName extern )
54+
, ":name" := t
55+
, ":span" := Aeson.encode ss
56+
]
57+
_ -> pure ()
58+
pure expr
59+
_ -> pure expr
60+
) (pure . identity)
61+
4262
withRetry $ SQLite.execute_ conn "pragma foreign_keys = ON;"
4363

4464
withRetry $ SQLite.executeNamed conn
4565
"delete from modules where module_name = :module_name"
4666
[ ":module_name" := runModuleName ( efModuleName extern )
4767
]
4868

69+
4970
withRetry $ SQLite.executeNamed conn
5071
"insert into modules (module_name, comment, extern, dec) values (:module_name, :docs, :extern, :dec)"
5172
[ ":module_name" := runModuleName ( efModuleName extern )
@@ -54,6 +75,8 @@ sqliteExtern outputDir m docs extern = liftIO $ do
5475
, ":dec" := show ( efExports extern )
5576
]
5677

78+
for_ (getModuleDeclarations m) (\d -> doDecl d)
79+
5780
for_ (efImports extern) (\i -> do
5881
withRetry $ SQLite.executeNamed conn "insert into dependencies (module_name, dependency) values (:module_name, :dependency)"
5982
[ ":module_name" := runModuleName (efModuleName extern )
@@ -191,10 +214,21 @@ sqliteInit outputDir = liftIO $ do
191214
, ")"
192215
]
193216

217+
withRetry $ SQLite.execute_ conn $ SQLite.Query $ Text.pack $ unlines
218+
[ "create table if not exists asts ("
219+
, " module_name text references modules(module_name) on delete cascade,"
220+
, " name text not null,"
221+
, " span text"
222+
, ")"
223+
]
224+
194225
withRetry $ SQLite.execute_ conn "create index if not exists dm on declarations(module_name)"
195226
withRetry $ SQLite.execute_ conn "create index if not exists dn on declarations(name);"
227+
228+
withRetry $ SQLite.execute_ conn "create index if not exists asts_module_name_idx on asts(module_name);"
229+
withRetry $ SQLite.execute_ conn "create index if not exists asts_name_idx on asts(name);"
196230

197-
withRetry $ SQLite.execute_ conn "create table if not exists ide_declarations (module_name text, name text, namespace text, declaration_type text, span blob, declaration blob)"
231+
withRetry $ SQLite.execute_ conn "create table if not exists ide_declarations (module_name text references modules(module_name) on delete cascade, name text, namespace text, declaration_type text, span blob, declaration blob)"
198232
SQLite.close conn
199233
where
200234
db = outputDir </> "cache.db"

0 commit comments

Comments
 (0)