Browse Source

added isAbstract to display protocol (#9720)

Aleksandr Kuzmenko 4 years ago
parent
commit
1fc53befb8
2 changed files with 20 additions and 10 deletions
  1. 18 10
      src/core/display/completionItem.ml
  2. 2 0
      src/core/json/genjson.ml

+ 18 - 10
src/core/display/completionItem.ml

@@ -70,6 +70,7 @@ module CompletionModuleType = struct
 		doc : documentation;
 		doc : documentation;
 		is_extern : bool;
 		is_extern : bool;
 		is_final : bool;
 		is_final : bool;
+		is_abstract : bool;
 		kind : CompletionModuleKind.t;
 		kind : CompletionModuleKind.t;
 		has_constructor : not_bool;
 		has_constructor : not_bool;
 		source : module_type_source;
 		source : module_type_source;
@@ -97,6 +98,7 @@ module CompletionModuleType = struct
 				doc = d.d_doc;
 				doc = d.d_doc;
 				is_extern = List.mem HExtern d.d_flags;
 				is_extern = List.mem HExtern d.d_flags;
 				is_final = List.mem HFinal d.d_flags;
 				is_final = List.mem HFinal d.d_flags;
+				is_abstract = List.mem HAbstract d.d_flags;
 				kind = if List.mem HInterface d.d_flags then Interface else Class;
 				kind = if List.mem HInterface d.d_flags then Interface else Class;
 				has_constructor = ctor;
 				has_constructor = ctor;
 				source = Syntax td;
 				source = Syntax td;
@@ -112,6 +114,7 @@ module CompletionModuleType = struct
 				doc = d.d_doc;
 				doc = d.d_doc;
 				is_extern = List.mem EExtern d.d_flags;
 				is_extern = List.mem EExtern d.d_flags;
 				is_final = false;
 				is_final = false;
+				is_abstract = false;
 				kind = Enum;
 				kind = Enum;
 				has_constructor = No;
 				has_constructor = No;
 				source = Syntax td;
 				source = Syntax td;
@@ -129,6 +132,7 @@ module CompletionModuleType = struct
 				doc = d.d_doc;
 				doc = d.d_doc;
 				is_extern = List.mem EExtern d.d_flags;
 				is_extern = List.mem EExtern d.d_flags;
 				is_final = false;
 				is_final = false;
+				is_abstract = false;
 				kind = kind;
 				kind = kind;
 				has_constructor = if kind = Struct then No else Maybe;
 				has_constructor = if kind = Struct then No else Maybe;
 				source = Syntax td;
 				source = Syntax td;
@@ -152,6 +156,7 @@ module CompletionModuleType = struct
 				doc = d.d_doc;
 				doc = d.d_doc;
 				is_extern = List.mem AbExtern d.d_flags;
 				is_extern = List.mem AbExtern d.d_flags;
 				is_final = false;
 				is_final = false;
+				is_abstract = false;
 				kind = if List.mem AbEnum d.d_flags then EnumAbstract else Abstract;
 				kind = if List.mem AbEnum d.d_flags then EnumAbstract else Abstract;
 				has_constructor = ctor;
 				has_constructor = ctor;
 				source = Syntax td;
 				source = Syntax td;
@@ -168,6 +173,7 @@ module CompletionModuleType = struct
 				doc = d.d_doc;
 				doc = d.d_doc;
 				is_extern = List.exists (fun (f,_) -> f = AExtern) d.d_flags;
 				is_extern = List.exists (fun (f,_) -> f = AExtern) d.d_flags;
 				is_final = true;
 				is_final = true;
+				is_abstract = false;
 				kind = Static;
 				kind = Static;
 				has_constructor = No;
 				has_constructor = No;
 				source = Syntax td;
 				source = Syntax td;
@@ -195,27 +201,27 @@ module CompletionModuleType = struct
 		in
 		in
 		let rec ctor_info = function
 		let rec ctor_info = function
 			| TClassDecl c ->
 			| TClassDecl c ->
-				(has_class_flag c CExtern),has_class_flag c CFinal,(if (has_class_flag c CInterface) then Interface else Class),ctor c
+				(has_class_flag c CExtern),has_class_flag c CFinal,has_class_flag c CAbstract,(if (has_class_flag c CInterface) then Interface else Class),ctor c
 			| TEnumDecl en ->
 			| TEnumDecl en ->
-				en.e_extern,false,Enum,No
+				en.e_extern,false,false,Enum,No
 			| TTypeDecl td ->
 			| TTypeDecl td ->
 				let kind,ctor = match follow td.t_type with
 				let kind,ctor = match follow td.t_type with
 					| TAnon _ -> Struct,No
 					| TAnon _ -> Struct,No
 					| TInst(c,_) -> TypeAlias,ctor c
 					| TInst(c,_) -> TypeAlias,ctor c
-					| TAbstract(a,_) -> let _,_,_,ctor = ctor_info (TAbstractDecl a) in TypeAlias,ctor
+					| TAbstract(a,_) -> let _,_,_,_,ctor = ctor_info (TAbstractDecl a) in TypeAlias,ctor
 					| _ -> TypeAlias,No
 					| _ -> TypeAlias,No
 				in
 				in
-				false,false,kind,ctor
+				false,false,false,kind,ctor
 			| TAbstractDecl a ->
 			| TAbstractDecl a ->
 				let kind = if a.a_enum then EnumAbstract else Abstract in
 				let kind = if a.a_enum then EnumAbstract else Abstract in
-				let is_extern,is_final,ctor = match Abstract.follow_with_forward_ctor (TAbstract(a,List.map snd a.a_params)) with
-					| TInst(c,_) -> let is_extern,is_final,_,ctor = ctor_info (TClassDecl c) in is_extern,is_final,ctor
-					| TAbstract(a,_) -> false,false,actor a
-					| _ -> false,false,No
+				let is_extern,is_final,is_abstract,ctor = match Abstract.follow_with_forward_ctor (TAbstract(a,List.map snd a.a_params)) with
+					| TInst(c,_) -> let is_extern,is_final,is_abstract,_,ctor = ctor_info (TClassDecl c) in is_extern,is_final,is_abstract,ctor
+					| TAbstract(a,_) -> false,false,false,actor a
+					| _ -> false,false,false,No
 				in
 				in
-				is_extern,is_final,kind,ctor
+				is_extern,is_final,is_abstract,kind,ctor
 		in
 		in
-		let is_extern,is_final,kind,ctor = ctor_info mt in
+		let is_extern,is_final,is_abstract,kind,ctor = ctor_info mt in
 		let infos = t_infos mt in
 		let infos = t_infos mt in
 		let convert_type_param (s,t) = match follow t with
 		let convert_type_param (s,t) = match follow t with
 			| TInst(c,_) -> {
 			| TInst(c,_) -> {
@@ -238,6 +244,7 @@ module CompletionModuleType = struct
 			doc = infos.mt_doc;
 			doc = infos.mt_doc;
 			is_extern = is_extern;
 			is_extern = is_extern;
 			is_final = is_final;
 			is_final = is_final;
+			is_abstract = is_abstract;
 			kind = kind;
 			kind = kind;
 			has_constructor = ctor;
 			has_constructor = ctor;
 			source = Typed mt;
 			source = Typed mt;
@@ -261,6 +268,7 @@ module CompletionModuleType = struct
 				("params",jlist (generate_ast_type_param ctx) cm.params) ::
 				("params",jlist (generate_ast_type_param ctx) cm.params) ::
 				("isExtern",jbool cm.is_extern) ::
 				("isExtern",jbool cm.is_extern) ::
 				("isFinal",jbool cm.is_final) ::
 				("isFinal",jbool cm.is_final) ::
+				("isAbstract",jbool cm.is_abstract) ::
 				(if ctx.generation_mode = GMFull then ["doc",jopt jstring (gen_doc_text_opt cm.doc)] else [])
 				(if ctx.generation_mode = GMFull then ["doc",jopt jstring (gen_doc_text_opt cm.doc)] else [])
 			| GMMinimum ->
 			| GMMinimum ->
 				match generate_minimum_metadata ctx cm.meta with
 				match generate_minimum_metadata ctx cm.meta with

+ 2 - 0
src/core/json/genjson.ml

@@ -556,6 +556,7 @@ and generate_class_field' ctx cfs cf =
 		"type",generate_type ctx cf.cf_type;
 		"type",generate_type ctx cf.cf_type;
 		"isPublic",jbool (has_class_field_flag cf CfPublic);
 		"isPublic",jbool (has_class_field_flag cf CfPublic);
 		"isFinal",jbool (has_class_field_flag cf CfFinal);
 		"isFinal",jbool (has_class_field_flag cf CfFinal);
+		"isAbstract",jbool (has_class_field_flag cf CfAbstract);
 		"params",jlist (generate_type_parameter ctx) cf.cf_params;
 		"params",jlist (generate_type_parameter ctx) cf.cf_params;
 		"meta",generate_metadata ctx cf.cf_meta;
 		"meta",generate_metadata ctx cf.cf_meta;
 		"kind",generate_class_kind ();
 		"kind",generate_class_kind ();
@@ -627,6 +628,7 @@ let generate_class ctx c =
 		"overrides",jlist (classfield_ref ctx) (List.filter (fun cf -> has_class_field_flag cf CfOverride) c.cl_ordered_fields);
 		"overrides",jlist (classfield_ref ctx) (List.filter (fun cf -> has_class_field_flag cf CfOverride) c.cl_ordered_fields);
 		"isExtern",jbool (has_class_flag c CExtern);
 		"isExtern",jbool (has_class_flag c CExtern);
 		"isFinal",jbool (has_class_flag c CFinal);
 		"isFinal",jbool (has_class_flag c CFinal);
+		"isAbstract",jbool (has_class_flag c CAbstract);
 	]
 	]
 
 
 let generate_enum ctx e =
 let generate_enum ctx e =