فهرست منبع

Allow boolean operators in patterns (#11157)

* [matcher] allow boolops in patterns

* add test that definitely covers all corner cases
Simon Krajewski 2 سال پیش
والد
کامیت
2d63f9098b
2فایلهای تغییر یافته به همراه28 افزوده شده و 0 حذف شده
  1. 3 0
      src/typing/matcher/exprToPattern.ml
  2. 25 0
      tests/unit/src/unit/issues/Issue11157.hx

+ 3 - 0
src/typing/matcher/exprToPattern.ml

@@ -412,6 +412,9 @@ let rec make pctx toplevel t e =
 			restore();
 			restore();
 			let pat = make pctx toplevel e1.etype e2 in
 			let pat = make pctx toplevel e1.etype e2 in
 			PatExtractor {ex_var = v; ex_expr = e1; ex_pattern = pat}
 			PatExtractor {ex_var = v; ex_expr = e1; ex_pattern = pat}
+		| EBinop((OpEq | OpNotEq | OpLt | OpLte | OpGt | OpGte | OpBoolAnd | OpBoolOr),_,_) ->
+			let e_rhs = (EConst (Ident "true"),null_pos) in
+			loop (EBinop(OpArrow,e,e_rhs),(pos e))
 		(* Special case for completion on a pattern local: We don't want to add the local to the context
 		(* Special case for completion on a pattern local: We don't want to add the local to the context
 		   while displaying (#7319) *)
 		   while displaying (#7319) *)
 		| EDisplay((EConst (Ident _),_ as e),dk) when pctx.ctx.com.display.dms_kind = DMDefault ->
 		| EDisplay((EConst (Ident _),_ as e),dk) when pctx.ctx.com.display.dms_kind = DMDefault ->

+ 25 - 0
tests/unit/src/unit/issues/Issue11157.hx

@@ -0,0 +1,25 @@
+package unit.issues;
+
+private enum E {
+	CInt(i:Int);
+	CString(s:String);
+}
+
+class Issue11157 extends Test {
+	function process(e:E) {
+		return switch e {
+			case CInt(_ > 0 && _ < 12):
+				"in range";
+			case CString(_.toLowerCase() == "foo"):
+				return "foo";
+			case _:
+				return "something else";
+		}
+	}
+
+	function test() {
+		eq("in range", (process(CInt(11))));
+		eq("something else", (process(CInt(12))));
+		eq("foo", (process(CString("FOO"))));
+	}
+}