Răsfoiți Sursa

[display] fix hover over `version` as a define

Jens Fischer 6 ani în urmă
părinte
comite
a74614bcd7
1 a modificat fișierele cu 39 adăugiri și 36 ștergeri
  1. 39 36
      src/typing/typeloadParse.ml

+ 39 - 36
src/typing/typeloadParse.ml

@@ -164,30 +164,24 @@ module ConditionDisplay = struct
 		| TVersion(r,p) -> Semver.to_string (r,p),t_semver
 
 	let check_condition com e =
-		let check = (if com.display.dms_kind = DMHover then
+		let check_position = (if com.display.dms_kind = DMHover then
 			encloses_position_gt
 		else
 			encloses_position
 		) display_position#get in
-		let rec loop (e,p) =
-			Ast.iter_expr loop (e,p);
-			if check p then raise (Result (e,p))
-		in
-		try
-			loop e;
-		with Result (e,p) ->
-			let v = eval com.defines (e,p) in
-			let tpair t = (t,CompletionItem.CompletionType.from_type (fun _ -> Imported) t) in
-			DisplayException.raise_hover (match e with
-				| EConst(Ident("version")) ->
+		let tpair t = (t,CompletionItem.CompletionType.from_type (fun _ -> Imported) t) in
+		let check_expr (e,p) =
+			match e with
+				| ECall ((EConst (Ident "version"),p),[(EConst (String(s,_)), _)])  ->
 					let t = TFun ([("s",false,com.basic.tstring)],t_semver) in
-					CompletionItem.make_ci_class_field {
-						field = {
-							cf_name = "version";
-							cf_type = t;
-							cf_pos = null_pos;
-							cf_name_pos = null_pos;
-							cf_doc = Some (
+					if check_position p then
+						DisplayException.raise_hover (CompletionItem.make_ci_class_field {
+							field = {
+								cf_name = "version";
+								cf_type = t;
+								cf_pos = null_pos;
+								cf_name_pos = null_pos;
+								cf_doc = Some (
 "Allows comparing defines (such as the version of a Haxelib or Haxe) with SemVer semantics.
 Both the define and the string passed to `version()` must be valid semantic versions.
 
@@ -200,28 +194,37 @@ Note: this syntax does not parse with Haxe versions earlier than 4.0.0-rc.3,
 so it should be avoided if backwards-compatibility with earlier versions is needed.
 
 @see https://semver.org/");
-							cf_meta = [];
-							cf_kind = Method MethNormal;
-							cf_params = [];
-							cf_expr = None;
-							cf_expr_unoptimized = None;
-							cf_overloads = [];
-							cf_flags = set_flag 0 (int_of_class_field_flag CfPublic);
-						};
-						scope = CFSStatic;
-						origin = BuiltIn;
-						is_qualified = true;
-					} (tpair t)
+								cf_meta = [];
+								cf_kind = Method MethNormal;
+								cf_params = [];
+								cf_expr = None;
+								cf_expr_unoptimized = None;
+								cf_overloads = [];
+								cf_flags = set_flag 0 (int_of_class_field_flag CfPublic);
+							};
+							scope = CFSStatic;
+							origin = BuiltIn;
+							is_qualified = true;
+						} (tpair t)) None p
 				| EConst(Ident(n)) ->
-					CompletionItem.make_ci_define n (match v with
+					let v = eval com.defines (e,p) in
+					DisplayException.raise_hover (CompletionItem.make_ci_define n (match v with
 						| TNull -> None
 						| TString s -> Some (StringHelper.s_escape s)
 						| _ -> assert false
-					) (tpair com.basic.tstring)
+					) (tpair com.basic.tstring)) None p
 				| _ ->
-					let s,t = convert_small_type com v in
-					CompletionItem.make_ci_literal s (tpair t)
-			) None p;
+					()
+		in
+		let rec loop (e,p) =
+			if check_position p then check_expr (e,p);
+			Ast.iter_expr loop (e,p);
+			if check_position p then
+				let v = eval com.defines (e,p) in
+				let s,t = convert_small_type com v in
+				DisplayException.raise_hover (CompletionItem.make_ci_literal s (tpair t)) None p
+		in
+		loop e;
 end
 
 module PdiHandler = struct