浏览代码

[display] accept lower-case type paths in display mode

closes #8657
Simon Krajewski 6 年之前
父节点
当前提交
b681a8b04e
共有 2 个文件被更改,包括 31 次插入2 次删除
  1. 18 2
      src/syntax/grammar.mly
  2. 13 0
      tests/server/src/DisplayTests.hx

+ 18 - 2
src/syntax/grammar.mly

@@ -569,6 +569,21 @@ and parse_type_path1 p0 pack = parser
 		parse_type_path2 p0 pack name p1 s
 		parse_type_path2 p0 pack name p1 s
 
 
 and parse_type_path2 p0 pack name p1 s =
 and parse_type_path2 p0 pack name p1 s =
+	let check_display f =
+		let p = match p0 with
+			| None -> p1
+			| Some p -> punion p p1
+		in
+		if !in_display_file && display_position#enclosed_in p then begin
+			{
+				tpackage = List.rev pack;
+				tname = name;
+				tsub = None;
+				tparams = [];
+			},p
+		end else
+			f()
+	in
 	if is_lower_ident name then
 	if is_lower_ident name then
 		(match s with parser
 		(match s with parser
 		| [< '(Dot,p) >] ->
 		| [< '(Dot,p) >] ->
@@ -576,8 +591,9 @@ and parse_type_path2 p0 pack name p1 s =
 				(fun () -> raise (TypePath (List.rev (name :: pack),None,false,punion (match p0 with None -> p1 | Some p0 -> p0) p)))
 				(fun () -> raise (TypePath (List.rev (name :: pack),None,false,punion (match p0 with None -> p1 | Some p0 -> p0) p)))
 				(fun () -> parse_type_path1 (match p0 with None -> Some p1 | Some _ -> p0) (name :: pack) s)
 				(fun () -> parse_type_path1 (match p0 with None -> Some p1 | Some _ -> p0) (name :: pack) s)
 		| [< '(Semicolon,_) >] ->
 		| [< '(Semicolon,_) >] ->
-			error (Custom "Type name should start with an uppercase letter") p1
-		| [< >] -> serror())
+			check_display (fun () -> error (Custom "Type name should start with an uppercase letter") p1)
+		| [< >] ->
+			check_display serror)
 	else
 	else
 		let sub,p2 = (match s with parser
 		let sub,p2 = (match s with parser
 			| [< '(Dot,p); s >] ->
 			| [< '(Dot,p); s >] ->

+ 13 - 0
tests/server/src/DisplayTests.hx

@@ -164,6 +164,19 @@ typedef Foo = {
 		Assert.equals(transform.markers[2], r.replaceRange.end.character);
 		Assert.equals(transform.markers[2], r.replaceRange.end.character);
 	}
 	}
 
 
+	function testIssue8657() {
+		var content = "class Main { static function main() { var x:{-1-}stream{-2-} } }";
+		vfs.putContent("Main.hx", content);
+		var transform = Marker.extractMarkers(content);
+		vfs.putContent("Main.hx", transform.source);
+		runHaxeJson([], DisplayMethods.Completion, {file: new FsPath("Main.hx"), offset: transform.markers[2], wasAutoTriggered: true});
+		var result = parseCompletion();
+		var r = result.result;
+		Assert.equals("stream", r.filterString);
+		Assert.equals(transform.markers[1], r.replaceRange.start.character);
+		Assert.equals(transform.markers[2], r.replaceRange.end.character);
+	}
+
 	function testIssue8659() {
 	function testIssue8659() {
 		var content = "class Main extends {-1-}StreamTokenizer{-2-} { }";
 		var content = "class Main extends {-1-}StreamTokenizer{-2-} { }";
 		vfs.putContent("Main.hx", content);
 		vfs.putContent("Main.hx", content);