Browse Source

[display] add compatibleTypes to expected type completion

closes #9955
:)
Simon Krajewski 4 years ago
parent
commit
26ee18316d
3 changed files with 29 additions and 6 deletions
  1. 12 5
      src/core/displayTypes.ml
  2. 14 1
      src/typing/typerDisplay.ml
  3. 3 0
      std/haxe/display/Display.hx

+ 12 - 5
src/core/displayTypes.ml

@@ -100,10 +100,16 @@ module DiagnosticsKind = struct
 end
 end
 
 
 module CompletionResultKind = struct
 module CompletionResultKind = struct
+	type expected_type_completion = {
+		expected_type : CompletionItem.CompletionType.t;
+		expected_type_followed : CompletionItem.CompletionType.t;
+		compatible_types : CompletionItem.CompletionType.t list;
+	}
+
 	type t =
 	type t =
 		| CRField of CompletionItem.t * pos * Type.t option * (Type.t * Type.t) option
 		| CRField of CompletionItem.t * pos * Type.t option * (Type.t * Type.t) option
 		| CRStructureField
 		| CRStructureField
-		| CRToplevel of (CompletionItem.CompletionType.t * CompletionItem.CompletionType.t) option
+		| CRToplevel of expected_type_completion option
 		| CRMetadata
 		| CRMetadata
 		| CRTypeHint
 		| CRTypeHint
 		| CRExtends
 		| CRExtends
@@ -112,7 +118,7 @@ module CompletionResultKind = struct
 		| CRImport
 		| CRImport
 		| CRUsing
 		| CRUsing
 		| CRNew
 		| CRNew
-		| CRPattern of (CompletionItem.CompletionType.t * CompletionItem.CompletionType.t) option * bool
+		| CRPattern of expected_type_completion option * bool
 		| CROverride
 		| CROverride
 		| CRTypeRelation
 		| CRTypeRelation
 		| CRTypeDecl
 		| CRTypeDecl
@@ -120,9 +126,10 @@ module CompletionResultKind = struct
 	let to_json ctx kind =
 	let to_json ctx kind =
 		let expected_type_fields t = match t with
 		let expected_type_fields t = match t with
 			| None -> []
 			| None -> []
-			| Some(ct1,ct2) -> [
-					"expectedType",CompletionItem.CompletionType.to_json ctx ct1;
-					"expectedTypeFollowed",CompletionItem.CompletionType.to_json ctx ct2;
+			| Some ext -> [
+					"expectedType",CompletionItem.CompletionType.to_json ctx ext.expected_type;
+					"expectedTypeFollowed",CompletionItem.CompletionType.to_json ctx ext.expected_type_followed;
+					"compatibleTypes",jarray (List.map (CompletionItem.CompletionType.to_json ctx) ext.compatible_types);
 				]
 				]
 		in
 		in
 		let i,args = match kind with
 		let i,args = match kind with

+ 14 - 1
src/typing/typerDisplay.ml

@@ -147,7 +147,20 @@ let get_expected_type ctx with_type =
 		| None -> None
 		| None -> None
 		| Some t ->
 		| Some t ->
 			let from_type = CompletionType.from_type (get_import_status ctx) in
 			let from_type = CompletionType.from_type (get_import_status ctx) in
-			Some (from_type t,from_type (Type.map follow (follow t)))
+			let t_followed = Type.map follow (follow t) in
+			let compatible = match t_followed with
+					| TInst(c,tl) when Meta.has Meta.StructInit c.cl_meta ->
+						let fields = Some (get_struct_init_anon_fields c tl) in
+						let ta = mk_anon ?fields (ref Closed) in
+						[from_type ta]
+					| _ ->
+						[]
+			in
+			Some {
+				expected_type = from_type t;
+				expected_type_followed = from_type t_followed;
+				compatible_types = compatible;
+			}
 
 
 let raise_toplevel ctx dk with_type (subject,psubject) =
 let raise_toplevel ctx dk with_type (subject,psubject) =
 	let expected_type = get_expected_type ctx with_type in
 	let expected_type = get_expected_type ctx with_type in

+ 3 - 0
std/haxe/display/Display.hx

@@ -413,6 +413,7 @@ typedef FieldCompletionSubject<T> = DisplayItemOccurrence<T> & {
 typedef ToplevelCompletion<T> = {
 typedef ToplevelCompletion<T> = {
 	var ?expectedType:JsonType<T>;
 	var ?expectedType:JsonType<T>;
 	var ?expectedTypeFollowed:JsonType<T>;
 	var ?expectedTypeFollowed:JsonType<T>;
+	var ?compatibleTypes:Array<JsonType<Dynamic>>;
 }
 }
 
 
 typedef StructExtensionCompletion = {
 typedef StructExtensionCompletion = {
@@ -476,10 +477,12 @@ enum abstract FindReferencesKind(String) to String {
 		Does not look for references to parent or overriding methods.
 		Does not look for references to parent or overriding methods.
 	**/
 	**/
 	var Direct = "direct";
 	var Direct = "direct";
+
 	/**
 	/**
 		Find references to the base field and all the overidding fields in the inheritance chain.
 		Find references to the base field and all the overidding fields in the inheritance chain.
 	**/
 	**/
 	var WithBaseAndDescendants = "withBaseAndDescendants";
 	var WithBaseAndDescendants = "withBaseAndDescendants";
+
 	/**
 	/**
 		Find references to the requested field and references to all
 		Find references to the requested field and references to all
 		descendants of the requested field.
 		descendants of the requested field.