瀏覽代碼

haxe.macro.Context.containsDisplayPosition(pos) (closes #9077)

Aleksandr Kuzmenko 5 年之前
父節點
當前提交
f1ee0889b8
共有 3 個文件被更改,包括 48 次插入0 次删除
  1. 13 0
      src/macro/macroApi.ml
  2. 7 0
      std/haxe/macro/Context.hx
  3. 28 0
      tests/display/src/cases/Issue9077.hx

+ 13 - 0
src/macro/macroApi.ml

@@ -1519,6 +1519,19 @@ let rec make_const e =
 
 let macro_api ccom get_api =
 	[
+		"contains_display_position", vfun1 (fun p ->
+			let p = decode_pos p in
+			let display_pos = DisplayPosition.display_position in
+			let same_file() =
+				let dfile = display_pos#get.pfile in
+				dfile = p.pfile
+				|| (
+					(Filename.is_relative p.pfile || Filename.is_relative dfile)
+					&& (Path.unique_full_path dfile = Path.unique_full_path p.pfile)
+				)
+			in
+			vbool (display_pos#enclosed_in p && same_file())
+		);
 		"current_pos", vfun0 (fun() ->
 			encode_pos (get_api()).pos
 		);

+ 7 - 0
std/haxe/macro/Context.hx

@@ -112,6 +112,13 @@ class Context {
 		return load("class_path", 0)();
 	}
 
+	/**
+		Check if current display position is within `pos`.
+	**/
+	public static function containsDisplayPosition(pos:Position):Bool {
+		return load("contains_display_position", 1)(pos);
+	}
+
 	/**
 		Returns the position at which the macro was called.
 	**/

+ 28 - 0
tests/display/src/cases/Issue9077.hx

@@ -0,0 +1,28 @@
+package cases;
+
+class Issue9077 extends DisplayTestCase {
+	/**
+		class Main {
+			macro static function m(shouldContain:Bool):haxe.macro.Expr {
+				var cls = haxe.macro.Context.getLocalClass();
+				var pos = shouldContain && cls != null ? cls.get().pos : haxe.macro.Context.currentPos();
+				if(haxe.macro.Context.containsDisplayPosition(pos)) {
+					return macro 'contains';
+				} else {
+					return macro false;
+				}
+			}
+
+			static function main() {
+				var str = m(true);
+				st{-1-}r;
+				var str = m(false);
+				st{-2-}r;
+			}
+		}
+	**/
+	function test() {
+		eq("String", type(pos(1)));
+		eq("Bool", type(pos(2)));
+	}
+}