Browse Source

[macro] apply @:native for extern enum (#11636)

* [eval] apply @:native for externs

* [macro] only apply @:native for extern enums

* Add tabstract.a_extern

* [macro] apply @:native to extern enum and extern enum abstract

* [tests] update test for 11481

* [tests] add test for 11631

* [hxb] add a_extern
Rudy Ges 1 year ago
parent
commit
ed138ae917

+ 1 - 0
src/compiler/hxb/hxbReader.ml

@@ -1515,6 +1515,7 @@ class hxb_reader
 		end;
 		end;
 		a.a_from <- self#read_list (fun () -> self#read_type_instance);
 		a.a_from <- self#read_list (fun () -> self#read_type_instance);
 		a.a_to <- self#read_list (fun () -> self#read_type_instance);
 		a.a_to <- self#read_list (fun () -> self#read_type_instance);
+		a.a_extern <- self#read_bool;
 		a.a_enum <- self#read_bool;
 		a.a_enum <- self#read_bool;
 
 
 	method read_abstract_fields (a : tabstract) =
 	method read_abstract_fields (a : tabstract) =

+ 1 - 0
src/compiler/hxb/hxbWriter.ml

@@ -1925,6 +1925,7 @@ module HxbWriter = struct
 		end;
 		end;
 		Chunk.write_list writer.chunk a.a_from (write_type_instance writer);
 		Chunk.write_list writer.chunk a.a_from (write_type_instance writer);
 		Chunk.write_list writer.chunk a.a_to (write_type_instance writer);
 		Chunk.write_list writer.chunk a.a_to (write_type_instance writer);
+		Chunk.write_bool writer.chunk a.a_extern;
 		Chunk.write_bool writer.chunk a.a_enum
 		Chunk.write_bool writer.chunk a.a_enum
 
 
 	let write_abstract_fields writer (a : tabstract) =
 	let write_abstract_fields writer (a : tabstract) =

+ 1 - 0
src/core/tFunctions.ml

@@ -286,6 +286,7 @@ let null_abstract = {
 	a_read = None;
 	a_read = None;
 	a_write = None;
 	a_write = None;
 	a_call = None;
 	a_call = None;
+	a_extern = false;
 	a_enum = false;
 	a_enum = false;
 }
 }
 
 

+ 1 - 27
src/core/tOther.ml

@@ -280,33 +280,6 @@ let mk_enum m path pos name_pos =
 		e_type = mk_mono();
 		e_type = mk_mono();
 	}
 	}
 
 
-let mk_abstract m path pos name_pos =
-	{
-		a_path = path;
-		a_private = false;
-		a_module = m;
-		a_pos = pos;
-		a_name_pos = name_pos;
-		a_doc = None;
-		a_params = [];
-		a_using = [];
-		a_restore = (fun () -> ());
-		a_meta = [];
-		a_from = [];
-		a_to = [];
-		a_from_field = [];
-		a_to_field = [];
-		a_ops = [];
-		a_unops = [];
-		a_impl = None;
-		a_array = [];
-		a_this = mk_mono();
-		a_read = None;
-		a_write = None;
-		a_enum = false;
-		a_call = None;
-	}
-
 let mk_enum m path pos name_pos =
 let mk_enum m path pos name_pos =
 	{
 	{
 		e_path = path;
 		e_path = path;
@@ -348,6 +321,7 @@ let mk_abstract m path pos name_pos =
 		a_this = mk_mono();
 		a_this = mk_mono();
 		a_read = None;
 		a_read = None;
 		a_write = None;
 		a_write = None;
+		a_extern = false;
 		a_enum = false;
 		a_enum = false;
 		a_call = None;
 		a_call = None;
 	}
 	}

+ 1 - 0
src/core/tType.ml

@@ -377,6 +377,7 @@ and tabstract = {
 	mutable a_read : tclass_field option;
 	mutable a_read : tclass_field option;
 	mutable a_write : tclass_field option;
 	mutable a_write : tclass_field option;
 	mutable a_call : tclass_field option;
 	mutable a_call : tclass_field option;
+	mutable a_extern : bool;
 	mutable a_enum : bool;
 	mutable a_enum : bool;
 }
 }
 
 

+ 10 - 0
src/typing/macroContext.ml

@@ -632,12 +632,22 @@ and flush_macro_context mint mctx =
 		| _ ->
 		| _ ->
 			()
 			()
 	in
 	in
+	(* Apply native paths for externs only *)
+	let maybe_apply_native_paths t =
+		let apply_native = match t with
+			| TClassDecl { cl_kind = KAbstractImpl a } -> a.a_extern && a.a_enum
+			| TEnumDecl e -> e.e_extern
+			| _ -> false
+		in
+		if apply_native then Naming.apply_native_paths t
+	in
 	let type_filters = [
 	let type_filters = [
 		FiltersCommon.remove_generic_base;
 		FiltersCommon.remove_generic_base;
 		Exceptions.patch_constructors mctx;
 		Exceptions.patch_constructors mctx;
 		(fun mt -> AddFieldInits.add_field_inits mctx.c.curclass.cl_path (RenameVars.init mctx.com) mctx.com mt);
 		(fun mt -> AddFieldInits.add_field_inits mctx.c.curclass.cl_path (RenameVars.init mctx.com) mctx.com mt);
 		Filters.update_cache_dependencies ~close_monomorphs:false mctx.com;
 		Filters.update_cache_dependencies ~close_monomorphs:false mctx.com;
 		minimal_restore;
 		minimal_restore;
+		maybe_apply_native_paths
 	] in
 	] in
 	let ready = fun t ->
 	let ready = fun t ->
 		FiltersCommon.apply_filters_once mctx expr_filters t;
 		FiltersCommon.apply_filters_once mctx expr_filters t;

+ 1 - 0
src/typing/typeloadModule.ml

@@ -198,6 +198,7 @@ module ModuleLevel = struct
 						a_read = None;
 						a_read = None;
 						a_write = None;
 						a_write = None;
 						a_call = None;
 						a_call = None;
+						a_extern = List.mem AbExtern d.d_flags;
 						a_enum = List.mem AbEnum d.d_flags || p_enum_meta <> None;
 						a_enum = List.mem AbEnum d.d_flags || p_enum_meta <> None;
 					} in
 					} in
 					begin match p_enum_meta with
 					begin match p_enum_meta with

+ 5 - 1
tests/misc/projects/Issue11481/Main.hx

@@ -1,3 +1,7 @@
 function main() {
 function main() {
+	pack.OldClass.f1();
+	pack.OldEnumAbstract.f1();
+
 	trace(pack.OldClass);
 	trace(pack.OldClass);
-}
+	trace(pack.OldEnumAbstract.SSL_TRANSPORT_STREAM);
+}

+ 4 - 1
tests/misc/projects/Issue11481/compile.hxml.stdout

@@ -1 +1,4 @@
-Main.hx:2: Class<NewClass>
+pack/OldClass.hx:10: Class<pack.OldClass>
+pack/OldEnumAbstract.hx:13: 0
+Main.hx:5: Class<NewClass>
+Main.hx:6: 0

+ 5 - 4
tests/misc/projects/Issue11481/pack/OldClass.hx

@@ -3,10 +3,11 @@ package pack;
 @:native("NewClass")
 @:native("NewClass")
 class OldClass {
 class OldClass {
 	macro static function f2() {
 	macro static function f2() {
-		return null;
+		return macro null;
 	}
 	}
 
 
-	macro static function f1() {
-		return null;
+	public macro static function f1() {
+		trace(OldClass);
+		return macro null;
 	}
 	}
-}
+}

+ 16 - 0
tests/misc/projects/Issue11481/pack/OldEnumAbstract.hx

@@ -0,0 +1,16 @@
+package pack;
+
+@:native("mbedtls.SslTransport")
+extern enum abstract OldEnumAbstract(Int) {
+	var SSL_TRANSPORT_STREAM;
+	var SSL_TRANSPORT_DATAGRAM;
+
+	macro static function f2() {
+		return macro null;
+	}
+
+	public macro static function f1() {
+		trace(SSL_TRANSPORT_STREAM);
+		return macro null;
+	}
+}

+ 6 - 0
tests/misc/projects/Issue11631/Main.hx

@@ -0,0 +1,6 @@
+function main() {
+	trace(mbedtls.SslTransport.SSL_TRANSPORT_STREAM);
+	test();
+}
+
+macro function test();

+ 4 - 0
tests/misc/projects/Issue11631/Main.macro.hx

@@ -0,0 +1,4 @@
+macro function test() {
+	trace(mbedtls.SslTransport.SSL_TRANSPORT_STREAM);
+	return macro {};
+}

+ 2 - 0
tests/misc/projects/Issue11631/compile.hxml

@@ -0,0 +1,2 @@
+-m Main
+--interp

+ 2 - 0
tests/misc/projects/Issue11631/compile.hxml.stdout

@@ -0,0 +1,2 @@
+Main.macro.hx:2: 0
+Main.hx:2: 0