Skip to content
This repository was archived by the owner on Apr 24, 2021. It is now read-only.

Commit 4b7864f

Browse files
committed
Convert Query to unmonad
1 parent 063fcc4 commit 4b7864f

File tree

1 file changed

+96
-47
lines changed

1 file changed

+96
-47
lines changed

src/rescript-editor-support/Query.re

Lines changed: 96 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,15 @@ let rec resolvePathInner = (~env, ~path) => {
8080
switch (path) {
8181
| Tip(name) => Some(`Local((env, name)))
8282
| Nested(subName, subPath) =>
83-
let%opt stamp = Hashtbl.find_opt(env.exported.modules, subName);
84-
let%opt {item: kind} = Hashtbl.find_opt(env.file.stamps.modules, stamp);
85-
findInModule(~env, kind, subPath);
86-
};
83+
switch (Hashtbl.find_opt(env.exported.modules, subName)) {
84+
| None => None
85+
| Some(stamp) =>
86+
switch (Hashtbl.find_opt(env.file.stamps.modules, stamp)) {
87+
| None => None
88+
| Some({item: kind}) => findInModule(~env, kind, subPath)
89+
}
90+
}
91+
}
8792
}
8893
and findInModule = (~env, kind, path) => {
8994
switch (kind) {
@@ -94,22 +99,29 @@ and findInModule = (~env, kind, path) => {
9499
if (stamp == 0) {
95100
Some(`Global((moduleName, fullPath)));
96101
} else {
97-
let%opt {item: kind} =
98-
Hashtbl.find_opt(env.file.stamps.modules, stamp);
99-
findInModule(~env, kind, fullPath);
102+
switch (Hashtbl.find_opt(env.file.stamps.modules, stamp)) {
103+
| None => None
104+
| Some({item: kind}) => findInModule(~env, kind, fullPath)
105+
};
100106
};
101107
};
102108
};
103109

104110
/* let rec findSubModule = (~env, ~getModule) */
105111

106112
let rec resolvePath = (~env, ~path, ~getModule) => {
107-
let%opt result = resolvePathInner(~env, ~path);
108-
switch (result) {
109-
| `Local(env, name) => Some((env, name))
110-
| `Global(moduleName, fullPath) =>
111-
let%opt file = getModule(moduleName);
112-
resolvePath(~env=fileEnv(file), ~path=fullPath, ~getModule);
113+
switch (resolvePathInner(~env, ~path)) {
114+
| None => None
115+
| Some(result) =>
116+
switch (result) {
117+
| `Local(env, name) => Some((env, name))
118+
| `Global(moduleName, fullPath) =>
119+
switch (getModule(moduleName)) {
120+
| None => None
121+
| Some(file) =>
122+
resolvePath(~env=fileEnv(file), ~path=fullPath, ~getModule)
123+
}
124+
}
113125
};
114126
};
115127

@@ -118,15 +130,24 @@ let resolveFromStamps = (~env, ~path, ~getModule, ~pos) => {
118130
| Tip(name) => Some((env, name))
119131
| Nested(name, inner) =>
120132
/* Log.log("Finding from stamps " ++ name); */
121-
let%opt declared = findInScope(pos, name, env.file.stamps.modules);
122-
/* Log.log("found it"); */
123-
let%opt res = findInModule(~env, declared.item, inner);
124-
switch (res) {
125-
| `Local(env, name) => Some((env, name))
126-
| `Global(moduleName, fullPath) =>
127-
let%opt file = getModule(moduleName);
128-
resolvePath(~env=fileEnv(file), ~path=fullPath, ~getModule);
129-
};
133+
switch (findInScope(pos, name, env.file.stamps.modules)) {
134+
| None => None
135+
| Some(declared) =>
136+
/* Log.log("found it"); */
137+
switch (findInModule(~env, declared.item, inner)) {
138+
| None => None
139+
| Some(res) =>
140+
switch (res) {
141+
| `Local(env, name) => Some((env, name))
142+
| `Global(moduleName, fullPath) =>
143+
switch (getModule(moduleName)) {
144+
| None => None
145+
| Some(file) =>
146+
resolvePath(~env=fileEnv(file), ~path=fullPath, ~getModule)
147+
}
148+
}
149+
}
150+
}
130151
};
131152
};
132153

@@ -154,24 +175,45 @@ let fromCompilerPath = (~env, path) => {
154175
let resolveModuleFromCompilerPath = (~env, ~getModule, path) => {
155176
switch (fromCompilerPath(~env, path)) {
156177
| `Global(moduleName, path) =>
157-
let%opt file = getModule(moduleName);
158-
let env = fileEnv(file);
159-
let%opt (env, name) = resolvePath(~env, ~getModule, ~path);
160-
let%opt stamp = Hashtbl.find_opt(env.exported.modules, name);
161-
let%opt declared = Hashtbl.find_opt(env.file.stamps.modules, stamp);
162-
Some((env, Some(declared)));
178+
switch (getModule(moduleName)) {
179+
| None => None
180+
| Some(file) =>
181+
let env = fileEnv(file);
182+
switch (resolvePath(~env, ~getModule, ~path)) {
183+
| None => None
184+
| Some((env, name)) =>
185+
switch (Hashtbl.find_opt(env.exported.modules, name)) {
186+
| None => None
187+
| Some(stamp) =>
188+
switch (Hashtbl.find_opt(env.file.stamps.modules, stamp)) {
189+
| None => None
190+
| Some(declared) => Some((env, Some(declared)))
191+
}
192+
}
193+
};
194+
}
163195
| `Stamp(stamp) =>
164-
let%opt declared = Hashtbl.find_opt(env.file.stamps.modules, stamp);
165-
Some((env, Some(declared)));
196+
switch (Hashtbl.find_opt(env.file.stamps.modules, stamp)) {
197+
| None => None
198+
| Some(declared) => Some((env, Some(declared)))
199+
}
166200
| `GlobalMod(moduleName) =>
167-
let%opt file = getModule(moduleName);
168-
let env = fileEnv(file);
169-
Some((env, None));
201+
switch (getModule(moduleName)) {
202+
| None => None
203+
| Some(file) =>
204+
let env = fileEnv(file);
205+
Some((env, None));
206+
}
170207
| `Not_found => None
171208
| `Exported(env, name) =>
172-
let%opt stamp = Hashtbl.find_opt(env.exported.modules, name);
173-
let%opt declared = Hashtbl.find_opt(env.file.stamps.modules, stamp);
174-
Some((env, Some(declared)));
209+
switch (Hashtbl.find_opt(env.exported.modules, name)) {
210+
| None => None
211+
| Some(stamp) =>
212+
switch (Hashtbl.find_opt(env.file.stamps.modules, stamp)) {
213+
| None => None
214+
| Some(declared) => Some((env, Some(declared)))
215+
}
216+
}
175217
};
176218
};
177219

@@ -234,21 +276,28 @@ let declaredForTip = (~stamps, stamp, tip) =>
234276
};
235277

236278
let getField = (file, stamp, name) => {
237-
let%opt {item: {kind}} = Hashtbl.find_opt(file.stamps.types, stamp);
238-
switch (kind) {
239-
| Record(fields) => fields |> List.find_opt(f => f.fname.txt == name)
240-
| _ => None
279+
switch (Hashtbl.find_opt(file.stamps.types, stamp)) {
280+
| None => None
281+
| Some({item: {kind}}) =>
282+
switch (kind) {
283+
| Record(fields) => fields |> List.find_opt(f => f.fname.txt == name)
284+
| _ => None
285+
}
241286
};
242287
};
243288

244289
let getConstructor = (file, stamp, name) => {
245-
let%opt {item: {kind}} = Hashtbl.find_opt(file.stamps.types, stamp);
246-
switch (kind) {
247-
| Variant(constructors) =>
248-
let%opt const =
249-
constructors |> List.find_opt(const => const.cname.txt == name);
250-
Some(const);
251-
| _ => None
290+
switch (Hashtbl.find_opt(file.stamps.types, stamp)) {
291+
| None => None
292+
| Some({item: {kind}}) =>
293+
switch (kind) {
294+
| Variant(constructors) =>
295+
switch (constructors |> List.find_opt(const => const.cname.txt == name)) {
296+
| None => None
297+
| Some(const) => Some(const)
298+
}
299+
| _ => None
300+
}
252301
};
253302
};
254303

0 commit comments

Comments
 (0)