|
@@ -326,6 +326,11 @@ type enum_abstract_mode =
|
|
|
| EAInt of int ref
|
|
|
| EAOther
|
|
|
|
|
|
+type enum_constructor_visibility =
|
|
|
+ | VUnknown
|
|
|
+ | VPublic of placed_access
|
|
|
+ | VPrivate of placed_access
|
|
|
+
|
|
|
let build_enum_abstract ctx c a fields p =
|
|
|
let mode =
|
|
|
if does_unify a.a_this ctx.t.tint then EAInt (ref 0)
|
|
@@ -335,7 +340,31 @@ let build_enum_abstract ctx c a fields p =
|
|
|
List.iter (fun field ->
|
|
|
match field.cff_kind with
|
|
|
| FVar(ct,eo) when not (List.mem_assoc AStatic field.cff_access) ->
|
|
|
- field.cff_access <- [AStatic,null_pos; if (List.mem_assoc APrivate field.cff_access) then (APrivate,null_pos) else (APublic,null_pos)];
|
|
|
+ let check_visibility_conflict visibility p1 =
|
|
|
+ match visibility with
|
|
|
+ | VUnknown ->
|
|
|
+ ()
|
|
|
+ | VPublic(access,p2) | VPrivate(access,p2) ->
|
|
|
+ display_error ctx (Printf.sprintf "Conflicting access modifier %s" (Ast.s_access access)) p1;
|
|
|
+ display_error ctx "Conflicts with this" p2;
|
|
|
+ in
|
|
|
+ let rec loop visibility acc = match acc with
|
|
|
+ | (AExtern,p) :: acc ->
|
|
|
+ display_error ctx "extern modifier is not allowed on enum abstract fields" p;
|
|
|
+ loop visibility acc
|
|
|
+ | (APrivate,p) as access :: acc ->
|
|
|
+ check_visibility_conflict visibility p;
|
|
|
+ loop (VPrivate access) acc
|
|
|
+ | (APublic,p) as access :: acc ->
|
|
|
+ check_visibility_conflict visibility p;
|
|
|
+ loop (VPublic access) acc
|
|
|
+ | _ :: acc ->
|
|
|
+ loop visibility acc
|
|
|
+ | [] ->
|
|
|
+ visibility
|
|
|
+ in
|
|
|
+ let visibility = loop VUnknown field.cff_access in
|
|
|
+ field.cff_access <- [AStatic,null_pos; match visibility with VPublic acc | VPrivate acc -> acc | VUnknown -> (APublic,null_pos)];
|
|
|
field.cff_meta <- (Meta.Enum,[],null_pos) :: (Meta.Impl,[],null_pos) :: field.cff_meta;
|
|
|
let ct = match ct with
|
|
|
| Some _ -> ct
|