Browse Source

Override position (#7005)

* [display] keep track of field accessor positions

* [parser] consider accessor position part of the field

* [display] support position on `override`

closes #5718
Simon Krajewski 7 years ago
parent
commit
63cbed4c95

+ 19 - 19
src/codegen/dotnet.ml

@@ -309,17 +309,17 @@ let convert_ilfield ctx p field =
 		| name -> name
 	in
 	let cff_access = match field.fflags.ff_access with
-		| FAFamily | FAFamOrAssem -> APrivate
-		| FAPublic -> APublic
+		| FAFamily | FAFamOrAssem -> (APrivate,null_pos)
+		| FAPublic -> (APublic,null_pos)
 		| _ -> raise Exit (* private instances aren't useful on externs *)
 	in
 	let readonly, acc = List.fold_left (fun (readonly,acc) -> function
-		| CStatic -> readonly, AStatic :: acc
+		| CStatic -> readonly, (AStatic,null_pos) :: acc
 		| CInitOnly | CLiteral -> true, acc
 		| _ -> readonly,acc
 	) (false,[cff_access]) field.fflags.ff_contract in
 	if PMap.mem "net_loader_debug" ctx.ncom.defines.Define.values then
-		Printf.printf "\t%sfield %s : %s\n" (if List.mem AStatic acc then "static " else "") cff_name (IlMetaDebug.ilsig_s field.fsig.ssig);
+		Printf.printf "\t%sfield %s : %s\n" (if List.mem_assoc AStatic acc then "static " else "") cff_name (IlMetaDebug.ilsig_s field.fsig.ssig);
 	let kind = match readonly with
 		| true ->
 			cff_meta := (Meta.ReadOnly, [], cff_pos) :: !cff_meta;
@@ -349,12 +349,12 @@ let convert_ilevent ctx p ev =
 	let name = ev.ename in
 	let kind = FVar (Some (convert_signature ctx p ev.esig.snorm,null_pos), None) in
 	let meta = [Meta.Event, [], p; Meta.Keep,[],p; Meta.SkipReflection,[],p] in
-	let acc = [APrivate] in
+	let acc = [APrivate,null_pos] in
 	let add_m acc m = match m with
 		| None -> acc
 		| Some (name,flags) ->
 			if List.mem (CMStatic) flags.mf_contract then
-				AStatic :: acc
+				(AStatic,null_pos) :: acc
 			else
 				acc
 	in
@@ -392,11 +392,11 @@ let convert_ilmethod ctx p m is_explicit_impl =
 	let meta = [Meta.Overload, [], p] in
 	let acc, meta = match m.mflags.mf_access with
 		| FAFamily | FAFamOrAssem ->
-			APrivate, ((Meta.Protected, [], p) :: meta)
+			(APrivate,null_pos), ((Meta.Protected, [], p) :: meta)
 		(* | FAPrivate -> APrivate *)
 		| FAPublic when List.mem SGetter m.msemantics || List.mem SSetter m.msemantics ->
-			APrivate, meta
-		| FAPublic -> APublic, meta
+			(APrivate,null_pos), meta
+		| FAPublic -> (APublic,null_pos), meta
 		| _ ->
 			if PMap.mem "net_loader_debug" ctx.ncom.defines.Define.values then
 				Printf.printf "\tmethod %s (skipped) : %s\n" cff_name (IlMetaDebug.ilsig_s m.msig.ssig);
@@ -404,7 +404,7 @@ let convert_ilmethod ctx p m is_explicit_impl =
 	in
 	let is_static = ref false in
 	let acc, is_final = List.fold_left (fun (acc,is_final) -> function
-		| CMStatic when cff_name <> "new" -> is_static := true; AStatic :: acc, is_final
+		| CMStatic when cff_name <> "new" -> is_static := true; (AStatic,null_pos) :: acc, is_final
 		| CMVirtual when is_final = None -> acc, Some false
 		| CMFinal -> acc, Some true
 		| _ -> acc, is_final
@@ -493,7 +493,7 @@ let convert_ilmethod ctx p m is_explicit_impl =
 		| _ when cff_name = "new" -> acc
 		| Some (path,s) -> match lookup_ilclass ctx.nstd ctx.ncom path with
 			| Some ilcls when not (List.mem SInterface ilcls.cflags.tdf_semantics) ->
-				AOverride :: acc
+				(AOverride,null_pos) :: acc
 			| None when ctx.ncom.verbose ->
 				prerr_endline ("(net-lib) A referenced assembly for path " ^ ilpath_s path ^ " was not found");
 				acc
@@ -517,14 +517,14 @@ let convert_ilprop ctx p prop is_explicit_impl =
 		| _ -> None
 	in
 	let cff_access = match pmflags with
-		| Some { mf_access = FAFamily | FAFamOrAssem } -> APrivate
-		| Some { mf_access = FAPublic } -> APublic
+		| Some { mf_access = FAFamily | FAFamOrAssem } -> (APrivate,null_pos)
+		| Some { mf_access = FAPublic } -> (APublic,null_pos)
 		| _ -> raise Exit (* non-public / protected fields don't interest us *)
 	in
 	let access acc = acc.mf_access in
 	let cff_access = match pmflags with
 		| Some m when List.mem CMStatic m.mf_contract ->
-			[AStatic;cff_access]
+			[AStatic,null_pos;cff_access]
 		| _ -> [cff_access]
 	in
 	let get = match prop.pget with
@@ -662,7 +662,7 @@ let convert_delegate ctx p ilcls =
 			cff_doc = None;
 			cff_pos = p;
 			cff_meta = [ Meta.Op, [ (EBinop(op, (EConst(Ident"A"),p), (EConst(Ident"B"),p)),p) ], p ];
-			cff_access = [APublic;AInline;AStatic;AExtern];
+			cff_access = [APublic,null_pos;AInline,null_pos;AStatic,null_pos;AExtern,null_pos];
 			cff_kind = mk_op_fn op name p;
 		}
 	in
@@ -694,9 +694,9 @@ let convert_delegate ctx p ilcls =
 			EReturn( Some ( EConst(Ident "this"), p ) ), p
 		);
 	} in
-	let fn_new = mk_abstract_fun "new" p fn_new [] [APublic;AInline;AExtern] in
-	let fn_from_hx = mk_abstract_fun "FromHaxeFunction" p fn_from_hx [Meta.From] [APublic;AInline;AStatic;AExtern] in
-	let fn_asdel = mk_abstract_fun "AsDelegate" p fn_asdel [] [APublic;AInline;AExtern] in
+	let fn_new = mk_abstract_fun "new" p fn_new [] [APublic,null_pos;AInline,null_pos;AExtern,null_pos] in
+	let fn_from_hx = mk_abstract_fun "FromHaxeFunction" p fn_from_hx [Meta.From] [APublic,null_pos;AInline,null_pos;AStatic,null_pos;AExtern,null_pos] in
+	let fn_asdel = mk_abstract_fun "AsDelegate" p fn_asdel [] [APublic,null_pos;AInline,null_pos;AExtern,null_pos] in
 	let _, c = netpath_to_hx ctx.nstd ilcls.cpath in
 	EAbstract {
 		d_name = netname_to_hx c,null_pos;
@@ -817,7 +817,7 @@ let convert_ilclass ctx p ?(delegate=false) ilcls = match ilcls.csuper with
 						cff_doc = None;
 						cff_pos = p;
 						cff_meta = [];
-						cff_access = [APublic;AStatic];
+						cff_access = [APublic,null_pos;AStatic,null_pos];
 						cff_kind = FFun {
 							f_params = params;
 							f_args = [("arg1",null_pos),false,[],Some (thist,null_pos),None;("arg2",null_pos),false,[],Some (thist,null_pos),None];

+ 5 - 5
src/codegen/java.ml

@@ -251,12 +251,12 @@ let convert_java_enum ctx p pe =
 		let readonly = ref false in
 
 		List.iter (function
-			| JPublic -> cff_access := APublic :: !cff_access
+			| JPublic -> cff_access := (APublic,null_pos) :: !cff_access
 			| JPrivate -> raise Exit (* private instances aren't useful on externs *)
 			| JProtected ->
 				cff_meta := (Meta.Protected, [], p) :: !cff_meta;
-				cff_access := APrivate :: !cff_access
-			| JStatic -> cff_access := AStatic :: !cff_access
+				cff_access := (APrivate,null_pos) :: !cff_access
+			| JStatic -> cff_access := (AStatic,null_pos) :: !cff_access
 			| JFinal ->
 				cff_meta := (Meta.Final, [], p) :: !cff_meta;
 				(match field.jf_kind, field.jf_vmsignature, field.jf_constant with
@@ -279,7 +279,7 @@ let convert_java_enum ctx p pe =
 			| AttrVisibleAnnotations ann ->
 				List.iter (function
 					| { ann_type = TObject( (["java";"lang"], "Override"), [] ) } ->
-						cff_access := AOverride :: !cff_access
+						cff_access := (AOverride,null_pos) :: !cff_access
 					| _ -> ()
 				) ann
 			| _ -> ()
@@ -357,7 +357,7 @@ let convert_java_enum ctx p pe =
 							(Meta.Native, [EConst (String (cff_name) ), cff_pos], cff_pos) :: !cff_meta
 		in
 		if PMap.mem "java_loader_debug" ctx.jcom.defines.Define.values then
-			Printf.printf "\t%s%sfield %s : %s\n" (if List.mem AStatic !cff_access then "static " else "") (if List.mem AOverride !cff_access then "override " else "") cff_name (s_sig field.jf_signature);
+			Printf.printf "\t%s%sfield %s : %s\n" (if List.mem_assoc AStatic !cff_access then "static " else "") (if List.mem_assoc AOverride !cff_access then "override " else "") cff_name (s_sig field.jf_signature);
 
 		{
 			cff_name = cff_name,null_pos;

+ 9 - 9
src/codegen/swfLoader.ml

@@ -160,22 +160,22 @@ let build_class com c file =
 	let make_field stat acc f =
 		let meta = ref [] in
 		let flags = (match f.hlf_name with
-			| HMPath _ -> [APublic]
+			| HMPath _ -> [APublic,null_pos]
 			| HMName (_,ns) ->
 				(match ns with
 				| HNPrivate _ | HNNamespace "http://www.adobe.com/2006/flex/mx/internal" -> []
 				| HNNamespace ns ->
 					if not (c.hlc_interface || is_xml) then meta := (Meta.Ns,[String ns]) :: !meta;
-					[APublic]
+					[APublic,null_pos]
 				| HNExplicit _ | HNInternal _ | HNPublic _ ->
-					[APublic]
+					[APublic,null_pos]
 				| HNStaticProtected _ | HNProtected _ ->
 					meta := (Meta.Protected,[]) :: !meta;
-					[APrivate])
+					[APrivate,null_pos])
 			| _ -> []
 		) in
 		if flags = [] then acc else
-		let flags = if stat then AStatic :: flags else flags in
+		let flags = if stat then (AStatic,null_pos) :: flags else flags in
 		let name = (make_tpath f.hlf_name).tname in
 		let mk_meta() =
 			List.map (fun (s,cl) -> s, List.map (fun c -> EConst c,pos) cl, pos) (!meta)
@@ -288,8 +288,8 @@ let build_class com c file =
 			| Some t1, Some t2 -> true, true, (if t1 <> t2 then None else t1)
 		) in
 		let t = if name = "endian" then Some (HMPath (["flash";"utils"],"Endian")) else t in
-		let flags = [APublic] in
-		let flags = if stat then AStatic :: flags else flags in
+		let flags = [APublic,null_pos] in
+		let flags = if stat then (AStatic,null_pos) :: flags else flags in
 		{
 			cff_name = name,null_pos;
 			cff_pos = pos;
@@ -319,7 +319,7 @@ let build_class com c file =
 			| f :: l ->
 				match f.cff_kind with
 				| FVar (Some (CTPath { tpackage = []; tname = ("String" | "Int" | "UInt") as tname },null_pos),None)
-				| FProp (("default",_),("never",_),Some (CTPath { tpackage = []; tname = ("String" | "Int" | "UInt") as tname },null_pos),None) when List.mem AStatic f.cff_access ->
+				| FProp (("default",_),("never",_),Some (CTPath { tpackage = []; tname = ("String" | "Int" | "UInt") as tname },null_pos),None) when List.mem_assoc AStatic f.cff_access ->
 					if !real_type = "" then real_type := tname else if !real_type <> tname then raise Exit;
 					{
 						ec_name = f.cff_name;
@@ -351,7 +351,7 @@ let build_class com c file =
 		d_name = path.tname,null_pos;
 		d_doc = None;
 		d_params = [];
-		d_meta = if c.hlc_final && List.exists (fun f -> fst f.cff_name <> "new" && not (List.mem AStatic f.cff_access)) fields then [Meta.Final,[],pos] else [];
+		d_meta = if c.hlc_final && List.exists (fun f -> fst f.cff_name <> "new" && not (List.mem_assoc AStatic f.cff_access)) fields then [Meta.Final,[],pos] else [];
 		d_flags = flags;
 		d_data = fields;
 	} in

+ 7 - 3
src/core/ast.ml

@@ -237,6 +237,8 @@ and access =
 	| AFinal
 	| AExtern
 
+and placed_access = access * pos
+
 and class_field_kind =
 	| FVar of type_hint option * expr option
 	| FFun of func
@@ -247,7 +249,7 @@ and class_field = {
 	cff_doc : documentation;
 	cff_pos : pos;
 	mutable cff_meta : metadata;
-	mutable cff_access : access list;
+	mutable cff_access : placed_access list;
 	mutable cff_kind : class_field_kind;
 }
 
@@ -380,6 +382,8 @@ let s_access = function
 	| AFinal -> "final"
 	| AExtern -> "extern"
 
+let s_placed_access (a,_) = s_access a
+
 let s_keyword = function
 	| Function -> "function"
 	| Class -> "class"
@@ -783,7 +787,7 @@ let s_expr e =
 		| Some s -> "/**\n\t" ^ tabs ^ s ^ "\n**/\n"
 		| None -> "" ^
 		if List.length f.cff_meta > 0 then String.concat ("\n" ^ tabs) (List.map (s_metadata tabs) f.cff_meta) else "" ^
-		if List.length f.cff_access > 0 then String.concat " " (List.map s_access f.cff_access) else "" ^
+		if List.length f.cff_access > 0 then String.concat " " (List.map s_placed_access f.cff_access) else "" ^
 		match f.cff_kind with
 		| FVar (t,e) -> "var " ^ (fst f.cff_name) ^ s_opt_type_hint tabs t " : " ^ s_opt_expr tabs e " = "
 		| FProp ((get,_),(set,_),t,e) -> "var " ^ (fst f.cff_name) ^ "(" ^ get ^ "," ^ set ^ ")" ^ s_opt_type_hint tabs t " : " ^ s_opt_expr tabs e " = "
@@ -904,4 +908,4 @@ module Expr = struct
 			loop fl
 		with Exit ->
 			true
-end
+end

+ 1 - 1
src/core/type.ml

@@ -1529,7 +1529,7 @@ module Printer = struct
 			"cff_doc",s_opt (fun s -> s) cff.cff_doc;
 			"cff_pos",s_pos cff.cff_pos;
 			"cff_meta",s_metadata cff.cff_meta;
-			"cff_access",s_list ", " Ast.s_access cff.cff_access;
+			"cff_access",s_list ", " Ast.s_placed_access cff.cff_access;
 		]
 end
 

+ 15 - 12
src/macro/macroApi.ml

@@ -385,7 +385,7 @@ and encode_tparam = function
 	| TPExpr e -> encode_enum ITParam 1 [encode_expr e]
 
 and encode_access a =
-	let tag = match a with
+	let tag = match fst a with
 		| APublic -> 0
 		| APrivate -> 1
 		| AStatic -> 2
@@ -396,7 +396,7 @@ and encode_access a =
 		| AFinal -> 7
 		| AExtern -> 8
 	in
-	encode_enum IAccess tag []
+	encode_enum ~pos:(Some (pos a)) IAccess tag []
 
 and encode_meta_entry (m,ml,p) =
 	encode_obj OMetadataEntry [
@@ -698,17 +698,20 @@ and decode_fun v =
 	}
 
 and decode_access v =
-	match decode_enum v with
-	| 0, [] -> APublic
-	| 1, [] -> APrivate
-	| 2, [] -> AStatic
-	| 3, [] -> AOverride
-	| 4, [] -> ADynamic
-	| 5, [] -> AInline
-	| 6, [] -> AMacro
-	| 7, [] -> AFinal
-	| 8, [] -> AExtern
+	let (i,_),p = decode_enum_with_pos v in
+	let a = match i with
+	| 0 -> APublic
+	| 1 -> APrivate
+	| 2 -> AStatic
+	| 3 -> AOverride
+	| 4 -> ADynamic
+	| 5 -> AInline
+	| 6 -> AMacro
+	| 7 -> AFinal
+	| 8 -> AExtern
 	| _ -> raise Invalid_expr
+	in
+	a,p
 
 and decode_meta_entry v =
 	Meta.from_string (decode_string (field v "name")), decode_opt_array decode_expr (field v "params"), decode_pos (field v "pos")

+ 14 - 10
src/syntax/grammar.mly

@@ -616,8 +616,8 @@ and parse_class_field s =
 		| [< '(Kwd Final,p1) >] ->
 			begin match s with parser
 			| [< name = dollar_ident; t = popt parse_type_hint_with_pos; e,p2 = parse_var_field_assignment >] ->
-				name,punion p1 p2,FVar(t,e),(AFinal :: al)
-			| [< al = parse_cf_rights (not (List.mem AStatic al)) (AFinal :: al); f = parse_function_field doc meta al >] ->
+				name,punion p1 p2,FVar(t,e),((AFinal,p1) :: al)
+			| [< al = parse_cf_rights (not (List.mem_assoc AStatic al)) ((AFinal,p1) :: al); f = parse_function_field doc meta al >] ->
 				f
 			| [< >] ->
 				serror()
@@ -627,6 +627,10 @@ and parse_class_field s =
 		| [< >] ->
 			if al = [] then raise Stream.Failure else serror()
 		) in
+		let pos = match List.rev al with
+			| [] -> pos
+			| (_,p) :: _ -> punion p pos
+		in
 		{
 			cff_name = name;
 			cff_doc = doc;
@@ -637,14 +641,14 @@ and parse_class_field s =
 		}
 
 and parse_cf_rights allow_static l = parser
-	| [< '(Kwd Static,_) when allow_static; l = parse_cf_rights false (AStatic :: l) >] -> l
-	| [< '(Kwd Macro,_) when not(List.mem AMacro l); l = parse_cf_rights allow_static (AMacro :: l) >] -> l
-	| [< '(Kwd Public,_) when not(List.mem APublic l || List.mem APrivate l); l = parse_cf_rights allow_static (APublic :: l) >] -> l
-	| [< '(Kwd Private,_) when not(List.mem APublic l || List.mem APrivate l); l = parse_cf_rights allow_static (APrivate :: l) >] -> l
-	| [< '(Kwd Override,_) when not (List.mem AOverride l); l = parse_cf_rights false (AOverride :: l) >] -> l
-	| [< '(Kwd Dynamic,_) when not (List.mem ADynamic l); l = parse_cf_rights allow_static (ADynamic :: l) >] -> l
-	| [< '(Kwd Inline,_); l = parse_cf_rights allow_static (AInline :: l) >] -> l
-	| [< '(Kwd Extern,_); l = parse_cf_rights allow_static (AExtern :: l) >] -> l
+	| [< '(Kwd Static,p) when allow_static; l = parse_cf_rights false ((AStatic,p) :: l) >] -> l
+	| [< '(Kwd Macro,p) when not(List.mem_assoc AMacro l); l = parse_cf_rights allow_static ((AMacro,p) :: l) >] -> l
+	| [< '(Kwd Public,p) when not(List.mem_assoc APublic l || List.mem_assoc APrivate l); l = parse_cf_rights allow_static ((APublic,p) :: l) >] -> l
+	| [< '(Kwd Private,p) when not(List.mem_assoc APublic l || List.mem_assoc APrivate l); l = parse_cf_rights allow_static ((APrivate,p) :: l) >] -> l
+	| [< '(Kwd Override,p) when not (List.mem_assoc AOverride l); l = parse_cf_rights false ((AOverride,p) :: l) >] -> l
+	| [< '(Kwd Dynamic,p) when not (List.mem_assoc ADynamic l); l = parse_cf_rights allow_static ((ADynamic,p) :: l) >] -> l
+	| [< '(Kwd Inline,p); l = parse_cf_rights allow_static ((AInline,p) :: l) >] -> l
+	| [< '(Kwd Extern,p); l = parse_cf_rights allow_static ((AExtern,p) :: l) >] -> l
 	| [< >] -> l
 
 and parse_fun_name = parser

+ 1 - 1
src/syntax/reification.ml

@@ -169,7 +169,7 @@ let reify in_macro =
 	and to_cfield f p =
 		let p = f.cff_pos in
 		let to_access a p =
-			let n = (match a with
+			let n = (match fst a with
 			| APublic -> "APublic"
 			| APrivate -> "APrivate"
 			| AStatic -> "AStatic"

+ 1 - 1
src/typing/macroContext.ml

@@ -307,7 +307,7 @@ let make_macro_api ctx p =
 			add false ctx;
 			(* if we are adding a class which has a macro field, we also have to add it to the macro context (issue #1497) *)
 			if not ctx.in_macro then match tdef with
-			| EClass c when List.exists (fun cff -> (Meta.has Meta.Macro cff.cff_meta || List.mem AMacro cff.cff_access)) c.d_data ->
+			| EClass c when List.exists (fun cff -> (Meta.has Meta.Macro cff.cff_meta || List.mem_assoc AMacro cff.cff_access)) c.d_data ->
 				add true mctx
 			| _ ->
 				()

+ 3 - 3
src/typing/magicTypes.ml

@@ -33,14 +33,14 @@ let extend_remoting ctx c t p async prot =
 	ctx.com.package_rules <- rules;
 	let base_fields = [
 		{ cff_name = "__cnx",null_pos; cff_pos = p; cff_doc = None; cff_meta = []; cff_access = []; cff_kind = FVar (Some (CTPath { tpackage = ["haxe";"remoting"]; tname = if async then "AsyncConnection" else "Connection"; tparams = []; tsub = None },null_pos),None) };
-		{ cff_name = "new",null_pos; cff_pos = p; cff_doc = None; cff_meta = []; cff_access = [APublic]; cff_kind = FFun { f_args = [("c",null_pos),false,[],None,None]; f_type = None; f_expr = Some (EBinop (OpAssign,(EConst (Ident "__cnx"),p),(EConst (Ident "c"),p)),p); f_params = [] } };
+		{ cff_name = "new",null_pos; cff_pos = p; cff_doc = None; cff_meta = []; cff_access = [APublic,null_pos]; cff_kind = FFun { f_args = [("c",null_pos),false,[],None,None]; f_type = None; f_expr = Some (EBinop (OpAssign,(EConst (Ident "__cnx"),p),(EConst (Ident "c"),p)),p); f_params = [] } };
 	] in
 	let tvoid = CTPath { tpackage = []; tname = "Void"; tparams = []; tsub = None } in
 	let build_field is_public acc f =
 		if fst f.cff_name = "new" then
 			acc
 		else match f.cff_kind with
-		| FFun fd when (is_public || List.mem APublic f.cff_access) && not (List.mem AStatic f.cff_access) ->
+		| FFun fd when (is_public || List.mem_assoc APublic f.cff_access) && not (List.mem_assoc AStatic f.cff_access) ->
 			if List.exists (fun (_,_,_,t,_) -> t = None) fd.f_args then error ("Field " ^ fst f.cff_name ^ " type is not complete and cannot be used by RemotingProxy") p;
 			let eargs = [EArrayDecl (List.map (fun ((a,_),_,_,_,_) -> (EConst (Ident a),p)) fd.f_args),p] in
 			let ftype = (match fd.f_type with Some (CTPath { tpackage = []; tname = "Void" },_) -> None | _ -> fd.f_type) in
@@ -65,7 +65,7 @@ let extend_remoting ctx c t p async prot =
 				f_type = if async then None else ftype;
 				f_expr = Some (EBlock [expr],p);
 			} in
-			{ cff_name = f.cff_name; cff_pos = f.cff_pos; cff_doc = None; cff_meta = []; cff_access = [APublic]; cff_kind = FFun fd } :: acc
+			{ cff_name = f.cff_name; cff_pos = f.cff_pos; cff_doc = None; cff_meta = []; cff_access = [APublic,null_pos]; cff_kind = FFun fd } :: acc
 		| _ -> acc
 	in
 	let decls = List.map (fun d ->

+ 2 - 2
src/typing/typeload.ml

@@ -346,12 +346,12 @@ and load_complex_type ctx allow_display p (t,pn) =
 			let params = ref [] in
 			let final = ref false in
 			List.iter (fun a ->
-				match a with
+				match fst a with
 				| APublic -> ()
 				| APrivate -> pub := false;
 				| ADynamic when (match f.cff_kind with FFun _ -> true | _ -> false) -> dyn := true
 				| AFinal -> final := true
-				| AStatic | AOverride | AInline | ADynamic | AMacro | AExtern -> error ("Invalid access " ^ Ast.s_access a) p
+				| AStatic | AOverride | AInline | ADynamic | AMacro | AExtern as a -> error ("Invalid access " ^ Ast.s_access a) p
 			) f.cff_access;
 			let t , access = (match f.cff_kind with
 				| FVar(t,e) when !final ->

+ 44 - 31
src/typing/typeloadFields.ml

@@ -51,7 +51,7 @@ type field_init_ctx = {
 	is_inline : bool;
 	is_final : bool;
 	is_static : bool;
-	is_override : bool;
+	override : pos option;
 	is_extern : bool;
 	is_macro : bool;
 	is_abstract_member : bool;
@@ -85,7 +85,6 @@ let dump_field_context fctx =
 	Printer.s_record_fields "" [
 		"is_inline",string_of_bool fctx.is_inline;
 		"is_static",string_of_bool fctx.is_static;
-		"is_override",string_of_bool fctx.is_override;
 		"is_extern",string_of_bool fctx.is_extern;
 		"is_macro",string_of_bool fctx.is_macro;
 		"is_abstract_member",string_of_bool fctx.is_abstract_member;
@@ -192,13 +191,13 @@ let ensure_struct_init_constructor ctx c ast_fields p =
 		c.cl_constructor <- Some cf
 
 let transform_abstract_field com this_t a_t a f =
-	let stat = List.mem AStatic f.cff_access in
+	let stat = List.mem_assoc AStatic f.cff_access in
 	let p = f.cff_pos in
 	match f.cff_kind with
 	| FProp ((("get" | "never"),_),(("set" | "never"),_),_,_) when not stat ->
 		(* TODO: hack to avoid issues with abstract property generation on As3 *)
-		if Common.defined com Define.As3 then f.cff_access <- AExtern :: f.cff_access;
-		{ f with cff_access = AStatic :: f.cff_access; cff_meta = (Meta.Impl,[],null_pos) :: f.cff_meta }
+		if Common.defined com Define.As3 then f.cff_access <- (AExtern,null_pos) :: f.cff_access;
+		{ f with cff_access = (AStatic,null_pos) :: f.cff_access; cff_meta = (Meta.Impl,[],null_pos) :: f.cff_meta }
 	| FProp _ when not stat ->
 		error "Member property accessors must be get/set or never" p;
 	| FFun fu when fst f.cff_name = "new" && not stat ->
@@ -207,9 +206,9 @@ let transform_abstract_field com this_t a_t a f =
 		let ret p = (EReturn (Some (cast (EConst (Ident "this"),p))),p) in
 		let meta = (Meta.Impl,[],null_pos) :: f.cff_meta in
 		if Meta.has Meta.MultiType a.a_meta then begin
-			if List.mem AInline f.cff_access then error "MultiType constructors cannot be inline" f.cff_pos;
+			if List.mem_assoc AInline f.cff_access then error "MultiType constructors cannot be inline" f.cff_pos;
 			if fu.f_expr <> None then error "MultiType constructors cannot have a body" f.cff_pos;
-			f.cff_access <- AExtern :: f.cff_access;
+			f.cff_access <- (AExtern,null_pos) :: f.cff_access;
 		end;
 		(* We don't want the generated expression positions to shadow the real code. *)
 		let p = { p with pmax = p.pmin } in
@@ -222,11 +221,11 @@ let transform_abstract_field com this_t a_t a f =
 			);
 			f_type = Some a_t;
 		} in
-		{ f with cff_name = "_new",pos f.cff_name; cff_access = AStatic :: f.cff_access; cff_kind = FFun fu; cff_meta = meta }
+		{ f with cff_name = "_new",pos f.cff_name; cff_access = (AStatic,null_pos) :: f.cff_access; cff_kind = FFun fu; cff_meta = meta }
 	| FFun fu when not stat ->
 		if Meta.has Meta.From f.cff_meta then error "@:from cast functions must be static" f.cff_pos;
-		let fu = { fu with f_args = (if List.mem AMacro f.cff_access then fu.f_args else (("this",null_pos),false,[],Some this_t,None) :: fu.f_args) } in
-		{ f with cff_kind = FFun fu; cff_access = AStatic :: f.cff_access; cff_meta = (Meta.Impl,[],null_pos) :: f.cff_meta }
+		let fu = { fu with f_args = (if List.mem_assoc AMacro f.cff_access then fu.f_args else (("this",null_pos),false,[],Some this_t,None) :: fu.f_args) } in
+		{ f with cff_kind = FFun fu; cff_access = (AStatic,null_pos) :: f.cff_access; cff_meta = (Meta.Impl,[],null_pos) :: f.cff_meta }
 	| _ ->
 		f
 
@@ -256,7 +255,7 @@ let patch_class ctx c fields =
 					f.cff_kind <- FFun { ff with f_args = List.map param ff.f_args }
 				| _ -> ());
 				(* other patches *)
-				match (try Some (Hashtbl.find h (fst f.cff_name,List.mem AStatic f.cff_access)) with Not_found -> None) with
+				match (try Some (Hashtbl.find h (fst f.cff_name,List.mem_assoc AStatic f.cff_access)) with Not_found -> None) with
 				| None -> loop (f :: acc) l
 				| Some { tp_remove = true } -> loop acc l
 				| Some p ->
@@ -275,8 +274,8 @@ let patch_class ctx c fields =
 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 AStatic field.cff_access) ->
-			field.cff_access <- [AStatic; if (List.mem APrivate field.cff_access) then APrivate else APublic];
+		| 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)];
 			field.cff_meta <- (Meta.Enum,[],null_pos) :: (Meta.Impl,[],null_pos) :: field.cff_meta;
 			let ct = match ct with
 				| Some _ -> ct
@@ -287,7 +286,7 @@ let build_enum_abstract ctx c a fields p =
 					if not c.cl_extern then error "Value required" field.cff_pos
 					else field.cff_kind <- FProp(("default",null_pos),("never",null_pos),ct,None)
 				| Some e ->
-					field.cff_access <- AInline :: field.cff_access;
+					field.cff_access <- (AInline,null_pos) :: field.cff_access;
 					let e = (ECast(e,None),(pos e)) in
 					field.cff_kind <- FVar(ct,Some e)
 			end
@@ -397,8 +396,8 @@ let create_field_context (ctx,cctx) c cff =
 		ctx with
 		pass = PBuildClass; (* will be set later to PTypeExpr *)
 	} in
-	let is_static = List.mem AStatic cff.cff_access in
-	let is_extern = List.mem AExtern cff.cff_access in
+	let is_static = List.mem_assoc AStatic cff.cff_access in
+	let is_extern = List.mem_assoc AExtern cff.cff_access in
 	let is_extern = if Meta.has Meta.Extern cff.cff_meta then begin
 		(* if not (Define.is_haxe3_compat ctx.com.defines) then
 			ctx.com.warning "`@:extern` on fields is deprecated in favor of `extern`" (pos cff.cff_name); *)
@@ -410,9 +409,9 @@ let create_field_context (ctx,cctx) c cff =
 		| FFun _ -> ctx.g.doinline || is_extern || c.cl_extern
 		| _ -> true
 	in
-	let is_inline = allow_inline && List.mem AInline cff.cff_access in
-	let is_override = List.mem AOverride cff.cff_access in
-	let is_macro = List.mem AMacro cff.cff_access in
+	let is_inline = allow_inline && List.mem_assoc AInline cff.cff_access in
+	let override = try Some (List.assoc AOverride cff.cff_access) with Not_found -> None in
+	let is_macro = List.mem_assoc AMacro cff.cff_access in
 	let field_kind = match fst cff.cff_name with
 		| "new" -> FKConstructor
 		| "__init__" when is_static -> FKInit
@@ -421,10 +420,10 @@ let create_field_context (ctx,cctx) c cff =
 	let fctx = {
 		is_inline = is_inline;
 		is_static = is_static;
-		is_override = is_override;
+		override = override;
 		is_macro = is_macro;
 		is_extern = is_extern;
-		is_final = List.mem AFinal cff.cff_access;
+		is_final = List.mem_assoc AFinal cff.cff_access;
 		is_display_field = ctx.is_display_file && Display.is_display_position cff.cff_pos;
 		is_field_debug = cctx.is_class_debug;
 		is_abstract_member = cctx.abstract <> None && Meta.has Meta.Impl cff.cff_meta;
@@ -436,9 +435,9 @@ let create_field_context (ctx,cctx) c cff =
 
 let is_public (ctx,cctx) access parent =
 	let c = cctx.tclass in
-	if List.mem APrivate access then
+	if List.mem_assoc APrivate access then
 		false
-	else if List.mem APublic access then
+	else if List.mem_assoc APublic access then
 		true
 	else match parent with
 		| Some { cf_public = p } -> p
@@ -491,11 +490,11 @@ let build_fields (ctx,cctx) c fields =
 					| None ->
 						f
 				in
-				if List.mem AMacro f.cff_access then
+				if List.mem_assoc AMacro f.cff_access then
 					(match ctx.g.macros with
 					| Some (_,mctx) when Hashtbl.mem mctx.g.types_module c.cl_path ->
 						(* assume that if we had already a macro with the same name, it has not been changed during the @:build operation *)
-						if not (List.exists (fun f2 -> f2.cff_name = f.cff_name && List.mem AMacro f2.cff_access) (!fields)) then
+						if not (List.exists (fun f2 -> f2.cff_name = f.cff_name && List.mem_assoc AMacro f2.cff_access) (!fields)) then
 							error "Class build macro cannot return a macro function when the class has already been compiled into the macro context" p
 					| _ -> ());
 				f
@@ -895,7 +894,7 @@ let create_method (ctx,cctx,fctx) c f fd p =
 			()
 	end;
 	let parent = (if not fctx.is_static then get_parent c (fst f.cff_name) else None) in
-	let dynamic = List.mem ADynamic f.cff_access || (match parent with Some { cf_kind = Method MethDynamic } -> true | _ -> false) in
+	let dynamic = List.mem_assoc ADynamic f.cff_access || (match parent with Some { cf_kind = Method MethDynamic } -> true | _ -> false) in
 	if fctx.is_inline && dynamic then error (fst f.cff_name ^ ": You can't have both 'inline' and 'dynamic'") p;
 	ctx.type_params <- (match cctx.abstract with
 		| Some a when fctx.is_abstract_member ->
@@ -962,6 +961,17 @@ let create_method (ctx,cctx,fctx) c f fd p =
 					cf.cf_expr <- None;
 					cf.cf_type <- t
 				| _ ->
+					if ctx.is_display_file && ctx.com.display.dms_kind = DMPosition then begin match fctx.override with
+						| Some p when Display.is_display_position p ->
+							begin match c.cl_super with
+							| Some(c,tl) ->
+								let _,_,cf = raw_class_field (fun cf -> cf.cf_type) c tl cf.cf_name in
+								Display.DisplayEmitter.display_field ctx.com.display cf p
+							| _ ->
+								()
+							end
+						| _ -> ()
+					end;
 					let e , fargs = TypeloadFunction.type_function ctx args ret fmode fd fctx.is_display_field p in
 					begin match fctx.field_kind with
 					| FKNormal when not fctx.is_static -> TypeloadCheck.check_overriding ctx c cf
@@ -1133,13 +1143,16 @@ let init_field (ctx,cctx,fctx) f =
 	let p = f.cff_pos in
 	if name.[0] = '$' then display_error ctx "Field names starting with a dollar are not allowed" p;
 	List.iter (fun acc ->
-		match (acc, f.cff_kind) with
+		match (fst acc, f.cff_kind) with
 		| APublic, _ | APrivate, _ | AStatic, _ | AFinal, _ | AExtern, _ -> ()
 		| ADynamic, FFun _ | AOverride, FFun _ | AMacro, FFun _ | AInline, FFun _ | AInline, FVar _ -> ()
-		| _, FVar _ -> error ("Invalid accessor '" ^ Ast.s_access acc ^ "' for variable " ^ name) p
-		| _, FProp _ -> error ("Invalid accessor '" ^ Ast.s_access acc ^ "' for property " ^ name) p
+		| _, FVar _ -> error ("Invalid accessor '" ^ Ast.s_placed_access acc ^ "' for variable " ^ name) p
+		| _, FProp _ -> error ("Invalid accessor '" ^ Ast.s_placed_access acc ^ "' for property " ^ name) p
 	) f.cff_access;
-	if fctx.is_override then (match c.cl_super with None -> error ("Invalid override on field '" ^ name ^ "': class has no super class") p | _ -> ());
+	begin match fctx.override with
+		| Some _ -> (match c.cl_super with None -> error ("Invalid override on field '" ^ name ^ "': class has no super class") p | _ -> ());
+		| None -> ()
+	end;
 	match f.cff_kind with
 	| FVar (t,e) ->
 		create_variable (ctx,cctx,fctx) c f t e p
@@ -1236,7 +1249,7 @@ let init_class ctx c p context_init herits fields =
 			| FKNormal ->
 				let dup = if fctx.is_static then PMap.exists cf.cf_name c.cl_fields || has_field cf.cf_name c.cl_super else PMap.exists cf.cf_name c.cl_statics in
 				if not cctx.is_native && not c.cl_extern && dup then error ("Same field name can't be use for both static and instance : " ^ cf.cf_name) p;
-				if fctx.is_override then c.cl_overrides <- cf :: c.cl_overrides;
+				if fctx.override <> None then c.cl_overrides <- cf :: c.cl_overrides;
 				let is_var cf = match cf.cf_kind with | Var _ -> true | _ -> false in
 				if PMap.mem cf.cf_name (if fctx.is_static then c.cl_statics else c.cl_fields) then
 					if ctx.com.config.pf_overload && Meta.has Meta.Overload cf.cf_meta && not (is_var cf) then

+ 1 - 1
tests/display/src/cases/Issue5999.hx

@@ -3,7 +3,7 @@ package cases;
 class Issue5999 extends DisplayTestCase {
 	/**
 	class Main {
-		static inline {-1-}var value = 1;{-2-}
+		{-1-}static inline var value = 1;{-2-}
 
 		static public function main() {
 			trace(val{-3-}ue);

+ 1 - 1
tests/display/src/cases/Issue6422.hx

@@ -7,7 +7,7 @@ class Issue6422 extends DisplayTestCase {
 			pro{-1-}perty;
 		}
 
-		static {-2-}var property(get, set):Int;{-3-}
+		{-2-}static var property(get, set):Int;{-3-}
 		static function get_property() return 0;
 		static function set_property(i) return 0;
 	}

+ 2 - 2
tests/display/src/cases/PropertyAccessors.hx

@@ -5,8 +5,8 @@ class PropertyAccessors extends DisplayTestCase {
 	class Main {
 		static var test(ge{-1-}t, se{-2-}t):String;
 
-		static public {-3-}function get_test() return "foo"{-4-};
-		static public {-5-}function set_test(s:String) return s{-6-};
+		{-3-}static public function get_test() return "foo"{-4-};
+		{-5-}static public function set_test(s:String) return s{-6-};
 
 		static function main() { }
 	}

+ 2 - 2
tests/display/src/cases/Super.hx

@@ -3,7 +3,7 @@ package cases;
 class Super extends DisplayTestCase {
 	/**
 	class Base<T> {
-		public {-1-}function new() { }{-2-}
+		{-1-}public function new() { }{-2-}
 	}
 	class Main extends Base<String> {
 		function new() {
@@ -19,7 +19,7 @@ class Super extends DisplayTestCase {
 
 	/**
 	{-1-}class Base<T> {
-		public {-4-}function test() { }{-5-}
+		{-4-}public function test() { }{-5-}
 	}{-2-}
 	class Main extends Base<String> {
 		override function test() {

+ 1 - 1
tests/misc/projects/Issue1968/compile.hxml.stderr

@@ -1,3 +1,3 @@
 <list>
-<pos>$$normPath(::cwd::/Main.hx, true):4: characters 19-62</pos>
+<pos>$$normPath(::cwd::/Main.hx, true):4: characters 5-62</pos>
 </list>

+ 1 - 1
tests/misc/projects/Issue3361/compile1-fail.hxml.stderr

@@ -1,4 +1,4 @@
 Main.hx:5: lines 5-8 : Field v has different type than in I
-Main.hx:2: characters 9-29 : Interface field is defined here
+Main.hx:2: characters 2-29 : Interface field is defined here
 Main.hx:5: lines 5-8 : String -> Void should be Dynamic -> Void
 Main.hx:5: lines 5-8 : String should be Dynamic

+ 4 - 4
tests/misc/projects/Issue3361/compile2-fail.hxml.stderr

@@ -1,4 +1,4 @@
-Main2.hx:6: characters 17-46 : Field f has different type than in I
-Main2.hx:2: characters 17-44 : Interface field is defined here
-Main2.hx:6: characters 17-46 : s : String -> Void should be d : Dynamic -> Void
-Main2.hx:6: characters 17-46 : String should be Dynamic
+Main2.hx:6: characters 2-46 : Field f has different type than in I
+Main2.hx:2: characters 2-44 : Interface field is defined here
+Main2.hx:6: characters 2-46 : s : String -> Void should be d : Dynamic -> Void
+Main2.hx:6: characters 2-46 : String should be Dynamic

+ 2 - 2
tests/misc/projects/Issue3417/compile-fail.hxml.stderr

@@ -1,3 +1,3 @@
-Main.hx:6: characters 12-27 : Field f has different type than in I
+Main.hx:6: characters 5-27 : Field f has different type than in I
 Main.hx:2: characters 5-28 : Interface field is defined here
-Main.hx:6: characters 12-27 : Different number of function arguments
+Main.hx:6: characters 5-27 : Different number of function arguments

+ 1 - 1
tests/misc/projects/Issue3726/compile-2-fail.hxml.stderr

@@ -1 +1 @@
-Main2.hx:3: characters 12-44 : Method get_test is no valid accessor for test because it is static
+Main2.hx:3: characters 5-44 : Method get_test is no valid accessor for test because it is static

+ 1 - 1
tests/misc/projects/Issue6584/compile1-fail.hxml.stderr

@@ -1 +1 @@
-Main1.hx:2: characters 9-17 : v: Static final variable must be initialized
+Main1.hx:2: characters 2-17 : v: Static final variable must be initialized