Skip to content

Commit 102aa42

Browse files
committed
Accept a directory as the single command line argument.
1 parent 26a242e commit 102aa42

File tree

6 files changed

+56
-34
lines changed

6 files changed

+56
-34
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ _esyinstall
88
_release
99
*.byte
1010
*.native
11-
esy-reason-project.install
11+
bs-react-intl-extractor.install
1212
.DS_Store

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"reason.format.width": 120,
33
"editor.rulers": [120],
4-
"editor.tabSize": 2
4+
"editor.tabSize": 2,
5+
"editor.renderIndentGuides": false
56
}

bin/Extract.re

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,56 @@
11
open Migrate_parsetree;
22

3-
open Ast_mapper;
4-
5-
open Parsetree;
6-
73
open Lib;
84

95
let messages = ref([]);
106

11-
let mapper = ExtractionMapper.getMapper(message => messages := [message, ...messages^]);
7+
let iterator = ExtractionIterator.getIterator(message => messages := [message, ...messages^]);
8+
9+
let extractMessages = ast => iterator.structure(iterator, Obj.magic(ast));
10+
11+
let readMessagesFromChannel = channel =>
12+
switch (Ast_io.from_channel(channel)) {
13+
| Result.Ok((_, Ast_io.Impl((module Version), ast))) =>
14+
module Convert = Convert(Version, OCaml_406);
15+
let converted = Obj.magic(Convert.copy_structure(ast));
16+
extractMessages(converted);
17+
| Result.Ok((_, Ast_io.Intf(_, _))) => Printf.eprintf("Interface AST not supported, only implementation AST\n")
18+
| Result.Error(Not_a_binary_ast(_)) => Printf.eprintf("Error: input is not a binary AST\n")
19+
| Result.Error(Unknown_version(v)) => Printf.eprintf("Error: unknown AST version: %s\n", v)
20+
};
21+
22+
let processFile = filename => {
23+
let channel = Unix.open_process_in("refmt -p binary " ++ filename);
24+
readMessagesFromChannel(channel);
25+
};
26+
27+
let rec processDirectory = dir =>
28+
Sys.readdir(dir)
29+
|> Array.iter(filename => {
30+
let path = Filename.concat(dir, filename);
31+
if (Sys.is_directory(path)) {
32+
processDirectory(path);
33+
} else if (Filename.extension(filename) == ".re") {
34+
processFile(path);
35+
};
36+
});
1237

13-
let extractMessages = ast => {
14-
mapper.structure(mapper, Obj.magic(ast)) |> ignore;
38+
let outputJson = () => {
1539
let sortedJsonObjects = messages^ |> List.sort(Message.compare) |> List.map(Message.toJson);
1640
Yojson.Basic.pretty_to_channel(stdout, `List(sortedJsonObjects));
1741
print_newline();
1842
};
1943

20-
switch (Ast_io.from_channel(stdin)) {
21-
| Result.Ok((_, Ast_io.Impl((module Version), ast))) =>
22-
module Convert = Convert(Version, OCaml_406);
23-
let converted = Obj.magic(Convert.copy_structure(ast));
24-
extractMessages(converted);
25-
| Result.Ok((_, Ast_io.Intf(_, _))) => print_endline("Intf AST!")
26-
| Result.Error(Not_a_binary_ast(_)) => print_endline("Error: not a binary AST: ")
27-
| Result.Error(Unknown_version(v)) => print_endline("Error: unknown version: " ++ v)
44+
switch (Array.to_list(Sys.argv)) {
45+
| [_exe, dir] =>
46+
if (! Sys.is_directory(dir)) {
47+
Printf.eprintf("Not a directory: %s\n", dir);
48+
exit(2);
49+
};
50+
processDirectory(dir);
51+
outputJson();
52+
| [exe, ..._params] =>
53+
Printf.eprintf("Usage: %s <directory>\n", exe);
54+
exit(1);
55+
| _ => () /* cannot happen */
2856
};
File renamed without changes.

lib/ExtractionMapper.re renamed to lib/ExtractionIterator.re

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
1-
open Ast_mapper;
1+
open Ast_iterator;
22

33
open Parsetree;
44

55
let getLabelString = (key, labels) =>
6-
try (
7-
{
8-
let value = labels |> List.assoc(Asttypes.Labelled(key));
9-
switch (value) {
10-
| {pexp_desc: Pexp_constant(Pconst_string(text, _))} => Some(text)
11-
| _ => None
12-
};
13-
}
14-
) {
15-
| Not_found => None
6+
switch (labels |> List.assoc_opt(Asttypes.Labelled(key))) {
7+
| Some({pexp_desc: Pexp_constant(Pconst_string(text, _))}) => Some(text)
8+
| _ => None
169
};
1710

1811
let getMessage = expr =>
@@ -36,13 +29,13 @@ let getMessage = expr =>
3629
| _ => None
3730
};
3831

39-
let getMapper = callback => {
40-
...default_mapper,
41-
expr: (mapper, expr) => {
32+
let getIterator = callback => {
33+
...default_iterator,
34+
expr: (iterator, expr) => {
4235
switch (getMessage(expr)) {
4336
| Some(message) => callback(message)
4437
| None => ()
4538
};
46-
default_mapper.expr(mapper, expr);
39+
default_iterator.expr(iterator, expr);
4740
},
4841
};

lib/jbuild

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
(library
44
((name lib)
55
(flags (-w -40 -w +26))
6-
(public_name esy-reason-project)
7-
(libraries (ocaml-migrate-parsetree yojson))))
6+
(public_name bs-react-intl-extractor)
7+
(libraries (ocaml-migrate-parsetree yojson unix))))

0 commit comments

Comments
 (0)