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

Commit 61f7e7b

Browse files
authored
Make the unmonad script turn the let% into switch instead (#89)
* Make the unmonad script turn the let% into `switch` instead Follow-up of #87 Now we can properly add error handling to these `None`/`Error(_)` later * Check in the tests on 2 files Supercedes #86
1 parent c12b523 commit 61f7e7b

File tree

3 files changed

+67
-50
lines changed

3 files changed

+67
-50
lines changed

src/ppx2/Ppx_Unmonads.re

+24-14
Original file line numberDiff line numberDiff line change
@@ -115,21 +115,31 @@ let mapper =
115115
| Pexp_extension(({txt: (
116116
"opt" | "opt_consume"
117117
| "try" | "try_wrap"
118-
) as txt, loc}, PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_let(Nonrecursive, bindings, continuation)}, _attributes)}]))) => {
119-
let (front, explanation) = switch (txt) {
120-
| "opt" => ([%expr Monads.Option.bind], opt_explanation)
121-
| "opt_consume" => ([%expr Monads.Option.consume], opt_consume_explanation)
122-
| "try" => ([%expr Monads.Result.bind], "Sugar for the Result type")
123-
| "try_wrap" => ([%expr Monads.Result.map], "Sugar for the Result type - auto-wraps in `Ok()`")
124-
| _ => assert(false)
125-
};
118+
) as txt}, PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_let(Nonrecursive, bindings, continuation)}, _attributes)}]))) => {
126119
let (pat, expr) = process_bindings(bindings);
127-
Ast_helper.Exp.attr(
128-
[%expr [%e front]([%e mapper.expr(mapper, expr)], ~f=([%p pat]) => [%e mapper.expr(mapper, continuation)])],
129-
({txt: "ocaml.explanation", loc}, PStr([
130-
Ast_helper.Str.eval(Ast_helper.Exp.constant(Pconst_string(explanation, None)))
131-
]))
132-
)
120+
switch (txt) {
121+
| "opt" =>
122+
[%expr [%e [%expr switch [%e mapper.expr(mapper, expr)] {
123+
| None => None
124+
| Some([%p pat]) => [%e mapper.expr(mapper, continuation)]
125+
}]]]
126+
| "opt_consume" =>
127+
[%expr [%e [%expr switch [%e mapper.expr(mapper, expr)] {
128+
| None => ()
129+
| Some([%p pat]) => [%e mapper.expr(mapper, continuation)]
130+
}]]]
131+
| "try" =>
132+
[%expr [%e [%expr switch [%e mapper.expr(mapper, expr)] {
133+
| Error(e) => Error(e)
134+
| Ok([%p pat]) => [%e mapper.expr(mapper, continuation)]
135+
}]]]
136+
| "try_wrap" =>
137+
[%expr [%e [%expr switch [%e mapper.expr(mapper, expr)] {
138+
| Error(e) => Error(e)
139+
| Ok([%p pat]) => Ok([%e mapper.expr(mapper, continuation)])
140+
}]]]
141+
| _ => assert(false)
142+
};
133143
}
134144
| _ => Ast_mapper.default_mapper.expr(mapper, expr)
135145
}

src/rescript-editor-support/BuildSystem.re

+5-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ let getBsPlatformDir = rootPath => {
3030
let getCompiledBase = root => {
3131
Files.ifExists(root /+ "lib" /+ "bs");
3232
};
33-
let getStdlib = base => {
34-
let%try_wrap bsPlatformDir = getBsPlatformDir(base);
35-
bsPlatformDir /+ "lib" /+ "ocaml";
36-
};
33+
let getStdlib = base =>
34+
switch (getBsPlatformDir(base)) {
35+
| Error(e) => Error(e)
36+
| Ok(bsPlatformDir) => Ok(bsPlatformDir /+ "lib" /+ "ocaml")
37+
};

src/rescript-editor-support/FindFiles.re

+38-32
Original file line numberDiff line numberDiff line change
@@ -299,36 +299,39 @@ let findDependencyFiles = (~debug, base, config) => {
299299
let namespace = getNamespace(inner);
300300
let directories =
301301
getSourceDirectories(~includeDev=false, loc, inner);
302-
let%opt compiledBase = BuildSystem.getCompiledBase(loc);
303302
/* |! "No compiled base found"; */
304-
if (debug) {
305-
Log.log("Compiled base: " ++ compiledBase);
303+
switch (BuildSystem.getCompiledBase(loc)) {
304+
| None => None
305+
| Some(compiledBase) =>
306+
if (debug) {
307+
Log.log("Compiled base: " ++ compiledBase);
308+
};
309+
let compiledDirectories =
310+
directories |> List.map(Files.fileConcat(compiledBase));
311+
let compiledDirectories =
312+
namespace == None
313+
? compiledDirectories
314+
: [compiledBase, ...compiledDirectories];
315+
let files =
316+
findProjectFiles(
317+
~debug,
318+
namespace,
319+
loc,
320+
directories,
321+
compiledBase,
322+
);
323+
/* let files =
324+
switch (namespace) {
325+
| None =>
326+
files
327+
| Some(namespace) =>
328+
files
329+
|> List.map(((name, paths)) =>
330+
(namespace ++ "-" ++ name, paths)
331+
)
332+
}; */
333+
Some((compiledDirectories, files));
306334
};
307-
let compiledDirectories =
308-
directories |> List.map(Files.fileConcat(compiledBase));
309-
let compiledDirectories =
310-
namespace == None
311-
? compiledDirectories
312-
: [compiledBase, ...compiledDirectories];
313-
let files =
314-
findProjectFiles(
315-
~debug,
316-
namespace,
317-
loc,
318-
directories,
319-
compiledBase,
320-
);
321-
/* let files =
322-
switch (namespace) {
323-
| None =>
324-
files
325-
| Some(namespace) =>
326-
files
327-
|> List.map(((name, paths)) =>
328-
(namespace ++ "-" ++ name, paths)
329-
)
330-
}; */
331-
Some((compiledDirectories, files));
332335
| None => None
333336
};
334337
}
@@ -343,8 +346,11 @@ let findDependencyFiles = (~debug, base, config) => {
343346
});
344347
let (directories, files) = List.split(depFiles);
345348
let files = List.concat(files);
346-
let%try stdlibDirectory = BuildSystem.getStdlib(base);
347-
let directories = [stdlibDirectory, ...List.concat(directories)];
348-
let results = files @ collectFiles(stdlibDirectory);
349-
Ok((directories, results));
349+
switch (BuildSystem.getStdlib(base)) {
350+
| Error(e) => Error(e)
351+
| Ok(stdlibDirectory) =>
352+
let directories = [stdlibDirectory, ...List.concat(directories)];
353+
let results = files @ collectFiles(stdlibDirectory);
354+
Ok((directories, results));
355+
};
350356
};

0 commit comments

Comments
 (0)