diff --git a/src/codegen/codegen.ml b/src/codegen/codegen.ml index a556377b260..00ee5968e28 100644 --- a/src/codegen/codegen.ml +++ b/src/codegen/codegen.ml @@ -315,7 +315,7 @@ module Dump = struct print "\n"); print "}"; | Type.TEnumDecl e -> - print "%s%s%senum %s%s {\n" (s_metas e.e_meta "") (if e.e_private then "private " else "") (if e.e_extern then "extern " else "") (s_type_path path) (params e.e_params); + print "%s%s%senum %s%s {\n" (s_metas e.e_meta "") (if e.e_private then "private " else "") (if has_enum_flag e EnExtern then "extern " else "") (s_type_path path) (params e.e_params); List.iter (fun n -> let f = PMap.find n e.e_constrs in print "\t%s%s;\n" f.ef_name ( diff --git a/src/compiler/hxb/hxbReader.ml b/src/compiler/hxb/hxbReader.ml index b6bf339e791..dd6f91ad111 100644 --- a/src/compiler/hxb/hxbReader.ml +++ b/src/compiler/hxb/hxbReader.ml @@ -1573,7 +1573,7 @@ class hxb_reader method read_enum (e : tenum) = self#read_common_module_type (Obj.magic e); - e.e_extern <- self#read_bool; + e.e_flags <- read_uleb128 ch; e.e_names <- self#read_list (fun () -> self#read_string); method read_typedef (td : tdef) = diff --git a/src/compiler/hxb/hxbWriter.ml b/src/compiler/hxb/hxbWriter.ml index 21ec09e0ac8..8343fd2341b 100644 --- a/src/compiler/hxb/hxbWriter.ml +++ b/src/compiler/hxb/hxbWriter.ml @@ -1950,7 +1950,7 @@ module HxbWriter = struct let write_enum writer (e : tenum) = select_type writer e.e_path; write_common_module_type writer (Obj.magic e); - Chunk.write_bool writer.chunk e.e_extern; + Chunk.write_uleb128 writer.chunk e.e_flags; Chunk.write_list writer.chunk e.e_names (Chunk.write_string writer.chunk) let write_typedef writer (td : tdef) = diff --git a/src/core/display/completionItem.ml b/src/core/display/completionItem.ml index f3f4b804bb5..6501b672d74 100644 --- a/src/core/display/completionItem.ml +++ b/src/core/display/completionItem.ml @@ -203,7 +203,7 @@ module CompletionModuleType = struct | TClassDecl c -> (has_class_flag c CExtern),has_class_flag c CFinal,has_class_flag c CAbstract,(if (has_class_flag c CInterface) then Interface else Class),ctor c | TEnumDecl en -> - en.e_extern,false,false,Enum,No + (has_enum_flag en EnExtern),false,false,Enum,No | TTypeDecl td -> let kind,ctor = match follow td.t_type with | TAnon _ -> Struct,No diff --git a/src/core/json/genjson.ml b/src/core/json/genjson.ml index 72b3d4fa951..6f5838c7c1c 100644 --- a/src/core/json/genjson.ml +++ b/src/core/json/genjson.ml @@ -637,7 +637,7 @@ let generate_enum ctx e = in [ "constructors",generate_enum_constructors (); - "isExtern",jbool e.e_extern; + "isExtern",jbool (has_enum_flag e EnExtern) ] let generate_typedef ctx td = diff --git a/src/core/tFunctions.ml b/src/core/tFunctions.ml index f01e7ff9c03..1c9e4fc98d5 100644 --- a/src/core/tFunctions.ml +++ b/src/core/tFunctions.ml @@ -44,6 +44,18 @@ let remove_class_field_flag cf (flag : flag_tclass_field) = let has_class_field_flag cf (flag : flag_tclass_field) = has_flag cf.cf_flags (int_of_class_field_flag flag) +let int_of_enum_flag (flag : flag_tenum) = + Obj.magic flag + +let add_enum_flag e (flag : flag_tenum) = + e.e_flags <- set_flag e.e_flags (int_of_enum_flag flag) + +let remove_enum_flag e (flag : flag_tenum) = + e.e_flags <- unset_flag e.e_flags (int_of_enum_flag flag) + +let has_enum_flag e (flag : flag_tenum) = + has_flag e.e_flags (int_of_enum_flag flag) + let int_of_var_flag (flag : flag_tvar) = Obj.magic flag @@ -247,7 +259,7 @@ let null_enum = { e_using = []; e_restore = (fun () -> ()); e_type = t_dynamic; - e_extern = false; + e_flags = 0; e_constrs = PMap.empty; e_names = []; } diff --git a/src/core/tOther.ml b/src/core/tOther.ml index 13c5d1e8fcf..20be78d1968 100644 --- a/src/core/tOther.ml +++ b/src/core/tOther.ml @@ -274,25 +274,7 @@ let mk_enum m path pos name_pos = e_using = []; e_restore = (fun () -> ()); e_private = false; - e_extern = false; - e_constrs = PMap.empty; - e_names = []; - e_type = mk_mono(); - } - -let mk_enum m path pos name_pos = - { - e_path = path; - e_module = m; - e_pos = pos; - e_name_pos = name_pos; - e_doc = None; - e_meta = []; - e_params = []; - e_using = []; - e_restore = (fun () -> ()); - e_private = false; - e_extern = false; + e_flags = 0; e_constrs = PMap.empty; e_names = []; e_type = mk_mono(); diff --git a/src/core/tPrinting.ml b/src/core/tPrinting.ml index b9083a51e27..476509f9280 100644 --- a/src/core/tPrinting.ml +++ b/src/core/tPrinting.ml @@ -550,7 +550,7 @@ module Printer = struct "e_meta",s_metadata en.e_meta; "e_params",s_type_params (tabs ^ "\t") en.e_params; "e_type",s_type_kind en.e_type; - "e_extern",string_of_bool en.e_extern; + "e_extern",string_of_bool (has_enum_flag en EnExtern); "e_constrs",s_list "\n\t" (s_tenum_field (tabs ^ "\t")) (PMap.fold (fun ef acc -> ef :: acc) en.e_constrs []); "e_names",String.concat ", " en.e_names ] diff --git a/src/core/tType.ml b/src/core/tType.ml index 28723f09615..ab710bfa3d6 100644 --- a/src/core/tType.ml +++ b/src/core/tType.ml @@ -334,7 +334,7 @@ and tenum = { mutable e_restore : unit -> unit; (* do not insert any fields above *) mutable e_type : t; - mutable e_extern : bool; + mutable e_flags : int; mutable e_constrs : (string , tenum_field) PMap.t; mutable e_names : string list; } @@ -483,6 +483,7 @@ type flag_tclass = | CAbstract | CFunctionalInterface | CUsed (* Marker for DCE *) + | CExcluded (* Marker for exclude macro, turned into CExtern during filters *) type flag_tclass_field = | CfPublic @@ -506,6 +507,10 @@ let flag_tclass_field_names = [ "CfPublic";"CfStatic";"CfExtern";"CfFinal";"CfModifiesThis";"CfOverride";"CfAbstract";"CfOverload";"CfImpl";"CfEnum";"CfGeneric";"CfDefault";"CfPostProcessed";"CfUsed";"CfMaybeUsed" ] +type flag_tenum = + | EnExtern + | EnExcluded (* Marker for exclude macro, turned into EnExtern during filters *) + type flag_tvar = | VCaptured | VFinal diff --git a/src/filters/filters.ml b/src/filters/filters.ml index c63e76c84de..b8efae167a4 100644 --- a/src/filters/filters.ml +++ b/src/filters/filters.ml @@ -286,6 +286,16 @@ let check_abstract_as_value e = (* PASS 2 begin *) +(* Applies exclude macro (which turns types into externs) *) + +let apply_macro_exclude com t = match t with + | TClassDecl c when has_class_flag c CExcluded -> + add_class_flag c CExtern + | TEnumDecl e when has_enum_flag e EnExcluded -> + add_enum_flag e EnExtern + | _ -> + () + (* Removes extern and macro fields, also checks for Void fields *) let remove_extern_fields com t = match t with @@ -407,7 +417,7 @@ let check_reserved_type_paths com t = in match t with | TClassDecl c when not (has_class_flag c CExtern) -> check c.cl_path c.cl_pos - | TEnumDecl e when not e.e_extern -> check e.e_path e.e_pos + | TEnumDecl e when not (has_enum_flag e EnExtern) -> check e.e_path e.e_pos | _ -> () (* PASS 3 end *) @@ -453,6 +463,7 @@ let destruction tctx detail_times main locals = (* PASS 2: type filters pre-DCE *) List.iter (fun t -> FiltersCommon.remove_generic_base t; + apply_macro_exclude com t; remove_extern_fields com t; (* check @:remove metadata before DCE so it is ignored there (issue #2923) *) check_remove_metadata t; diff --git a/src/generators/gencpp.ml b/src/generators/gencpp.ml index 8c05a8d7408..09cf06bfc91 100644 --- a/src/generators/gencpp.ml +++ b/src/generators/gencpp.ml @@ -717,7 +717,7 @@ let is_extern_class class_def = ;; let is_extern_enum enum_def = - (enum_def.e_extern) || (has_meta_key enum_def.e_meta Meta.Extern) + (has_enum_flag enum_def EnExtern) || (has_meta_key enum_def.e_meta Meta.Extern) ;; let is_native_class class_def = @@ -7080,7 +7080,7 @@ let create_super_dependencies common_ctx = | _ ->() ); List.iter (fun imp -> if not (has_class_flag (fst imp) CExtern) then deps := (fst imp).cl_path :: !deps) (real_non_native_interfaces class_def.cl_implements); Hashtbl.add result class_def.cl_path !deps; - | TEnumDecl enum_def when not enum_def.e_extern -> + | TEnumDecl enum_def when not (has_enum_flag enum_def EnExtern) -> Hashtbl.add result enum_def.e_path []; | _ -> () ); ) common_ctx.types; @@ -8474,14 +8474,14 @@ let generate_cppia ctx = else begin generate_script_class common_ctx script class_def end - | TEnumDecl enum_def when enum_def.e_extern -> () + | TEnumDecl enum_def when has_enum_flag enum_def EnExtern -> () | TEnumDecl enum_def -> let is_internal = is_internal_class enum_def.e_path in if (is_internal) then (if (debug>=4) then print_endline (" internal enum " ^ (join_class_path enum_def.e_path ".") )) else begin let meta = Texpr.build_metadata common_ctx.basic object_def in - if (enum_def.e_extern) then + if (has_enum_flag enum_def EnExtern) then (if (debug>=4) then print_endline ("external enum " ^ (join_class_path enum_def.e_path ".") )); generate_script_enum common_ctx script enum_def meta end @@ -8568,7 +8568,7 @@ let generate_source ctx = if not ((has_class_flag class_def CInterface) && (is_native_gen_class class_def)) then exe_classes := (class_def.cl_path, deps, object_def) :: !exe_classes; end - | TEnumDecl enum_def when enum_def.e_extern -> () + | TEnumDecl enum_def when has_enum_flag enum_def EnExtern -> () | TEnumDecl enum_def -> let name = class_text enum_def.e_path in let is_internal = is_internal_class enum_def.e_path in @@ -8587,7 +8587,7 @@ let generate_source ctx = makeId name 0; let meta = Texpr.build_metadata common_ctx.basic object_def in - if (enum_def.e_extern) then + if (has_enum_flag enum_def EnExtern) then (if (debug>1) then print_endline ("external enum " ^ name )); boot_enums := enum_def.e_path :: !boot_enums; jobs := (fun () -> generate_enum_files ctx enum_def super_deps meta ) :: !jobs; diff --git a/src/generators/genhl.ml b/src/generators/genhl.ml index b1421e20dcf..c5ec0399c62 100644 --- a/src/generators/genhl.ml +++ b/src/generators/genhl.ml @@ -3672,7 +3672,7 @@ let generate_static_init ctx types main = free ctx rc; - | TEnumDecl e when not e.e_extern -> + | TEnumDecl e when not (has_enum_flag e EnExtern) -> let et = enum_class ctx e in let t = enum_type ctx e in diff --git a/src/generators/genjs.ml b/src/generators/genjs.ml index 05eae361308..2a60f6f8093 100644 --- a/src/generators/genjs.ml +++ b/src/generators/genjs.ml @@ -1642,7 +1642,7 @@ let generate_type ctx = function (match c.cl_path with | ([],_) -> () | _ -> generate_package_create ctx c.cl_path) - | TEnumDecl e when e.e_extern -> + | TEnumDecl e when has_enum_flag e EnExtern -> 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 @@ -1694,7 +1694,7 @@ let alloc_ctx com es_version = ctx.type_accessor <- (fun t -> match t with - | TEnumDecl ({ e_extern = true } as e) when not (Meta.has Meta.JsRequire e.e_meta) -> + | TEnumDecl e when (has_enum_flag e EnExtern) && not (Meta.has Meta.JsRequire e.e_meta) -> dot_path e.e_path | TClassDecl c -> let p = get_generated_class_path c in @@ -1880,7 +1880,7 @@ let generate com = else vars in let vars = if (enums_as_objects && (has_feature ctx "has_enum" || has_feature ctx "Type.resolveEnum")) then "$hxEnums = $hxEnums || {}" :: vars else vars in let vars,has_dollar_underscore = - if List.exists (function TEnumDecl { e_extern = false } -> true | _ -> false) com.types then + if List.exists (function TEnumDecl e when not (has_enum_flag e EnExtern) -> true | _ -> false) com.types then "$_" :: vars,ref true else vars,ref false diff --git a/src/generators/genjvm.ml b/src/generators/genjvm.ml index e8ba03fa798..7f09f10b502 100644 --- a/src/generators/genjvm.ml +++ b/src/generators/genjvm.ml @@ -2884,7 +2884,7 @@ let generate_enum gctx en = let generate_module_type ctx mt = match mt with | TClassDecl c when not (has_class_flag c CExtern) -> generate_class ctx c - | TEnumDecl en when not en.e_extern -> generate_enum ctx en + | TEnumDecl en when not (has_enum_flag en EnExtern) -> generate_enum ctx en | _ -> () let generate_anons gctx = diff --git a/src/generators/genlua.ml b/src/generators/genlua.ml index 8e07969c724..cab664cb4d6 100644 --- a/src/generators/genlua.ml +++ b/src/generators/genlua.ml @@ -1859,7 +1859,7 @@ let generate_type ctx = function generate_class ctx c; check_multireturn ctx c; | TEnumDecl e -> - if not e.e_extern then generate_enum ctx e + if not (has_enum_flag e EnExtern) then generate_enum ctx e else (); | TTypeDecl _ | TAbstractDecl _ -> () @@ -1874,7 +1874,7 @@ let generate_type_forward ctx = function end else if Meta.has Meta.LuaRequire c.cl_meta && is_directly_used ctx.com c.cl_meta then generate_require ctx c.cl_path c.cl_meta - | TEnumDecl e when e.e_extern -> + | TEnumDecl e when has_enum_flag e EnExtern -> if Meta.has Meta.LuaRequire e.e_meta && is_directly_used ctx.com e.e_meta then generate_require ctx e.e_path e.e_meta; | TEnumDecl e -> @@ -1930,7 +1930,7 @@ let alloc_ctx com = match t with | TClassDecl c when (has_class_flag c CExtern) && not (Meta.has Meta.LuaRequire c.cl_meta) -> dot_path p - | TEnumDecl { e_extern = true } + | TEnumDecl e when has_enum_flag e EnExtern -> s_path ctx p | _ -> s_path ctx p); ctx diff --git a/src/generators/genneko.ml b/src/generators/genneko.ml index ce081ea0f7b..55d115b2fb3 100644 --- a/src/generators/genneko.ml +++ b/src/generators/genneko.ml @@ -563,7 +563,7 @@ let gen_type ctx t acc = else gen_class ctx c :: acc | TEnumDecl e -> - if e.e_extern then + if has_enum_flag e EnExtern then acc else gen_enum ctx e :: acc @@ -622,7 +622,7 @@ let gen_boot ctx = let gen_name ctx acc t = match t with - | TEnumDecl e when e.e_extern -> + | TEnumDecl e when has_enum_flag e EnExtern -> acc | TEnumDecl e -> let p = pos ctx e.e_pos in diff --git a/src/generators/genphp7.ml b/src/generators/genphp7.ml index c36622206ff..c89e41b3e55 100644 --- a/src/generators/genphp7.ml +++ b/src/generators/genphp7.ml @@ -1020,7 +1020,7 @@ class class_wrapper (cls) = *) class enum_wrapper (enm) = object (self) - inherit type_wrapper enm.e_path enm.e_meta (not enm.e_extern) + inherit type_wrapper enm.e_path enm.e_meta (not (has_enum_flag enm EnExtern)) (** Indicates if class initialization method should be executed upon class loaded *) diff --git a/src/generators/genpy.ml b/src/generators/genpy.ml index 1a59a94fb3e..c170bd436ca 100644 --- a/src/generators/genpy.ml +++ b/src/generators/genpy.ml @@ -2229,7 +2229,7 @@ module Generator = struct let gen_type ctx mt = match mt with | TClassDecl c -> gen_class ctx c - | TEnumDecl en when not en.e_extern -> gen_enum ctx en + | TEnumDecl en when not (has_enum_flag en EnExtern) -> gen_enum ctx en | TAbstractDecl {a_path = [],"UInt"} -> () | TAbstractDecl {a_path = [],"Enum"} -> () | TAbstractDecl {a_path = [],"EnumValue"} when not (has_feature ctx "has_enum") -> () @@ -2339,7 +2339,7 @@ module Generator = struct List.iter (fun mt -> match mt with | TClassDecl c when (has_class_flag c CExtern) -> import c.cl_path c.cl_meta - | TEnumDecl e when e.e_extern -> import e.e_path e.e_meta + | TEnumDecl e when has_enum_flag e EnExtern -> import e.e_path e.e_meta | _ -> () ) ctx.com.types diff --git a/src/generators/genswf.ml b/src/generators/genswf.ml index 20b29992e84..db182a137c0 100644 --- a/src/generators/genswf.ml +++ b/src/generators/genswf.ml @@ -153,7 +153,7 @@ let build_dependencies t = List.iter add_inherit tp.ttp_class.cl_implements ) c.cl_params; List.iter add_inherit c.cl_implements; - | TEnumDecl e when not e.e_extern -> + | TEnumDecl e when not (has_enum_flag e EnExtern) -> PMap.iter (fun _ f -> add_type f.ef_type) e.e_constrs; | _ -> ()); h := PMap.remove (([],"Int"),DKType) (!h); @@ -524,7 +524,7 @@ let generate swf_header com = if e.f9_cid <> None then List.iter (fun t -> let extern = (match t with | TClassDecl c -> (has_class_flag c CExtern) - | TEnumDecl e -> e.e_extern + | TEnumDecl e -> (has_enum_flag e EnExtern) | TAbstractDecl a -> false | TTypeDecl t -> false ) in diff --git a/src/generators/genswf9.ml b/src/generators/genswf9.ml index 6495c7a7456..828a353b875 100644 --- a/src/generators/genswf9.ml +++ b/src/generators/genswf9.ml @@ -255,7 +255,7 @@ let rec type_id ctx t = type_path ctx ([],"Function") | TType ({ t_path = ([],"UInt") as path },_) -> type_path ctx path - | TEnum ({ e_path = ["flash"],"XmlType"; e_extern = true },_) -> + | TEnum ({ e_path = ["flash"],"XmlType" } as e,_) when has_enum_flag e EnExtern -> HMPath ([],"String") | TEnum (e,_) -> type_path ctx e.e_path @@ -284,7 +284,7 @@ let classify ctx t = KDynamic | TAbstract ({ a_path = ["flash"],"AnyType" },_) -> KDynamic - | TEnum ({ e_path = ["flash"],"XmlType"; e_extern = true },_) -> + | TEnum ({ e_path = ["flash"],"XmlType" } as e,_) when has_enum_flag e EnExtern -> KType (HMPath ([],"String")) | TEnum (e,_) -> KType (type_id ctx t) @@ -2800,7 +2800,7 @@ let rec generate_type ctx t = hlf_metas = extract_meta c.cl_meta; }) | TEnumDecl e -> - if e.e_extern then + if has_enum_flag e EnExtern then None else let meta = Texpr.build_metadata ctx.com.basic t in diff --git a/src/macro/macroApi.ml b/src/macro/macroApi.ml index d32adadab6a..f2ee01fcf68 100644 --- a/src/macro/macroApi.ml +++ b/src/macro/macroApi.ml @@ -1057,8 +1057,8 @@ and encode_type_params tl = and encode_tenum e = encode_mtype (TEnumDecl e) [ - "isExtern", vbool e.e_extern; - "exclude", vfun0 (fun() -> e.e_extern <- true; vnull); + "isExtern", vbool (has_enum_flag e EnExtern); + "exclude", vfun0 (fun() -> add_enum_flag e EnExcluded; vnull); "constructs", encode_string_map encode_efield e.e_constrs; "names", encode_array (List.map encode_string e.e_names); ] @@ -1156,7 +1156,7 @@ and encode_tclass c = encode_mtype (TClassDecl c) [ "kind", encode_class_kind c.cl_kind; "isExtern", vbool (has_class_flag c CExtern); - "exclude", vfun0 (fun() -> add_class_flag c CExtern; c.cl_init <- None; vnull); + "exclude", vfun0 (fun() -> add_class_flag c CExcluded; c.cl_init <- None; vnull); "isInterface", vbool (has_class_flag c CInterface); "isFinal", vbool (has_class_flag c CFinal); "isAbstract", vbool (has_class_flag c CAbstract); diff --git a/src/optimization/dce.ml b/src/optimization/dce.ml index 6d122f3fc82..7da5e99d695 100644 --- a/src/optimization/dce.ml +++ b/src/optimization/dce.ml @@ -885,7 +885,7 @@ let sweep dce com = if dce.debug then print_endline ("[DCE] Removed class " ^ (s_type_path c.cl_path)); loop acc l) end - | (TEnumDecl en) as mt :: l when Meta.has Meta.Used en.e_meta || en.e_extern || keep_whole_enum dce en -> + | (TEnumDecl en) as mt :: l when Meta.has Meta.Used en.e_meta || (has_enum_flag en EnExtern) || keep_whole_enum dce en -> loop (mt :: acc) l | TEnumDecl e :: l -> if dce.debug then print_endline ("[DCE] Removed enum " ^ (s_type_path e.e_path)); diff --git a/src/typing/instanceBuilder.ml b/src/typing/instanceBuilder.ml index 8d0eeee7d3f..349894ad6d1 100644 --- a/src/typing/instanceBuilder.ml +++ b/src/typing/instanceBuilder.ml @@ -99,7 +99,7 @@ let get_build_info ctx mtype p = in make_build_info kind c.cl_path c.cl_params (has_class_flag c CExtern) f | TEnumDecl e -> - make_build_info BuildNormal e.e_path e.e_params e.e_extern (fun t -> TEnum (e,t)) + make_build_info BuildNormal e.e_path e.e_params (has_enum_flag e EnExtern) (fun t -> TEnum (e,t)) | TTypeDecl td -> begin try let msg = match Meta.get Meta.Deprecated td.t_meta with diff --git a/src/typing/macroContext.ml b/src/typing/macroContext.ml index 70f074923f0..290e9e1bf15 100644 --- a/src/typing/macroContext.ml +++ b/src/typing/macroContext.ml @@ -636,7 +636,7 @@ and flush_macro_context mint mctx = let maybe_apply_native_paths t = let apply_native = match t with | TClassDecl { cl_kind = KAbstractImpl a } -> a.a_extern && a.a_enum - | TEnumDecl e -> e.e_extern + | TEnumDecl e -> has_enum_flag e EnExtern | _ -> false in if apply_native then Naming.apply_native_paths t diff --git a/src/typing/typeloadModule.ml b/src/typing/typeloadModule.ml index 98f11246d9e..13a5a991d73 100644 --- a/src/typing/typeloadModule.ml +++ b/src/typing/typeloadModule.ml @@ -147,9 +147,8 @@ module ModuleLevel = struct e_doc = d.d_doc; e_meta = d.d_meta; e_private = priv; - e_extern = List.mem EExtern d.d_flags; } in - if not e.e_extern then check_type_name name d.d_meta p; + if List.mem EExtern d.d_flags then add_enum_flag e EnExtern else check_type_name name d.d_meta p; add_declaration decl (TEnumDecl e) | ETypedef d -> let name = fst d.d_name in @@ -513,12 +512,11 @@ module TypeLevel = struct delay ctx_en.g PConnectField (fun() -> InheritDoc.build_enum_field_doc ctx_en f); ) (!constructs); e.e_names <- List.rev !names; - e.e_extern <- e.e_extern; unify ctx_en (TType(enum_module_type e,[])) e.e_type p; if !is_flat then e.e_meta <- (Meta.FlatEnum,[],null_pos) :: e.e_meta; if Meta.has Meta.InheritDoc e.e_meta then delay ctx_en.g PConnectField (fun() -> InheritDoc.build_enum_doc ctx_en e); - if (ctx_en.com.platform = Jvm) && not e.e_extern then + if (ctx_en.com.platform = Jvm) && not (has_enum_flag e EnExtern) then delay ctx_en.g PTypeField (fun () -> let metas = StrictMeta.check_strict_meta ctx_en e.e_meta in e.e_meta <- metas @ e.e_meta; diff --git a/tests/server/src/cases/issues/Issue11643.hx b/tests/server/src/cases/issues/Issue11643.hx new file mode 100644 index 00000000000..bf6d1becac7 --- /dev/null +++ b/tests/server/src/cases/issues/Issue11643.hx @@ -0,0 +1,14 @@ +package cases.issues; + +class Issue11643 extends TestCase { + function test(_) { + vfs.putContent("Main.hx", getTemplate("issues/Issue11643/Main.hx")); + vfs.putContent("Foo.hx", getTemplate("issues/Issue11643/Foo.hx")); + + var args = ["-main", "Main", "--macro", "exclude('Foo')"]; + runHaxe(args); + runHaxeJson(args, ServerMethods.Invalidate, {file: new FsPath("Main.hx")}); + runHaxe(args); + Assert.isFalse(lastResult.hasError); + } +} diff --git a/tests/server/test/templates/issues/Issue11643/Foo.hx b/tests/server/test/templates/issues/Issue11643/Foo.hx new file mode 100644 index 00000000000..ffc70cc2622 --- /dev/null +++ b/tests/server/test/templates/issues/Issue11643/Foo.hx @@ -0,0 +1,9 @@ +class Foo { + final x:Int; + final y:Int; + + public inline function new(x:Int, y:Int) { + this.x = x; + this.y = y; + } +} diff --git a/tests/server/test/templates/issues/Issue11643/Main.hx b/tests/server/test/templates/issues/Issue11643/Main.hx new file mode 100644 index 00000000000..ab8e9fb46ac --- /dev/null +++ b/tests/server/test/templates/issues/Issue11643/Main.hx @@ -0,0 +1,4 @@ +class Main { + static var foo = new Foo(0,0); + static function main() {} +}