@@ -3,11 +3,13 @@ module IdePurescript.Modules (
3
3
, initialModulesState
4
4
, State
5
5
, getMainModule
6
+ , getModuleName
6
7
, getModulesForFile
7
8
, getModulesForFileTemp
8
9
, getUnqualActiveModules
9
10
, getAllActiveModules
10
11
, getQualModule
12
+ , getModuleFromUnknownQualifier
11
13
, findImportInsertPos
12
14
, addModuleImport
13
15
, addExplicitImport
@@ -16,9 +18,8 @@ module IdePurescript.Modules (
16
18
) where
17
19
18
20
import Prelude
19
- import Node.FS.Aff as FS
20
- import PscIde as P
21
- import PscIde.Command as C
21
+
22
+ import Control.Alt ((<|>))
22
23
import Control.Monad.Aff (Aff , attempt )
23
24
import Control.Monad.Eff (Eff )
24
25
import Control.Monad.Eff.Class (liftEff )
@@ -27,14 +28,19 @@ import Data.Either (either, Either(..))
27
28
import Data.Foldable (all , notElem , elem )
28
29
import Data.Maybe (Maybe (..), maybe , fromMaybe )
29
30
import Data.Newtype (class Newtype )
31
+ import Data.StrMap as SM
30
32
import Data.String (Pattern (Pattern), split )
31
33
import Data.String.Regex (regex ) as R
32
34
import Data.String.Regex.Flags (global , noFlags , multiline ) as R
35
+ import Data.Tuple (Tuple (..))
33
36
import IdePurescript.Regex (replace' , match' , test' )
34
37
import Node.Encoding (Encoding (..))
35
38
import Node.FS (FS )
39
+ import Node.FS.Aff as FS
36
40
import Node.Path (sep )
41
+ import PscIde as P
37
42
import PscIde.Command (ImportType (..))
43
+ import PscIde.Command as C
38
44
39
45
newtype Module = Module
40
46
{ moduleName :: String
@@ -63,6 +69,7 @@ type State =
63
69
{ main :: Maybe String
64
70
, modules :: Array Module
65
71
, identifiers :: Array String
72
+ , identToModule :: SM.StrMap Module
66
73
}
67
74
68
75
type Path = String
@@ -80,12 +87,13 @@ getModulesForFile port file fullText = do
80
87
C.ImportList { moduleName, imports } <- either (const default) id <$> P .listImports port file
81
88
let modules = map mod imports
82
89
main = maybe (getMainModule fullText) Just moduleName
83
- identifiers = concatMap idents modules
84
- pure { main, modules, identifiers }
90
+ identToModule = SM .fromFoldable $ concatMap idents modules
91
+ identifiers = SM .keys identToModule
92
+ pure { main, modules, identifiers, identToModule }
85
93
where
86
94
default = C.ImportList { moduleName: Nothing , imports: [] }
87
95
mod (C.Import imp) = Module imp
88
- idents (Module { importType: Explicit ids }) = ids
96
+ idents m@ (Module { importType: Explicit ids }) = flip Tuple m <$> ids
89
97
idents _ = []
90
98
91
99
getModulesForFileTemp :: forall eff . Int -> Path -> String -> Aff (net :: P.NET , fs :: FS | eff ) State
@@ -120,8 +128,12 @@ getQualModule qualifier {modules} =
120
128
qual q (Module { qualifier: Just q' }) = q == q'
121
129
qual _ _ = false
122
130
131
+ getModuleFromUnknownQualifier :: String -> State -> Maybe Module
132
+ getModuleFromUnknownQualifier qual { identToModule } =
133
+ SM .lookup qual identToModule <|> SM .lookup (" class " <> qual) identToModule
134
+
123
135
initialModulesState :: State
124
- initialModulesState = { main: Nothing , modules: [] , identifiers: [] }
136
+ initialModulesState = { main: Nothing , modules: [] , identifiers: [] , identToModule: SM .empty }
125
137
126
138
findImportInsertPos :: String -> Int
127
139
findImportInsertPos text =
0 commit comments