Prechádzať zdrojové kódy

[macro] make haxe.macro.Error extend haxe.Exception (fixes #9389)

Aleksandr Kuzmenko 5 rokov pred
rodič
commit
ad1e181227

+ 1 - 1
src/macro/eval/evalExceptions.ml

@@ -142,7 +142,7 @@ let catch_exceptions ctx ?(final=(fun() -> ())) f p =
 		Option.may (build_exception_stack ctx) env;
 		eval.env <- env;
 		if is v key_haxe_macro_Error then begin
-			let v1 = field v key_message in
+			let v1 = field v key_exception_message in
 			let v2 = field v key_pos in
 			GlobalState.get_ctx_ref := prev;
 			final();

+ 1 - 0
src/macro/eval/evalHash.ml

@@ -40,6 +40,7 @@ let key_get = hash "get"
 let key_pos = hash "pos"
 let key_len = hash "len"
 let key_message = hash "message"
+let key_exception_message = hash "__exceptionMessage"
 let key_Array = hash "Array"
 let key_eval_Vector = hash "eval.Vector"
 let key_String = hash "String"

+ 1 - 1
src/macro/eval/evalMain.ml

@@ -380,7 +380,7 @@ let compiler_error msg pos =
 	let vi = encode_instance key_haxe_macro_Error in
 	match vi with
 	| VInstance i ->
-		set_instance_field i key_message (EvalString.create_unknown msg);
+		set_instance_field i key_exception_message (EvalString.create_unknown msg);
 		set_instance_field i key_pos (encode_pos pos);
 		exc vi
 	| _ ->

+ 5 - 17
std/haxe/macro/Expr.hx

@@ -958,30 +958,18 @@ enum TypeDefKind {
 /**
 	This error can be used to handle or produce compilation errors in macros.
 **/
-class Error {
-	/**
-		The error message.
-	**/
-	public var message:String;
-
+class Error extends Exception {
 	/**
 		The position of the error.
 	**/
-	public var pos:Expr.Position;
+	public var pos:Position;
 
 	/**
 		Instantiates an error with given message and position.
 	**/
-	public function new(m, p) {
-		this.message = m;
-		this.pos = p;
-	}
-
-	/**
-		Returns the string representation of the error.
-	**/
-	function toString() {
-		return message;
+	public function new(message:String, pos:Position, ?previous:Exception) {
+		super(message, previous);
+		this.pos = pos;
 	}
 }
 

+ 9 - 0
tests/misc/projects/Issue9389/Main.hx

@@ -0,0 +1,9 @@
+class Main {
+	static function main() {
+		f(123);
+	}
+
+	static macro function f(e) {
+		throw new haxe.macro.Expr.Error("boop", e.pos);
+	}
+}

+ 1 - 0
tests/misc/projects/Issue9389/compile-fail.hxml

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

+ 1 - 0
tests/misc/projects/Issue9389/compile-fail.hxml.stderr

@@ -0,0 +1 @@
+Main.hx:3: characters 5-8 : boop