فهرست منبع

[json] implement `generate_texpr`

but comment it out
Simon Krajewski 7 سال پیش
والد
کامیت
148839fe0d
1فایلهای تغییر یافته به همراه181 افزوده شده و 1 حذف شده
  1. 181 1
      src/core/json/genjson.ml

+ 181 - 1
src/core/json/genjson.ml

@@ -42,7 +42,10 @@ let class_ref ctx c = generate_path c.cl_path
 let enum_ref ctx en = generate_path en.e_path
 let typedef_ref ctx td = generate_path td.t_path
 let abstract_ref ctx a = generate_path a.a_path
+let moduletype_ref ctx mt = generate_path (t_path mt)
 let classfield_ref ctx cf = jstring cf.cf_name
+let enumfield_ref ctx ef = jstring ef.ef_name
+let local_ref ctx v = jint v.v_id
 
 let generate_pos ctx p =
 	jobject [
@@ -51,6 +54,9 @@ let generate_pos ctx p =
 		"max",jint p.pmax;
 	]
 
+let generate_expr_pos ctx p =
+	jtodo
+
 let generate_doc ctx d = match ctx.generation_mode with
 	| GMFull -> jopt jstring d
 	| GMWithoutDoc | GMMinimum -> jnull
@@ -254,8 +260,178 @@ and generate_tvar ctx v =
 	in
 	jobject fields
 
+and generate_tconstant ctx ct =
+	let name,args = match ct with
+		| TInt i32 -> "TInt",Some (jstring (Int32.to_string i32))
+		| TFloat s -> "TFloat",Some (jstring s)
+		| TString s -> "TString",Some (jstring s)
+		| TBool b -> "TBool",Some (jbool b)
+		| TNull -> "TNull",None
+		| TThis -> "TThis",None
+		| TSuper -> "TSuper",None
+	in
+	generate_adt ctx None name args
+
+and generate_tfunction ctx tf =
+	let generate_arg (v,cto) = jobject [
+		"v",generate_tvar ctx v;
+		"value",jopt (generate_tconstant ctx) cto;
+	] in
+	jobject [
+		"args",jlist generate_arg tf.tf_args;
+		"ret",generate_type ctx tf.tf_type;
+		"expr",generate_expr ctx tf.tf_expr;
+	]
+
 and generate_texpr ctx e =
 	jtodo
+	(* let name,args = match e.eexpr with
+	| TConst ct ->
+		"TConst",Some (generate_tconstant ctx ct)
+	| TLocal v ->
+		"TLocal",Some (local_ref ctx v)
+	| TArray(e1,e2) ->
+		"TArray",Some (jobject [
+			"expr1",generate_texpr ctx e1;
+			"expr2",generate_texpr ctx e2;
+		])
+	| TBinop(op,e1,e2) ->
+		"TBinop",Some (jobject [
+			"op",generate_binop ctx op;
+			"expr1",generate_texpr ctx e1;
+			"expr2",generate_texpr ctx e2;
+		]);
+	| TField(e1,fa) ->
+		"TField",Some (jobject [
+			"expr",generate_texpr ctx e1;
+			"name",jstring (field_name fa);
+			(* TODO *)
+		]);
+	| TTypeExpr mt ->
+		"TTypeExpr",Some (moduletype_ref ctx mt)
+	| TParenthesis e1 ->
+		"TParenthesis",Some (generate_texpr ctx e1)
+	| TObjectDecl fl ->
+		let generate_quote_status qs =
+			let name = match qs with
+				| DoubleQuotes -> "DoubleQuotes"
+				| NoQuotes -> "NoQuotes"
+			in
+			generate_adt ctx None name None
+		in
+		let generate_key (name,pos,qs) = jobject [
+			"name",jstring name;
+			"pos",generate_expr_pos ctx pos;
+			"quoteStatus",generate_quote_status qs;
+		] in
+		let generate_entry (key,value) = jobject [
+			"key",generate_key key;
+			"value",generate_texpr ctx value;
+		] in
+		let fields = List.map generate_entry fl in
+		"TObjectDecl",Some (jarray fields)
+	| TArrayDecl el ->
+		let fields = List.map (generate_texpr ctx) el in
+		"TArrayDecl",Some (jarray fields)
+	| TCall(e1,el) ->
+		let args = List.map (generate_texpr ctx) el in
+		"TCall",Some (jobject [
+			"expr",generate_texpr ctx e1;
+			"args",jarray args;
+		]);
+	| TNew(c,tl,el) ->
+		let args = List.map (generate_texpr ctx) el in
+		"TNew",Some (jobject [
+			"path",generate_path_with_params ctx c.cl_path tl;
+			"args",jarray args;
+		]);
+	| TUnop(op,flag,e1) ->
+		"TUnop",Some (jobject [
+			"op",generate_unop ctx op;
+			"prefix",jbool (flag = Prefix);
+			"expr",generate_texpr ctx e1;
+		]);
+	| TFunction tf ->
+		"TFunction",Some (generate_tfunction ctx tf)
+	| TVar(v,eo) ->
+		"TVar",Some (jobject [
+			"v",generate_tvar ctx v;
+			"expr",jopt (generate_texpr ctx) eo;
+		])
+	| TBlock el ->
+		let el = List.map (generate_texpr ctx) el in
+		"TBlock",Some (jarray el)
+	| TFor(v,e1,e2) ->
+		"TFor",Some (jobject [
+			"v",generate_tvar ctx v;
+			"expr1",generate_texpr ctx e1;
+			"expr2",generate_texpr ctx e2;
+		]);
+	| TIf(e1,e2,eo) ->
+		"TIf",Some (jobject [
+			"eif",generate_texpr ctx e1;
+			"ethen",generate_expr ctx e1;
+			"eelse",jopt (generate_expr ctx) eo;
+		]);
+	| TWhile(e1,e2,flag) ->
+		"TWhile",Some (jobject [
+			"econd",generate_texpr ctx e1;
+			"ebody",generate_texpr ctx e2;
+			"isDoWhile",jbool (flag = DoWhile);
+		]);
+	| TSwitch(e1,cases,edef) ->
+		let generate_case (el,e) = jobject [
+			"patterns",jlist (generate_texpr ctx) el;
+			"expr",generate_texpr ctx e;
+		] in
+		"TSwitch",Some (jobject [
+			"subject",generate_texpr ctx e1;
+			"cases",jlist generate_case cases;
+			"def",jopt (generate_texpr ctx) edef;
+		])
+	| TTry(e1,catches) ->
+		let generate_catch (v,e) = jobject [
+			"v",generate_tvar ctx v;
+			"expr",generate_texpr ctx e;
+		] in
+		"TTry",Some (jobject [
+			"expr",generate_texpr ctx e1;
+			"catches",jlist generate_catch catches;
+		])
+	| TReturn eo ->
+		"TReturn",Option.map (generate_texpr ctx) eo
+	| TBreak ->
+		"TBreak",None
+	| TContinue ->
+		"TContinue",None
+	| TThrow e1 ->
+		"TThrow",Some (generate_texpr ctx e1)
+	| TCast(e1,mto) ->
+		"TCast",Some (jobject [
+			"expr",generate_texpr ctx e1;
+			"moduleType",jopt (moduletype_ref ctx) mto;
+		]);
+	| TMeta(m,e1) ->
+		"TMeta",Some (jobject [
+			"meta",generate_metadata_entry ctx m;
+			"expr",generate_texpr ctx e1;
+		])
+	| TEnumParameter(e1,ef,i) ->
+		"TEnumParameter",Some (jobject [
+			"expr",generate_texpr ctx e1;
+			"enumField",enumfield_ref ctx ef;
+			"index",jint i;
+		]);
+	| TEnumIndex e1 ->
+		"TEnumIndex",Some (generate_texpr ctx e1)
+	| TIdent s ->
+		"TIdent",Some (jstring s)
+	in
+	jobject [
+		"expr",generate_adt ctx None name args;
+		(* TODO: pos? *)
+		"type",generate_type ctx e.etype;
+	] *)
 
 (* fields *)
 
@@ -289,6 +465,10 @@ and generate_class_field ctx cfs cf =
 		in
 		generate_adt ctx None name args
 	in
+	let expr = match ctx.generation_mode with
+		| GMFull | GMWithoutDoc -> jopt (generate_texpr ctx) cf.cf_expr
+		| GMMinimum -> jnull
+	in
 	jobject [
 		"name",jstring cf.cf_name;
 		"type",generate_type ctx cf.cf_type;
@@ -296,7 +476,7 @@ and generate_class_field ctx cfs cf =
 		"params",jlist (generate_type_parameter ctx) cf.cf_params;
 		"meta",generate_metadata ctx cf.cf_meta;
 		"kind",generate_class_kind ();
-		"expr",jopt (generate_texpr ctx) cf.cf_expr;
+		"expr",expr;
 		"pos",generate_pos ctx cf.cf_pos;
 		"doc",generate_doc ctx cf.cf_doc;
 		"overloads",jlist (generate_class_field ctx cfs) cf.cf_overloads;