Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 8a7a1bd

Browse files
committed
add -ppx cmd line arg
1 parent a3f0b44 commit 8a7a1bd

File tree

3 files changed

+30
-33
lines changed

3 files changed

+30
-33
lines changed

src/res_cli.ml

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ module ResClflags: sig
165165
val files: string list ref
166166
val interface: bool ref
167167
val report: string ref
168+
val ppx: string ref
168169

169170
val parse: unit -> unit
170171
end = struct
@@ -178,6 +179,7 @@ end = struct
178179
let origin = ref ""
179180
let interface = ref false
180181
let report = ref "pretty"
182+
let ppx = ref "none"
181183

182184
let usage = "Usage:\n rescript <options> <file>\n\n" ^
183185
"Examples:\n" ^
@@ -192,6 +194,7 @@ end = struct
192194
("-print", Arg.String (fun txt -> print := txt), "Print either binary or ns. Default: ns");
193195
("-width", Arg.Int (fun w -> width := w), "Specify the line length for the printer (formatter)");
194196
("-interface", Arg.Unit (fun () -> interface := true), "Parse as interface");
197+
("-ppx", Arg.String (fun txt -> ppx := txt), "Apply a specific built-in ppx before parsing, none or jsx. Default: none");
195198
(* ("-report", Arg.String (fun txt -> report := txt), "Stylize errors and messages using color and context. Accepts `Pretty` and `Plain`. Default `Plain`") *)
196199
]
197200

@@ -201,18 +204,17 @@ end
201204
module CliArgProcessor = struct
202205
type backend = Parser: ('diagnostics) Res_driver.parsingEngine -> backend [@@unboxed]
203206

204-
let processFile ~isInterface ~width ~recover ~origin ~target ~report:_ filename =
207+
let processFile ~isInterface ~width ~recover ~origin ~target ~report:_ ~ppx filename =
205208
try
206209
let len = String.length filename in
207210
let processInterface =
208211
isInterface || len > 0 && (String.get [@doesNotRaise]) filename (len - 1) = 'i'
209212
in
210-
let parsingEngine, react =
213+
let parsingEngine =
211214
match origin with
212-
| "reasonBinary" -> Parser Res_driver_reason_binary.parsingEngine, false
213-
| "ml" | "ocaml" -> Parser Res_driver_ml_parser.parsingEngine, false
214-
| "reactJsx" -> Parser Res_driver.parsingEngine, true
215-
| _ -> Parser Res_driver.parsingEngine, false
215+
| "reasonBinary" -> Parser Res_driver_reason_binary.parsingEngine
216+
| "ml" | "ocaml" -> Parser Res_driver_ml_parser.parsingEngine
217+
| _ -> Parser Res_driver.parsingEngine
216218
in
217219
let printEngine =
218220
match target with
@@ -228,6 +230,11 @@ module CliArgProcessor = struct
228230
| _ -> false
229231
in
230232

233+
let ppx = match ppx with
234+
| "jsx" -> `Jsx
235+
| _ -> `None
236+
in
237+
231238
let Parser backend = parsingEngine in
232239
(* This is the whole purpose of the Color module above *)
233240
Color.setup None;
@@ -244,8 +251,9 @@ module CliArgProcessor = struct
244251
else exit 1
245252
end
246253
else
247-
let parsetree =
248-
if react then Reactjs_jsx_ppx.rewrite_signature parseResult.parsetree else parseResult.parsetree
254+
let parsetree = match ppx with
255+
| `Jsx -> Reactjs_jsx_ppx.rewrite_signature parseResult.parsetree
256+
| `None -> parseResult.parsetree
249257
in
250258
printEngine.printInterface
251259
~width ~filename ~comments:parseResult.comments parsetree
@@ -262,8 +270,9 @@ module CliArgProcessor = struct
262270
else exit 1
263271
end
264272
else
265-
let parsetree =
266-
if react then Reactjs_jsx_ppx.rewrite_implementation parseResult.parsetree else parseResult.parsetree
273+
let parsetree = match ppx with
274+
| `Jsx -> Reactjs_jsx_ppx.rewrite_implementation parseResult.parsetree
275+
| `None -> parseResult.parsetree
267276
in
268277
printEngine.printImplementation
269278
~width ~filename ~comments:parseResult.comments parsetree
@@ -289,6 +298,7 @@ let [@raises Invalid_argument, exit] () =
289298
~target:!ResClflags.print
290299
~origin:!ResClflags.origin
291300
~report:!ResClflags.report
301+
~ppx:!ResClflags.ppx
292302
""
293303
| files ->
294304
List.iter (fun filename ->
@@ -299,6 +309,7 @@ let [@raises Invalid_argument, exit] () =
299309
~target:!ResClflags.print
300310
~origin:!ResClflags.origin
301311
~report:!ResClflags.report
312+
~ppx:!ResClflags.ppx
302313
filename
303314
) files
304315
end

tests/printer/reactJsx/render.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
runPrinter(__dirname, false, false)
1+
runPrinter(__dirname, "jsx")

tests/runner.js

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ function classifyLang(filename) {
2929
return "ocaml";
3030
}
3131
}
32-
if (filename.length > 10) {
33-
let suffix = filename.substring(filename.length - 10);
34-
if (suffix === ".react.res" || suffix === "react.resi") {
35-
return "reactJsx";
36-
}
37-
}
3832
return "rescript";
3933
}
4034

@@ -93,10 +87,10 @@ function parseReasonFileToSexp(filename) {
9387
.stdout.toString();
9488
}
9589

96-
function parseNapkinFileToSexp(filename, reactJsx) {
90+
function parseNapkinFileToSexp(filename) {
9791
let { stdout } = cp.spawnSync(parser, [
9892
"-parse",
99-
reactJsx ? "reactJsx" : "res",
93+
"res",
10094
"-print",
10195
"sexp",
10296
filename,
@@ -114,11 +108,8 @@ function parseFileToSexp(filename) {
114108
case "ocaml":
115109
return parseOcamlFileToSexp(filename);
116110

117-
case "reactJsx":
118-
return parseNapkinFileToSexp(filename, true);
119-
120111
default:
121-
return parseNapkinFileToSexp(filename, false);
112+
return parseNapkinFileToSexp(filename);
122113
}
123114
}
124115

@@ -160,7 +151,7 @@ function parseNapkinStdinToNapkin(src, isInterface, width = 100) {
160151
.stdout.toString("utf8");
161152
}
162153

163-
function printFile(filename) {
154+
function printFile(filename, ppx) {
164155
let parserSrc;
165156
switch (classifyLang(filename)) {
166157
case "ocaml":
@@ -174,20 +165,15 @@ function printFile(filename) {
174165
status: 0,
175166
errorOutput: ""
176167
};
177-
break;
178-
179-
case "reactJsx":
180-
parserSrc = "reactJsx";
181-
break;
182-
168+
183169
case "rescript":
184170
default:
185171
parserSrc = "res";
186172
break;
187173
}
188174

189175
let intf = isInterface(filename);
190-
let args = ["-parse", parserSrc, "-print", "res", "-width", "80"];
176+
let args = ["-parse", parserSrc, "-print", "res", "-width", "80", "-ppx", ppx];
191177

192178
if (intf) {
193179
args.push("-interface");
@@ -216,7 +202,7 @@ let makeReproducibleFilename = (txt) => {
216202
})
217203
};
218204

219-
global.runPrinter = (dirname) => {
205+
global.runPrinter = (dirname, ppx = "none") => {
220206
fs.readdirSync(dirname).forEach((base) => {
221207
let filename = path.join(dirname, base);
222208

@@ -232,7 +218,7 @@ global.runPrinter = (dirname) => {
232218
}
233219

234220
test(base, () => {
235-
let {result, errorOutput, status} = printFile(filename);
221+
let {result, errorOutput, status} = printFile(filename, ppx);
236222
if (status > 0) {
237223
let msg = `Test from file: ${filename} failed with error output:
238224

0 commit comments

Comments
 (0)