2
0
Эх сурвалжийг харах

[parser] check all type hints against the display position

closes #5649
Simon Krajewski 7 жил өмнө
parent
commit
72ac94a824

+ 14 - 4
src/syntax/grammar.mly

@@ -38,9 +38,11 @@ let rec psep sep f = parser
 		v :: loop s
 		v :: loop s
 	| [< >] -> []
 	| [< >] -> []
 
 
-let expect_unless_resume f = parser
-	| [< _ = f >] -> ()
-	| [< >] -> if do_resume() then () else serror()
+let pignore f =
+	try
+		ignore(f())
+	with Stream.Error _ | Stream.Failure ->
+		()
 
 
 let expect_unless_resume_p f = parser
 let expect_unless_resume_p f = parser
 	| [< p = f >] -> p
 	| [< p = f >] -> p
@@ -429,7 +431,15 @@ and parse_complex_type_at p = parser
 	| [< s >] -> if would_skip_resume p s then CTPath { tpackage = []; tname = ""; tparams = []; tsub = None },p else serror()
 	| [< s >] -> if would_skip_resume p s then CTPath { tpackage = []; tname = ""; tparams = []; tsub = None },p else serror()
 
 
 and parse_type_hint = parser
 and parse_type_hint = parser
-	| [< '(DblDot,p1); t = parse_complex_type_at p1 >] -> t
+	| [< '(DblDot,p1); s >] ->
+		let f () = parse_complex_type_at p1 s in
+		check_resume_range p1 s
+			(fun p2 ->
+				let ct = CTPath magic_type_path in
+				pignore(f);
+				ct,null_pos
+			)
+			f
 
 
 and parse_type_opt = parser
 and parse_type_opt = parser
 	| [< t = parse_type_hint >] -> Some t
 	| [< t = parse_type_hint >] -> Some t

+ 8 - 1
src/syntax/parser.ml

@@ -243,4 +243,11 @@ let is_signature_display () =
 	!display_mode = DMSignature
 	!display_mode = DMSignature
 
 
 let check_resume p fyes fno =
 let check_resume p fyes fno =
-	if is_completion () && is_resuming p then (had_resume := true; fyes()) else fno()
+	if is_completion () && is_resuming p then (had_resume := true; fyes()) else fno()
+
+let check_resume_range p s fyes fno =
+	if is_completion () then begin
+		let pnext = next_pos s in
+		if p.pmin < !resume_display.pmin && pnext.pmin >= !resume_display.pmax && is_resuming_file p.pfile then fyes pnext
+		else fno()
+	end else fno()

+ 13 - 0
tests/display/src/cases/Issue5649.hx

@@ -0,0 +1,13 @@
+package cases;
+
+class Issue5649 extends DisplayTestCase {
+	/**
+	class Main {
+		public static function main():{-1-} {-2-} {}
+	}
+	**/
+	function test() {
+		var typesCompletion = toplevel(pos(1));
+		eq(true, hasToplevel(typesCompletion, "type", "Array"));
+	}
+}