浏览代码

save arguments meta in metadata of the function

Aleksandr Kuzmenko 5 年之前
父节点
当前提交
5891314e6d
共有 4 个文件被更改,包括 16 次插入6 次删除
  1. 6 0
      src-json/meta.json
  2. 8 4
      src/typing/typeload.ml
  3. 1 1
      src/typing/typeloadFields.ml
  4. 1 1
      src/typing/typer.ml

+ 6 - 0
src-json/meta.json

@@ -1212,6 +1212,12 @@
 		"doc": "Used to store default values for fields and function arguments.",
 		"targets": ["TClassField"]
 	},
+	{
+		"name": "Arguments",
+		"metadata": ":arguments",
+		"doc": "Used to store function arguments.",
+		"targets": ["TClassField"]
+	},
 	{
 		"name": "Void",
 		"metadata": ":void",

+ 8 - 4
src/typing/typeload.ml

@@ -202,11 +202,15 @@ let check_param_constraints ctx types t pl c p =
 
 		) ctl
 
-let generate_value_meta com co fadd args =
+let generate_args_meta com cls_opt add_meta args =
 	let values = List.fold_left (fun acc ((name,p),_,_,_,eo) -> match eo with Some e -> ((name,p,NoQuotes),e) :: acc | _ -> acc) [] args in
-	match values with
+	(match values with
 		| [] -> ()
-		| _ -> fadd (Meta.Value,[EObjectDecl values,null_pos],null_pos)
+		| _ -> add_meta (Meta.Value,[EObjectDecl values,null_pos],null_pos)
+	);
+	if List.exists (fun (_,_,m,_,_) -> m <> []) args then
+		let fn = { f_params = []; f_args = args; f_type = None; f_expr = None } in
+		add_meta (Meta.Arguments,[EFunction(FKAnonymous,fn),null_pos],null_pos)
 
 let is_redefined ctx cf1 fields p =
 	try
@@ -573,7 +577,7 @@ and init_meta_overloads ctx co cf =
 			let topt = function None -> error "Explicit type required" p | Some t -> load_complex_type ctx true t in
 			let args = List.map (fun ((a,_),opt,_,t,cto) -> a,opt || cto <> None,topt t) f.f_args in
 			let cf = { cf with cf_type = TFun (args,topt f.f_type); cf_params = params; cf_meta = cf_meta} in
-			generate_value_meta ctx.com co (fun meta -> cf.cf_meta <- meta :: cf.cf_meta) f.f_args;
+			generate_args_meta ctx.com co (fun meta -> cf.cf_meta <- meta :: cf.cf_meta) f.f_args;
 			overloads := cf :: !overloads;
 			ctx.type_params <- old;
 			false

+ 1 - 1
src/typing/typeloadFields.ml

@@ -1141,7 +1141,7 @@ let create_method (ctx,cctx,fctx) c f fd p =
 			with Not_found ->
 				()
 	) parent;
-	generate_value_meta ctx.com (Some c) (fun meta -> cf.cf_meta <- meta :: cf.cf_meta) fd.f_args;
+	generate_args_meta ctx.com (Some c) (fun meta -> cf.cf_meta <- meta :: cf.cf_meta) fd.f_args;
 	check_abstract (ctx,cctx,fctx) c cf fd t ret p;
 	init_meta_overloads ctx (Some c) cf;
 	ctx.curfield <- cf;

+ 1 - 1
src/typing/typer.ml

@@ -2120,7 +2120,7 @@ and type_local_function ctx kind f with_type p =
 	match v with
 	| None -> e
 	| Some v ->
-		Typeload.generate_value_meta ctx.com None (fun m -> v.v_meta <- m :: v.v_meta) f.f_args;
+		Typeload.generate_args_meta ctx.com None (fun m -> v.v_meta <- m :: v.v_meta) f.f_args;
 		let open LocalUsage in
 		if params <> [] || inline then v.v_extra <- Some (params,if inline then Some e else None);
 		let rec loop = function