Ver código fonte

mark enums with @:directlyUsed too, support @:jsRequire on enums

Dan Korostelev 10 anos atrás
pai
commit
0e999e970b
4 arquivos alterados com 18 adições e 11 exclusões
  1. 2 2
      common.ml
  2. 6 0
      dce.ml
  3. 9 8
      genjs.ml
  4. 1 1
      genpy.ml

+ 2 - 2
common.ml

@@ -897,8 +897,8 @@ let has_dce com =
 	If we had dce filter always running (even with dce=no), we would have types marked with @:directlyUsed
 	and we wouldn't need to generate unnecessary imports in dce=no, but that's good enough for now.
 *)
-let is_directly_used_class com c =
-	not (has_dce com) || Ast.Meta.has Ast.Meta.DirectlyUsed c.cl_meta
+let is_directly_used com meta =
+	not (has_dce com) || Ast.Meta.has Ast.Meta.DirectlyUsed meta
 
 let rec has_feature com f =
 	try

+ 6 - 0
dce.ml

@@ -287,10 +287,16 @@ and mark_directly_used_class c =
 	if not (Meta.has Meta.DirectlyUsed c.cl_meta) then
 		c.cl_meta <- (Meta.DirectlyUsed,[],c.cl_pos) :: c.cl_meta
 
+and mark_directly_used_enum e =
+	if not (Meta.has Meta.DirectlyUsed e.e_meta) then
+		e.e_meta <- (Meta.DirectlyUsed,[],e.e_pos) :: e.e_meta
+
 and mark_directly_used_mt mt =
 	match mt with
 	| TClassDecl c ->
 		mark_directly_used_class c
+	| TEnumDecl e ->
+		mark_directly_used_enum e
 	| _ ->
 		()
 

+ 9 - 8
genjs.ml

@@ -1131,14 +1131,14 @@ let generate_static ctx (c,f,e) =
 	gen_value ctx e;
 	newline ctx
 
-let generate_require ctx c =
-	let _, args, mp = Meta.get Meta.JsRequire c.cl_meta in
-	let p = (s_path ctx c.cl_path) in
+let generate_require ctx path meta =
+	let _, args, mp = Meta.get Meta.JsRequire meta in
+	let p = (s_path ctx path) in
 
 	if ctx.js_flatten then
 		spr ctx "var "
 	else
-		generate_package_create ctx c.cl_path;
+		generate_package_create ctx path;
 
 	(match args with
 	| [(EConst(String(module_name)),_)] ->
@@ -1164,14 +1164,15 @@ let generate_type ctx = function
 			()
 		else if not c.cl_extern then
 			generate_class ctx c
-		else if Meta.has Meta.JsRequire c.cl_meta && is_directly_used_class ctx.com c then
-			generate_require ctx c
+		else if Meta.has Meta.JsRequire c.cl_meta && is_directly_used ctx.com c.cl_meta then
+			generate_require ctx c.cl_path c.cl_meta
 		else if not ctx.js_flatten && Meta.has Meta.InitPackage c.cl_meta then
 			(match c.cl_path with
 			| ([],_) -> ()
 			| _ -> generate_package_create ctx c.cl_path)
 	| TEnumDecl e when e.e_extern ->
-		()
+		if Meta.has Meta.JsRequire e.e_meta && is_directly_used ctx.com e.e_meta then
+			generate_require ctx e.e_path e.e_meta
 	| TEnumDecl e -> generate_enum ctx e
 	| TTypeDecl _ | TAbstractDecl _ -> ()
 
@@ -1213,7 +1214,7 @@ let alloc_ctx com =
 		match t with
 		| TClassDecl ({ cl_extern = true } as c) when not (Meta.has Meta.JsRequire c.cl_meta)
 			-> dot_path p
-		| TEnumDecl { e_extern = true }
+		| TEnumDecl ({ e_extern = true } as e) when not (Meta.has Meta.JsRequire e.e_meta)
 			-> dot_path p
 		| _ -> s_path ctx p);
 	ctx

+ 1 - 1
genpy.ml

@@ -1920,7 +1920,7 @@ module Generator = struct
 	let gen_import ctx c =
 		gen_pre_code_meta ctx c.cl_meta;
 
-		if Meta.has Meta.PythonImport c.cl_meta && is_directly_used_class ctx.com c then begin
+		if Meta.has Meta.PythonImport c.cl_meta && is_directly_used ctx.com c.cl_meta then begin
 			let _, args, mp = Meta.get Meta.PythonImport c.cl_meta in
 
 			let class_name = match c.cl_path with