Browse Source

[macro] Don't choke on namePos for reification pattern matching (#11671)

* [macro] Don't choke on namePos for reification pattern matching

* [tests] Add test for 11670

* Do it like in #11433
Rudy Ges 1 year ago
parent
commit
85160f788c

+ 6 - 1
src/typing/matcher.ml

@@ -480,9 +480,14 @@ module Pattern = struct
 				let is_matchable cf =
 					match cf.cf_kind with Method _ -> false | _ -> true
 				in
+				(* TODO: This needs a better check, but it's not obvious how to approach this. See #11433 *)
+				let is_probably_pos cf = match cf.cf_name with
+					| "pos" | "posPath" | "namePos" -> true
+					| _ -> false
+				in
 				let patterns,fields = List.fold_left (fun (patterns,fields) (cf,t) ->
 					try
-						if pctx.in_reification && cf.cf_name = "pos" then raise Not_found;
+						if pctx.in_reification && is_probably_pos cf then raise Not_found;
 						let e1 = Expr.field_assoc cf.cf_name fl in
 						make pctx false t e1 :: patterns,cf.cf_name :: fields
 					with Not_found ->

+ 16 - 0
tests/misc/projects/Issue11670/Main.hx

@@ -0,0 +1,16 @@
+class Main {
+	static function main() {
+		test(var foo:String);
+	}
+
+	static macro function test(e) {
+		switch e {
+			// Unrecognized pattern: untyped $__mk_pos__("Test.hx", 145, 150)
+			case macro var $name:$ct:
+			case _:
+		}
+
+		return macro {};
+	}
+}
+

+ 1 - 0
tests/misc/projects/Issue11670/compile.hxml

@@ -0,0 +1 @@
+-main Main

+ 0 - 0
tests/misc/projects/Issue11670/compile.hxml.stdout