Преглед на файлове

[display] rework position handling

closes #7151
Simon Krajewski преди 7 години
родител
ревизия
d729eb72ee

+ 2 - 7
src/compiler/displayOutput.ml

@@ -503,14 +503,11 @@ let handle_display_argument com file_pos pre_compilation did_something =
 		let file, pos = try ExtString.String.split file_pos "@" with _ -> failwith ("Invalid format: " ^ file_pos) in
 		let file = unquote file in
 		let pos, smode = try ExtString.String.split pos "@" with _ -> pos,"" in
-		let offset = ref 0 in
 		let mode = match smode with
 			| "position" ->
-				offset := 1;
 				Common.define com Define.NoCOpt;
 				DMDefinition
 			| "usage" ->
-				offset := 1;
 				Common.define com Define.NoCOpt;
 				DMUsage false
 			(*| "rename" ->
@@ -519,7 +516,6 @@ let handle_display_argument com file_pos pre_compilation did_something =
 			| "package" ->
 				DMPackage
 			| "type" ->
-				offset := 1;
 				Common.define com Define.NoCOpt;
 				DMHover
 			| "toplevel" ->
@@ -534,7 +530,6 @@ let handle_display_argument com file_pos pre_compilation did_something =
 				Common.define com Define.NoCOpt;
 				DMStatistics
 			| "signature" ->
-				offset := 1;
 				Common.define com Define.NoCOpt;
 				DMSignature
 			| "" ->
@@ -557,8 +552,8 @@ let handle_display_argument com file_pos pre_compilation did_something =
 		Parser.use_doc := true;
 		DisplayPosition.display_position := {
 			pfile = Path.unique_full_path file;
-			pmin = pos + !offset;
-			pmax = pos + !offset;
+			pmin = pos;
+			pmax = pos;
 		}
 
 let process_display_file com classes =

+ 10 - 6
src/context/display/display.ml

@@ -13,9 +13,14 @@ open DisplayPosition
 let reference_position = ref ("",null_pos,KVar)
 
 module ExprPreprocessing = struct
-	let find_before_pos com is_completion e =
+	let find_before_pos com dm e =
+
 		let display_pos = ref (!DisplayPosition.display_position) in
-		let is_annotated p = encloses_position !display_pos p in
+		let is_annotated,is_completion = match dm with
+			| DMDefault -> (fun p -> encloses_position !display_pos p),true
+			| DMHover -> (fun p -> encloses_position_gt !display_pos p),false
+			| _ -> (fun p -> encloses_position !display_pos p),false
+		in
 		let annotate e dk =
 			display_pos := { pfile = ""; pmin = -2; pmax = -2 };
 			(EDisplay(e,dk),pos e)
@@ -157,8 +162,8 @@ module ExprPreprocessing = struct
 					el = [] || List.exists (fun (e,_) -> match e with EDisplay(_,DKMarked) -> true | _ -> false) el
 				in
 				if not !Parser.was_auto_triggered || call_arg_is_marked () then begin
-					found := true;
-					Parser.mk_display_expr e DKCall
+				found := true;
+				Parser.mk_display_expr e DKCall
 				end else
 					e
 			| _ -> e
@@ -168,8 +173,7 @@ module ExprPreprocessing = struct
 
 
 	let process_expr com e = match com.display.dms_kind with
-		| DMDefinition | DMUsage _ | DMHover -> find_before_pos com false e
-		| DMDefault -> find_before_pos com true e
+		| DMDefinition | DMUsage _ | DMHover | DMDefault -> find_before_pos com com.display.dms_kind e
 		| DMSignature -> find_display_call e
 		| _ -> e
 end

+ 7 - 8
src/context/display/displayJson.ml

@@ -160,7 +160,7 @@ class display_handler (jsonrpc : jsonrpc_handler) com cs = object(self)
 		Common.define_value com Define.Display "1";
 		Parser.use_doc := true;
 
-	method set_display_file was_auto_triggered requires_offset is_completion =
+	method set_display_file was_auto_triggered requires_offset =
 		let file = jsonrpc#get_string_param "file" in
 		let file = Path.unique_full_path file in
 		let pos = if requires_offset then jsonrpc#get_int_param "offset" else (-1) in
@@ -172,7 +172,6 @@ class display_handler (jsonrpc : jsonrpc_handler) com cs = object(self)
 			Some s
 		) None;
 		Parser.was_auto_triggered := was_auto_triggered;
-		let pos = if pos <> (-1) && not is_completion then pos + 1 else pos in
 		DisplayPosition.display_position := {
 			pfile = file;
 			pmin = pos;
@@ -220,30 +219,30 @@ let handler =
 			end
 		);
 		"display/completion", (fun hctx ->
-			hctx.display#set_display_file (hctx.jsonrpc#get_bool_param "wasAutoTriggered") true true;
+			hctx.display#set_display_file (hctx.jsonrpc#get_bool_param "wasAutoTriggered") true;
 			hctx.display#enable_display DMDefault;
 		);
 		"display/definition", (fun hctx ->
 			Common.define hctx.com Define.NoCOpt;
-			hctx.display#set_display_file false true false;
+			hctx.display#set_display_file false true;
 			hctx.display#enable_display DMDefinition;
 		);
 		"display/findReferences", (fun hctx ->
 			Common.define hctx.com Define.NoCOpt;
-			hctx.display#set_display_file false true false;
+			hctx.display#set_display_file false true;
 			hctx.display#enable_display (DMUsage false);
 		);
 		"display/hover", (fun hctx ->
 			Common.define hctx.com Define.NoCOpt;
-			hctx.display#set_display_file false true false;
+			hctx.display#set_display_file false true;
 			hctx.display#enable_display DMHover;
 		);
 		"display/package", (fun hctx ->
-			hctx.display#set_display_file false false false;
+			hctx.display#set_display_file false false;
 			hctx.display#enable_display DMPackage;
 		);
 		"display/signatureHelp", (fun hctx ->
-			hctx.display#set_display_file (hctx.jsonrpc#get_bool_param "wasAutoTriggered") true false;
+			hctx.display#set_display_file (hctx.jsonrpc#get_bool_param "wasAutoTriggered") true;
 			hctx.display#enable_display DMSignature
 		);
 		"server/readClassPaths", (fun hctx ->

+ 4 - 1
src/core/display/displayPosition.ml

@@ -6,7 +6,10 @@ let is_display_file file =
 	file <> "?" && Path.unique_full_path file = !display_position.pfile
 
 let encloses_position p_target p =
-	p.pmin < p_target.pmin && p.pmax >= p_target.pmax
+	p.pmin <= p_target.pmin && p.pmax >= p_target.pmax
+
+let encloses_position_gt p_target p =
+	p.pmin <= p_target.pmin && p.pmax > p_target.pmax
 
 let encloses_display_position p =
 	encloses_position !display_position p

+ 3 - 3
src/syntax/grammar.mly

@@ -1315,7 +1315,7 @@ and parse_call_params f p1 s =
 				if not (is_signature_display()) then e
 				else begin
 					let p = punion p1 p2 in
-					if encloses_display_position p then (mk_display_expr e DKMarked)
+					if encloses_position_gt !display_position p then (mk_display_expr e DKMarked)
 					else e
 				end
 			in
@@ -1356,8 +1356,8 @@ and expr_or_fail fail s =
 		let last = last_token s in
 		let plast = pos last in
 		let offset = match fst last with
-			| Const _ | Kwd _ | Dollar _ -> 0
-			| _ -> -1
+			| Const _ | Kwd _ | Dollar _ -> 1
+			| _ -> 0
 		in
 		let plast = {plast with pmin = plast.pmax + offset} in
 		mk_null_expr (punion_next plast s)

+ 5 - 1
src/syntax/parser.ml

@@ -212,8 +212,12 @@ let make_is e (t,p_t) p p_is =
 	ECall(e_is,[e;e2]),p
 
 let next_token s = match Stream.peek s with
+	| Some (Eof,p) ->
+		(Eof,{p with pmax = max_int})
 	| Some tk -> tk
-	| _ -> last_token s
+	| None ->
+		let last_pos = pos (last_token s) in
+		(Eof,{last_pos with pmax = max_int})
 
 let next_pos s = pos (next_token s)
 

+ 2 - 1
tests/display/src/cases/Basic.hx

@@ -17,13 +17,14 @@ class Basic extends DisplayTestCase {
 	class Some {
 		function main() {
 			var {-1-}variable{-2-} = 5;
-			{-3-}variabl{-4-}e;
+			{-3-}variabl{-4-}e{-5-};
 		}
 	}
 	**/
 	function testPosition1() {
 		eq(range(1, 2), position(pos(3)));
 		eq(range(1, 2), position(pos(4)));
+		eq(range(1, 2), position(pos(5)));
 	}
 
 	/**