Skip to content

Commit b6124fe

Browse files
committed
Extract messages from ReactIntl.defineMessages, too.
1 parent b1b0fc9 commit b6124fe

File tree

3 files changed

+102
-30
lines changed

3 files changed

+102
-30
lines changed

bin/Extract.re

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ open Lib;
44

55
let messages = ref([]);
66

7-
let iterator = ExtractionIterator.getIterator(message => messages := [message, ...messages^]);
7+
let iterator = ExtractionIterator.getIterator(message => (messages := [message, ...messages^]) |> ignore);
88

99
let extractMessages = ast => iterator.structure(iterator, Obj.magic(ast));
1010

lib/ExtractionIterator.re

Lines changed: 89 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,100 @@
11
open Ast_iterator;
22

3+
open Asttypes;
4+
35
open Parsetree;
46

5-
let getLabelString = (key, labels) =>
6-
switch (labels |> List.assoc_opt(Asttypes.Labelled(key))) {
7-
| Some({pexp_desc: Pexp_constant(Pconst_string(text, _))}) => Some(text)
8-
| _ => None
9-
};
10-
11-
let getMessage = expr =>
12-
switch (expr) {
13-
| {
14-
pexp_desc:
15-
Pexp_apply(
16-
{
17-
pexp_desc: Pexp_ident({txt: Ldot(Ldot(Lident("ReactIntl"), "FormattedMessage"), "createElement"), loc}),
18-
},
19-
labels,
20-
),
21-
} =>
22-
let id = labels |> getLabelString("id");
23-
let defaultMessage = labels |> getLabelString("defaultMessage");
24-
let description = labels |> getLabelString("description");
25-
switch (id, defaultMessage) {
26-
| (Some(id), Some(defaultMessage)) => Some({Message.id, defaultMessage, description})
27-
| _ => None
28-
};
29-
| _ => None
30-
};
7+
open Longident;
8+
9+
module StringMap = Map.Make(String);
10+
11+
let extractMessageFromLabels = labels => {
12+
let map = ref(StringMap.empty);
13+
labels
14+
|> List.iter(assoc =>
15+
switch (assoc) {
16+
| (Asttypes.Labelled(key), {pexp_desc: Pexp_constant(Pconst_string(value, _))}) =>
17+
map := map^ |> StringMap.add(key, value)
18+
| _ => ()
19+
}
20+
);
21+
Message.fromStringMap(map^);
22+
};
23+
24+
let extractMessageFromRecord = fields => {
25+
let map = ref(StringMap.empty);
26+
fields
27+
|> List.iter(field =>
28+
switch (field) {
29+
| ({txt: Lident(key)}, {pexp_desc: Pexp_constant(Pconst_string(value, _))}) =>
30+
map := map^ |> StringMap.add(key, value)
31+
| _ => ()
32+
}
33+
);
34+
Message.fromStringMap(map^);
35+
};
36+
37+
let extractMessagesFromRecords = (callback, records) =>
38+
records
39+
|> List.iter(field =>
40+
switch (field) {
41+
| (
42+
{txt: Lident(s)},
43+
{
44+
pexp_desc:
45+
Pexp_extension((
46+
{txt: "bs.obj"},
47+
PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_record(fields, _)}, _), pstr_loc: _}]),
48+
)),
49+
},
50+
) =>
51+
switch (extractMessageFromRecord(fields)) {
52+
| Some(message) => callback(message)
53+
| _ => ()
54+
}
55+
| _ => ()
56+
}
57+
);
3158

3259
let getIterator = callback => {
3360
...default_iterator,
3461
expr: (iterator, expr) => {
35-
switch (getMessage(expr)) {
36-
| Some(message) => callback(message)
37-
| None => ()
62+
switch (expr) {
63+
/* Match ReactIntl.FormattedMessage.createElement */
64+
| {
65+
pexp_desc:
66+
Pexp_apply(
67+
{
68+
pexp_desc: Pexp_ident({txt: Ldot(Ldot(Lident("ReactIntl"), "FormattedMessage"), "createElement"), _}),
69+
},
70+
labels,
71+
),
72+
} =>
73+
switch (extractMessageFromLabels(labels)) {
74+
| Some(message) => callback(message)
75+
| _ => ()
76+
}
77+
/* Match ReactIntl.defineMessages */
78+
| {
79+
pexp_desc:
80+
Pexp_apply(
81+
{pexp_desc: Pexp_ident({txt: Ldot(Lident("ReactIntl"), "defineMessages"), _})},
82+
[
83+
(
84+
Asttypes.Nolabel,
85+
{
86+
pexp_desc:
87+
Pexp_extension((
88+
{txt: "bs.obj"},
89+
PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_record(fields, _)}, _), pstr_loc: _}]),
90+
)),
91+
},
92+
),
93+
],
94+
),
95+
} =>
96+
extractMessagesFromRecords(callback, fields)
97+
| _ => ()
3898
};
3999
default_iterator.expr(iterator, expr);
40100
},

lib/Message.re

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
module StringMap = Map.Make(String);
2+
13
type t = {
24
id: string,
35
defaultMessage: string,
@@ -6,6 +8,16 @@ type t = {
68

79
let compare = (a, b) => compare(a.id, b.id);
810

11+
let fromStringMap = map => {
12+
let id = map |> StringMap.find_opt("id");
13+
let defaultMessage = map |> StringMap.find_opt("defaultMessage");
14+
let description = map |> StringMap.find_opt("description");
15+
switch (id, defaultMessage) {
16+
| (Some(id), Some(defaultMessage)) => Some({id, defaultMessage, description})
17+
| _ => None
18+
};
19+
};
20+
921
let toJson = ({id, defaultMessage, description}) =>
1022
switch (description) {
1123
| Some(description) =>

0 commit comments

Comments
 (0)