Browse Source

[display] fix signature handling in patterns

closes #7326
Simon Krajewski 7 years ago
parent
commit
e37c9498df
2 changed files with 28 additions and 0 deletions
  1. 6 0
      src/typing/matcher.ml
  2. 22 0
      tests/display/src/cases/Issue7326.hx

+ 6 - 0
src/typing/matcher.ml

@@ -474,6 +474,12 @@ module Pattern = struct
 				ignore(TyperDisplay.handle_edisplay ctx e (DKPattern toplevel) (WithType t));
 				ctx.locals <- locals';
 				pat
+			(* For signature completion, we don't want to recurse into the inner pattern because there's probably
+			   a EDisplay(_,DMMarked) in there. We can handle display immediately because inner patterns should not
+			   matter (#7326) *)
+			| EDisplay(e1,DKCall) ->
+				ignore(TyperDisplay.handle_edisplay ctx e (DKPattern toplevel) (WithType t));
+				loop e1
 			| EDisplay(e,dk) ->
 				let pat = loop e in
 				ignore(TyperDisplay.handle_edisplay ctx e (DKPattern toplevel) (WithType t));

+ 22 - 0
tests/display/src/cases/Issue7326.hx

@@ -0,0 +1,22 @@
+package cases;
+
+class Issue7326 extends DisplayTestCase {
+	/**
+	import haxe.ds.Option;
+
+	class Main {
+		public static function main() {
+			var o:Option<Int> = None;
+			switch (o) {
+				case Some({-1-}v):
+				case None:
+			}
+			Some({-2-});
+		}
+	}
+	**/
+	function test() {
+		sigEq(0, [["v:Int"]], signature(pos(1)));
+		sigEq(0, [["v:Unknown<0>"]], signature(pos(2)));
+	}
+}