diff --git a/CHANGES.md b/CHANGES.md index 5570328a49..26689bc82a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ * Compiler: fix global flow analysis (#1494) * Compiler: fix js parser/printer wrt async functions (#1515) * Compiler: fix free variables pass wrt parameters' default value (#1521) +* Compiler: fix free variables for classes # 5.4.0 (2023-07-06) - Lille diff --git a/compiler/lib/js_traverse.ml b/compiler/lib/js_traverse.ml index 8553a4f581..32413be9cc 100644 --- a/compiler/lib/js_traverse.ml +++ b/compiler/lib/js_traverse.ml @@ -842,6 +842,15 @@ class free = tbody#record_block (Params params); m#merge_info tbody; EFun (ident, (k, params, body, nid)) + | EClass (ident_o, cl_decl) -> + let ident_o = + Option.map + ~f:(fun id -> + m#def_var id; + m#ident id) + ident_o + in + EClass (ident_o, m#class_decl cl_decl) | _ -> super#expression x method record_block _ = () @@ -873,6 +882,9 @@ class free = m#def_var id; m#merge_info tbody; Function_declaration (id, (k, params, body, nid)) + | Class_declaration (id, cl_decl) -> + m#def_var id; + Class_declaration (id, m#class_decl cl_decl) | Block b -> Block (m#block b) | Try_statement (b, w, f) -> let same_level = level in @@ -946,7 +958,12 @@ class rename_variable = inherit iter as super - method expression _ = () + method expression e = + match e with + | EClass (ido, _) -> + Option.iter ido ~f:decl_var; + super#expression e + | _ -> super#expression e method fun_decl _ = () @@ -956,6 +973,9 @@ class rename_variable = decl_var id; self#fun_decl fd | Lexical_block, Function_declaration (_, fd) -> self#fun_decl fd + | (Fun_block _ | Lexical_block), Class_declaration (id, _) -> + decl_var id; + super#statement x | (Fun_block _ | Lexical_block), _ -> super#statement x method variable_declaration k l = diff --git a/compiler/tests-compiler/minify.ml b/compiler/tests-compiler/minify.ml index ada53d028f..6b2f6f8b8d 100644 --- a/compiler/tests-compiler/minify.ml +++ b/compiler/tests-compiler/minify.ml @@ -304,8 +304,8 @@ let%expect_test _ = let js_prog = {| (function () { - class f { - f() { + class longname { + longname() { const y = 2; return v } @@ -327,8 +327,8 @@ let%expect_test _ = $ cat "test.js" 1: 2: (function () { - 3: class f { - 4: f() { + 3: class longname { + 4: longname() { 5: const y = 2; 6: return v 7: } @@ -338,9 +338,9 @@ let%expect_test _ = 11: $ cat "test.min.js" 1: (function(){class - 2: f{f(){const + 2: a{longname(){const 3: a=2;return v}}const - 4: a=y}()); |}]) + 4: b=y}()); |}]) let%expect_test _ = with_temp_dir ~f:(fun () ->