소스 검색

[display] fix display offset inconsistency

It turns out that modes like definition, references and hover really work differently from completion: A good example of this is `foo.|field` with the cursor being at the `|`. For completion, you would want to get the fields of `foo`, whereas with definition you would want to find the definition of `field`.

closes #6923
Simon Krajewski 7 년 전
부모
커밋
b2caf63afb

+ 6 - 2
src/compiler/displayOutput.ml

@@ -660,11 +660,14 @@ let handle_display_argument com file_pos pre_compilation did_something =
 		let pos, smode = try ExtString.String.split pos "@" with _ -> pos,"" in
 		Parser.is_completion := false;
 		Parser.had_resume := false;
+		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" ->
@@ -673,6 +676,7 @@ let handle_display_argument com file_pos pre_compilation did_something =
 			| "package" ->
 				DMPackage
 			| "type" ->
+				offset := 1;
 				Common.define com Define.NoCOpt;
 				DMHover
 			| "toplevel" ->
@@ -713,8 +717,8 @@ let handle_display_argument com file_pos pre_compilation did_something =
 		Parser.legacy_display := true;
 		Parser.resume_display := {
 			pfile = Path.unique_full_path file;
-			pmin = pos;
-			pmax = pos;
+			pmin = pos + !offset;
+			pmax = pos + !offset;
 		}
 
 let process_display_file com classes =

+ 6 - 5
src/context/displayJson.ml

@@ -65,10 +65,11 @@ let parse_input com input =
 			Common.define_value com Define.Display "1";
 			Parser.use_doc := true;
 		in
-		let read_display_file was_auto_triggered requires_offset =
+		let read_display_file was_auto_triggered requires_offset is_completion =
 			let file = get_string_param "file" in
 			let pos = if requires_offset then get_int_param "offset" else (-1) in
 			Parser.was_auto_triggered := was_auto_triggered;
+			let pos = if pos <> (-1) && not is_completion then pos + 1 else pos in
 			Parser.resume_display := {
 				pfile = Path.unique_full_path file;
 				pmin = pos;
@@ -83,19 +84,19 @@ let parse_input com input =
 					"capabilities",get_capabilities()
 				])))
 			| "textDocument/completion" ->
-				read_display_file (get_bool_param "wasAutoTriggered") true;
+				read_display_file (get_bool_param "wasAutoTriggered") true true;
 				Parser.is_completion := true;
 				enable_display DMDefault;
 			| "textDocument/definition" ->
 				Common.define com Define.NoCOpt;
-				read_display_file false true;
+				read_display_file false true false;
 				enable_display DMDefinition;
 			| "textDocument/hover" ->
 				Common.define com Define.NoCOpt;
-				read_display_file false true;
+				read_display_file false true false;
 				enable_display DMHover;
 			| "textDocument/package" ->
-				read_display_file false false;
+				read_display_file false false false;
 				enable_display DMPackage;
 			| _ -> raise_method_not_found id name
 		end;

+ 1 - 1
tests/display/src/cases/Abstract.hx

@@ -4,7 +4,7 @@ class Abstract extends DisplayTestCase {
 	/**
 	abstract A(Int) {
 		public function new({-3-}i{-4-}) {
-			this = i{-1-};
+			this = {-1-}i;
 			trace("f{-2-}oo");
 		}
 	}

+ 1 - 1
tests/display/src/cases/ArrowFunctions.hx

@@ -28,7 +28,7 @@ class ArrowFunctions extends DisplayTestCase {
 
     /**
     var arr = [1,2,3,4,5];
-    arr.map( a{-1-} -> a{-2-} + 1 )
+    arr.map( {-1-}a -> a{-2-} + 1 )
     **/
     @:funcCode function testHover(){
         eq("Int", type(pos(1)));

+ 4 - 3
tests/display/src/cases/Basic.hx

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

+ 2 - 2
tests/display/src/cases/BuildMacro.hx

@@ -16,7 +16,7 @@ class BuildMacro extends DisplayTestCase {
 	#end
 	class Main {
 		function te{-1-}st({-5-}na{-2-}me{-6-}:MySt{-3-}ring):MyStr{-4-}ing {
-			return {-9-}name{-10-};
+			return {-9-}nam{-10-}e{-11-};
 		}
 
 		static function main() { }
@@ -29,6 +29,6 @@ class BuildMacro extends DisplayTestCase {
 		eq(range(7, 8), position(pos(3)));
 		eq(range(7, 8), position(pos(4)));
 		eq(range(5, 6), position(pos(2)));
-		arrayEq([range(9, 10)], usage(pos(10)));
+		arrayEq([range(9, 11)], usage(pos(10)));
 	}
 }

+ 2 - 2
tests/display/src/cases/Issue5166.hx

@@ -8,7 +8,7 @@ class Issue5166 extends DisplayTestCase {
 
 	**/
 	function test() {
-		eq("cases.E", type(pos(1)));
-		eq(range(2, 1), position(pos(1)));
+		eq("cases.E", type(pos(2)));
+		eq(range(2, 1), position(pos(2)));
 	}
 }

+ 0 - 2
tests/display/src/cases/Issue5172.hx

@@ -14,8 +14,6 @@ class Issue5172 extends DisplayTestCase {
 		eq("Int", type(pos(1)));
 		eq("Int", type(pos(2)));
 		eq(range(3, 1), position(pos(1)));
-		eq(range(3, 1), position(pos(2)));
 		arrayEq([range(4, 2)], usage(pos(1)));
-		arrayEq([range(4, 2)], usage(pos(2)));
 	}
 }

+ 2 - 2
tests/display/src/cases/Issue6029.hx

@@ -6,8 +6,8 @@ class Issue6029 extends DisplayTestCase {
 		typedef B = {}
 
 		typedef C = {
-			>A{-1-},
-			>B{-2-},
+			>{-1-}A,
+			>{-2-}B,
 		}
 	**/
 	function test() {

+ 34 - 0
tests/display/src/cases/Issue6923.hx

@@ -0,0 +1,34 @@
+package cases;
+
+class Issue6923 extends DisplayTestCase {
+	/**
+	class Main {
+		static function main() {
+			trace({-1-}"test{-2-}".{-3-}lengt{-4-}h{-5-});
+		}
+	}
+	**/
+	function test() {
+		eq("String", type(pos(1)));
+		eq("String", type(pos(2)));
+		eq("Int", type(pos(3)));
+		eq("Int", type(pos(4)));
+		eq("Void", type(pos(5)));
+	}
+
+	/**
+	class Main {
+		static function main() {
+			var a = 1;
+			{-1-}a{-2-}+{-3-}0{-4-}.{-5-}1;
+		}
+	}
+	**/
+	function test2() {
+		eq("Int", type(pos(1)));
+		eq("Float", type(pos(2)));
+		eq("Float", type(pos(3)));
+		eq("Float", type(pos(4)));
+		eq("Float", type(pos(5)));
+	}
+}

+ 1 - 1
tests/display/src/cases/Type.hx

@@ -2,7 +2,7 @@ package cases;
 
 class Type extends DisplayTestCase {
 	/**
-	abstract A{-1-}(Int) {}
+	abstract {-1-}A(Int) {}
 	**/
 	function testAbstractDecl() {
 		eq("cases.A", type(pos(1)));

+ 1 - 1
tests/misc/projects/Issue1968/compile.hxml

@@ -1 +1 @@
---display Main.hx@146@position
+--display Main.hx@145@position

+ 1 - 1
tests/misc/projects/Issue2991/compile.hxml

@@ -1 +1 @@
---display Main.hx@114@position
+--display Main.hx@113@position

+ 1 - 1
tests/misc/projects/Issue2993/compile.hxml

@@ -1 +1 @@
---display Main.hx@75@position
+--display Main.hx@74@position

+ 1 - 1
tests/misc/projects/Issue2995/position.hxml

@@ -1 +1 @@
---display Main.hx@91@position
+--display Main.hx@83@position

+ 1 - 1
tests/misc/projects/Issue2995/usage.hxml

@@ -1 +1 @@
---display Main.hx@91@usage
+--display Main.hx@83@usage

+ 1 - 1
tests/misc/projects/Issue5122/compile.hxml

@@ -1 +1 @@
---display Main.hx@126@type
+--display Main.hx@125@type