Browse Source

added class field position tracking

Nicolas Cannasse 14 years ago
parent
commit
f4df72b062
9 changed files with 23 additions and 6 deletions
  1. 3 2
      codegen.ml
  2. 1 1
      gencpp.ml
  3. 5 0
      interp.ml
  4. 1 1
      optimizer.ml
  5. 2 0
      std/haxe/macro/Type.hx
  6. 1 0
      type.ml
  7. 2 1
      typecore.ml
  8. 4 0
      typeload.ml
  9. 4 1
      typer.ml

+ 3 - 2
codegen.ml

@@ -275,6 +275,7 @@ let extend_xml_proxy ctx c t file p =
 						cf_name = id;
 						cf_type = t;
 						cf_public = true;
+						cf_pos = p;
 						cf_doc = None;
 						cf_meta = no_meta;
 						cf_kind = Var { v_read = AccResolve; v_write = AccNo };
@@ -396,7 +397,7 @@ let on_generate ctx t =
 			| _ -> ()
 		) c.cl_meta;
 		if has_rtti c && not (PMap.mem "__rtti" c.cl_statics) then begin
-			let f = mk_field "__rtti" ctx.t.tstring in
+			let f = mk_field "__rtti" ctx.t.tstring c.cl_pos in
 			let str = Genxml.gen_type_string ctx.com t in
 			f.cf_expr <- Some (mk (TConst (TString str)) f.cf_type c.cl_pos);
 			c.cl_ordered_statics <- f :: c.cl_ordered_statics;
@@ -412,7 +413,7 @@ let on_generate ctx t =
 		(match build_metadata ctx.com t with
 		| None -> ()
 		| Some e ->
-			let f = mk_field "__meta__" t_dynamic in
+			let f = mk_field "__meta__" t_dynamic c.cl_pos in
 			f.cf_expr <- Some e;
 			c.cl_ordered_statics <- f :: c.cl_ordered_statics;
 			c.cl_statics <- PMap.add f.cf_name f c.cl_statics);

+ 1 - 1
gencpp.ml

@@ -2985,7 +2985,7 @@ let generate common_ctx =
 	(match common_ctx.main with
 	| None -> ()
 	| Some e ->
-		let main_field = { cf_name = "__main__"; cf_type = t_dynamic; cf_expr = Some e; cf_public = true; cf_meta = []; cf_doc = None; cf_kind = Var { v_read = AccNormal; v_write = AccNormal; }; cf_params = [] } in
+		let main_field = { cf_name = "__main__"; cf_type = t_dynamic; cf_expr = Some e; cf_pos = e.epos; cf_public = true; cf_meta = []; cf_doc = None; cf_kind = Var { v_read = AccNormal; v_write = AccNormal; }; cf_params = [] } in
 		let class_def = { null_class with cl_path = ([],"@Main"); cl_ordered_statics = [main_field] } in
 		main_deps := find_referenced_types common_ctx (TClassDecl class_def) super_deps constructor_deps false;
 		generate_main common_ctx member_types super_deps class_def !boot_classes !init_classes);

+ 5 - 0
interp.ml

@@ -2924,6 +2924,10 @@ let encode_meta m set =
 			set (!meta);
 			VNull
 		));
+		"has", VFunction (Fun1 (fun k ->
+			let k = (try dec_string k with Invalid_expr -> raise Builtin_error) in
+			VBool (List.exists (fun (m,_,_) -> m = k) (!meta));
+		));
 	]
 
 let rec encode_tenum e =
@@ -2959,6 +2963,7 @@ and encode_cfield f =
 		"meta", encode_meta f.cf_meta (fun m -> f.cf_meta <- m);
 		"expr", (match f.cf_expr with None -> VNull | Some e -> encode_texpr e);
 		"kind", encode_field_kind f.cf_kind;
+		"pos", encode_pos f.cf_pos;
 	]
 
 and encode_field_kind k =

+ 1 - 1
optimizer.ml

@@ -186,7 +186,7 @@ let rec type_inline ctx cf f ethis params tret p =
 				let _, ef = List.assoc (local s) inlined_vars in
 				match ef.eexpr, follow ef.etype with
 				| TFunction func, TFun (_,rt) ->					
-					let cf = { cf_name = ""; cf_params = []; cf_type = ef.etype; cf_public = true; cf_doc = None; cf_meta = no_meta; cf_kind = Var { v_read = AccNormal; v_write = AccNo }; cf_expr = None } in
+					let cf = mk_field "" ef.etype e.epos in
 					let inl = (try type_inline ctx cf func ethis el rt e.epos with Error (Custom _,_) -> None) in
 					(match inl with
 					| None -> raise Not_found

+ 2 - 0
std/haxe/macro/Type.hx

@@ -63,6 +63,7 @@ typedef ClassField = {
 	var meta : Metadata;
 	var kind : FieldKind;
 	var expr : Null<TypedExpr>;
+	var pos : Expr.Position;
 }
 
 typedef ClassType = {> BaseType,
@@ -99,6 +100,7 @@ typedef Metadata = {
 	function get() : Array<{ name : String, params : Array<Expr>, pos : Expr.Position }>;
 	function add( name : String, params : Array<Expr>, pos : Expr.Position ) : Void;
 	function remove( name : String ) : Void;
+	function has( name : String ) : Bool;
 }
 
 enum FieldKind {

+ 1 - 0
type.ml

@@ -123,6 +123,7 @@ and tclass_field = {
 	cf_name : string;
 	mutable cf_type : t;
 	cf_public : bool;
+	cf_pos : pos;
 	mutable cf_doc : Ast.documentation;
 	mutable cf_meta : metadata;
 	mutable cf_kind : field_kind;

+ 2 - 1
typecore.ml

@@ -234,9 +234,10 @@ let mk_anon fl = TAnon { a_fields = fl; a_status = not_opened; }
 let delay ctx f =
 	ctx.g.delayed <- f :: ctx.g.delayed
 
-let mk_field name t = {
+let mk_field name t p = {
 	cf_name = name;
 	cf_type = t;
+	cf_pos = p;
 	cf_doc = None;
 	cf_meta = no_meta;
 	cf_public = true;

+ 4 - 0
typeload.ml

@@ -222,6 +222,7 @@ and load_complex_type ctx p t =
 			PMap.add n {
 				cf_name = n;
 				cf_type = t;
+				cf_pos = p;
 				cf_public = (match pub with None -> true | Some p -> p);
 				cf_kind = access;
 				cf_params = [];
@@ -854,6 +855,7 @@ let init_class ctx c p herits fields =
 				cf_doc = f.cff_doc;
 				cf_meta = f.cff_meta;
 				cf_type = t;
+				cf_pos = f.cff_pos;
 				cf_kind = Var (if inline then { v_read = AccInline ; v_write = AccNever } else { v_read = AccNormal; v_write = AccNormal });
 				cf_expr = None;
 				cf_public = is_public f.cff_access None;
@@ -965,6 +967,7 @@ let init_class ctx c p herits fields =
 				cf_doc = f.cff_doc;
 				cf_meta = f.cff_meta;
 				cf_type = t;
+				cf_pos = f.cff_pos;
 				cf_kind = Method (if is_macro then MethMacro else if inline then MethInline else if dynamic then MethDynamic else MethNormal);
 				cf_expr = None;
 				cf_public = is_public f.cff_access parent;
@@ -1045,6 +1048,7 @@ let init_class ctx c p herits fields =
 				cf_name = name;
 				cf_doc = f.cff_doc;
 				cf_meta = f.cff_meta;
+				cf_pos = f.cff_pos;
 				cf_kind = Var { v_read = get; v_write = set };
 				cf_expr = None;
 				cf_type = ret;

+ 4 - 1
typer.ml

@@ -229,6 +229,7 @@ let rec type_module_type ctx t tparams p =
 					| TFun _ -> Method MethNormal
 					| _ -> Var { v_read = AccNormal; v_write = AccNo }
 				);
+				cf_pos = e.e_pos;
 				cf_doc = None;
 				cf_meta = no_meta;
 				cf_expr = None;
@@ -592,6 +593,7 @@ let rec type_field ctx e i p mode =
 				cf_doc = None;
 				cf_meta = no_meta;
 				cf_public = true;
+				cf_pos = p;
 				cf_kind = Var { v_read = AccNormal; v_write = (match mode with MSet -> AccNormal | MGet | MCall -> AccNo) };
 				cf_expr = None;
 				cf_params = [];
@@ -607,6 +609,7 @@ let rec type_field ctx e i p mode =
 			cf_doc = None;
 			cf_meta = no_meta;
 			cf_public = true;
+			cf_pos = p;
 			cf_kind = Var { v_read = AccNormal; v_write = (match mode with MSet -> AccNormal | MGet | MCall -> AccNo) };
 			cf_expr = None;
 			cf_params = [];
@@ -1260,7 +1263,7 @@ and type_expr ctx ?(need_val=true) (e,p) =
 		let rec loop (l,acc) (f,e) =
 			if PMap.mem f acc then error ("Duplicate field in object declaration : " ^ f) p;
 			let e = type_expr ctx e in
-			let cf = mk_field f e.etype in
+			let cf = mk_field f e.etype e.epos in
 			((f,e) :: l, PMap.add f cf acc)
 		in
 		let fields , types = List.fold_left loop ([],PMap.empty) fl in