@@ -28,6 +28,8 @@ module Language.PureScript.Ide.State
28 , populateStage2
28 , populateStage2
29 , populateStage3
29 , populateStage3
30 , populateStage3STM
30 , populateStage3STM
32+ , resolveOperatorsForModule
33import Protolude
35import Protolude
@@ -35,7 +37,8 @@ import qualified Prelude
36import Control.Concurrent.STM
38import Control.Concurrent.STM
37import "monad-logger" Control.Monad.Logger
39import "monad-logger" Control.Monad.Logger
38−import qualified Data.Map.Lazy as M
40+import qualified Data.Map.Lazy as Map
41+import qualified Data.List as List
39import Language.PureScript.Externs
42import Language.PureScript.Externs
40import Language.PureScript.Ide.Externs
43import Language.PureScript.Ide.Externs
41import Language.PureScript.Ide.Reexports
44import Language.PureScript.Ide.Reexports
@@ -55,10 +58,10 @@ resetIdeState = do
56-- | Gets the loaded Modulenames
59-- | Gets the loaded Modulenames
57getLoadedModulenames :: Ide m => m [P.ModuleName]
60getLoadedModulenames :: Ide m => m [P.ModuleName]
58−getLoadedModulenames = M.keys <$> getExternFiles
61+getLoadedModulenames = Map.keys <$> getExternFiles
60-- | Gets all loaded ExternFiles
63-- | Gets all loaded ExternFiles
61−getExternFiles :: Ide m => m (M.Map P.ModuleName ExternsFile)
64+getExternFiles :: Ide m => m (Map P.ModuleName ExternsFile)
62getExternFiles = s1Externs <$> getStage1
65getExternFiles = s1Externs <$> getStage1
64-- | Insert a Module into Stage1 of the State
67-- | Insert a Module into Stage1 of the State
@@ -72,7 +75,7 @@ insertModuleSTM :: TVar IdeState -> (FilePath, P.Module) -> STM ()
72insertModuleSTM ref (fp, module') =
75insertModuleSTM ref (fp, module') =
73 modifyTVar ref $ \x ->
76 modifyTVar ref $ \x ->
74 x { ideStage1 = (ideStage1 x) {
77 x { ideStage1 = (ideStage1 x) {
75− s1Modules = M.insert
78+ s1Modules = Map.insert
76 (P.getModuleName module')
79 (P.getModuleName module')
77 (module', fp)
80 (module', fp)
78 (s1Modules (ideStage1 x))}}
81 (s1Modules (ideStage1 x))}}
@@ -126,17 +129,24 @@ getAllModules mmoduleName = do
126 declarations <- s3Declarations <$> getStage3
129 declarations <- s3Declarations <$> getStage3
127 rebuild <- cachedRebuild
130 rebuild <- cachedRebuild
128 case mmoduleName of
131 case mmoduleName of
129− Nothing -> pure (M.toList declarations)
132+ Nothing -> pure (Map.toList declarations)
130 Just moduleName ->
133 Just moduleName ->
131 case rebuild of
134 case rebuild of
132 Just (cachedModulename, ef)
135 Just (cachedModulename, ef)
133 | cachedModulename == moduleName -> do
136 | cachedModulename == moduleName -> do
134 (AstData asts) <- s2AstData <$> getStage2
137 (AstData asts) <- s2AstData <$> getStage2
135− let ast = fromMaybe (M.empty, M.empty) (M.lookup moduleName asts)
140+ fromMaybe (Map.empty, Map.empty) (Map.lookup moduleName asts)
136− pure . M.toList $
141+ cachedModule =
138− (snd . annotateModule ast . fst . convertExterns $ ef) declarations
142+ snd . annotateModule ast . fst . convertExterns $ ef
144+ Map.insert moduleName cachedModule declarations
146+ Map.adjust (resolveOperatorsForModule tmp) moduleName tmp
148+ pure (Map.toList resolved)
139− _ -> pure (M.toList declarations)
149+ _ -> pure (Map.toList declarations)
141-- | Adds an ExternsFile into psc-ide's State Stage1. This does not populate the
151-- | Adds an ExternsFile into psc-ide's State Stage1. This does not populate the
142-- following Stages, which needs to be done after all the necessary Exterms have
152-- following Stages, which needs to be done after all the necessary Exterms have
@@ -151,7 +161,7 @@ insertExternsSTM :: TVar IdeState -> ExternsFile -> STM ()
151insertExternsSTM ref ef =
161insertExternsSTM ref ef =
152 modifyTVar ref $ \x ->
162 modifyTVar ref $ \x ->
153 x { ideStage1 = (ideStage1 x) {
163 x { ideStage1 = (ideStage1 x) {
154− s1Externs = M.insert (efModuleName ef) ef (s1Externs (ideStage1 x))}}
164+ s1Externs = Map.insert (efModuleName ef) ef (s1Externs (ideStage1 x))}}
156-- | Sets rebuild cache to the given ExternsFile
166-- | Sets rebuild cache to the given ExternsFile
157cacheRebuild :: Ide m => ExternsFile -> m ()
167cacheRebuild :: Ide m => ExternsFile -> m ()
@@ -202,12 +212,70 @@ populateStage3STM :: TVar IdeState -> STM [ReexportResult Module]
202populateStage3STM ref = do
212populateStage3STM ref = do
203 externs <- s1Externs <$> getStage1STM ref
213 externs <- s1Externs <$> getStage1STM ref
204 (AstData asts) <- s2AstData <$> getStage2STM ref
214 (AstData asts) <- s2AstData <$> getStage2STM ref
205− let modules = M.map convertExterns externs
215+ let modules = Map.map convertExterns externs
206 nModules :: Map P.ModuleName (Module, [(P.ModuleName, P.DeclarationRef)])
216 nModules :: Map P.ModuleName (Module, [(P.ModuleName, P.DeclarationRef)])
207− nModules = M.mapWithKey
217+ nModules = Map.mapWithKey
208 (\moduleName (m, refs) ->
218 (\moduleName (m, refs) ->
209− (fromMaybe m $ annotateModule <$> M.lookup moduleName asts <*> pure m, refs)) modules
219+ (fromMaybe m $ annotateModule <$> Map.lookup moduleName asts <*> pure m, refs)) modules
210 -- resolves reexports and discards load failures for now
220 -- resolves reexports and discards load failures for now
211− result = resolveReexports (M.map (snd . fst) nModules) <$> M.elems nModules
221+ result = resolveReexports (map (snd . fst) nModules) <$> Map.elems nModules
222+ resultP = resolveOperators (Map.fromList (reResolved <$> result))
212− setStage3STM ref (Stage3 (M.fromList (map reResolved result)) Nothing)
223+ setStage3STM ref (Stage3 resultP Nothing)
213 pure result
224 pure result
227+ :: Map P.ModuleName [IdeDeclarationAnn]
228+ -> Map P.ModuleName [IdeDeclarationAnn]
229+resolveOperators modules =
230+ map (resolveOperatorsForModule modules) modules
232+-- | Looks up the types and kinds for operators and assigns them to their
234+resolveOperatorsForModule
235+ :: Map P.ModuleName [IdeDeclarationAnn]
236+ -> [IdeDeclarationAnn]
237+ -> [IdeDeclarationAnn]
238+resolveOperatorsForModule modules = map (mapIdeDeclaration resolveOperator)
240+ resolveOperator (IdeValueOperator
242+ i@(P.Qualified (Just moduleName)
243+ (Left ident)) precedence assoc _) =
245+ sourceModule <- Map.lookup moduleName modules
248+ IdeValue iP _ -> iP == ident
249+ _ -> False) (discardAnn <$> sourceModule)
252+ in IdeValueOperator opName i precedence assoc t
253+ resolveOperator (IdeValueOperator
255+ i@(P.Qualified (Just moduleName)
256+ (Right ctor)) precedence assoc _) =
258+ sourceModule <- Map.lookup moduleName modules
259+ IdeDataConstructor _ _ tP <-
261+ IdeDataConstructor cname _ _ -> ctor == cname
262+ _ -> False) (discardAnn <$> sourceModule)
265+ in IdeValueOperator opName i precedence assoc t
266+ resolveOperator (IdeTypeOperator
268+ i@(P.Qualified (Just moduleName) properName) precedence assoc _) =
270+ sourceModule <- Map.lookup moduleName modules
273+ IdeType name _ -> name == properName
274+ _ -> False) (discardAnn <$> sourceModule)
277+ in IdeTypeOperator opName i precedence assoc k
278+ resolveOperator x = x
280+mapIdeDeclaration :: (IdeDeclaration -> IdeDeclaration) -> IdeDeclarationAnn -> IdeDeclarationAnn
281+mapIdeDeclaration f (IdeDeclarationAnn ann decl) = IdeDeclarationAnn ann (f decl)