Преглед на файлове

[nullsafety] fix named local functions for -D js-es=6 [fixes #7918]

Alexander Kuzmenko преди 6 години
родител
ревизия
dc53730d1a
променени са 5 файла, в които са добавени 18 реда и са изтрити 3 реда
  1. 2 0
      .gitignore
  2. 5 1
      src/typing/nullSafety.ml
  3. 5 2
      tests/nullsafety/src/cases/TestStrict.hx
  4. 3 0
      tests/nullsafety/test-js-es6.hxml
  5. 3 0
      tests/runci/targets/Macro.hx

+ 2 - 0
.gitignore

@@ -64,6 +64,8 @@
 /tests/unit/unit.n
 /tests/unit/node_modules/
 
+/tests/nullsafety/bin
+
 /haxe.sublime*
 .idea
 build.bat

+ 5 - 1
src/typing/nullSafety.ml

@@ -994,6 +994,10 @@ class expr_checker mode immediate_execution report =
 				| [] -> ()
 				(* Local named functions like `function fn() {}`, which are generated as `var fn = null; fn = function(){}` *)
 				| { eexpr = TVar (v1, Some { eexpr = TConst TNull }) }
+					:: ({ eexpr = TBinop (OpAssign, { eexpr = TLocal v2 }, { eexpr = TFunction _ }) } as e)
+					:: rest
+				| { eexpr = TVar (v1, Some { eexpr = TConst TNull }) }
+					:: { eexpr = TVar ({ v_kind = VGenerated }, Some { eexpr = TConst TThis }) }
 					:: ({ eexpr = TBinop (OpAssign, { eexpr = TLocal v2 }, { eexpr = TFunction _ }) } as e)
 					:: rest
 						when v1.v_id = v2.v_id && (match v1.v_type with TFun _ -> true | _ -> false) ->
@@ -1291,7 +1295,7 @@ class class_checker cls immediate_execution report  =
 			if is_safe_class && (not cls.cl_extern) && (not cls.cl_interface) then
 				self#check_var_fields;
 			let check_field is_static f =
-				(* if f.cf_name = "ternary_returnedFromInlinedFunction_shouldPass" then
+				(* if f.cf_name = "wtf_foo" then
 					Option.may (fun e -> print_endline (s_expr str_type e)) f.cf_expr; *)
 				match (safety_mode (cls.cl_meta @ f.cf_meta)) with
 					| SMOff -> ()

+ 5 - 2
tests/nullsafety/src/cases/TestStrict.hx

@@ -742,9 +742,12 @@ class TestStrict {
 		}
 	}
 
-	static public function localNamedFunction_shouldPass() {
+	var foo:Null<String>;
+	public function localNamedFunction_shouldPass() {
 		function cb() {
-			cb();
+			if(foo != null) {
+				cb();
+			}
 		}
 	}
 

+ 3 - 0
tests/nullsafety/test-js-es6.hxml

@@ -0,0 +1,3 @@
+test.hxml
+-js bin/test-es6.js
+-D js-es=6

+ 3 - 0
tests/runci/targets/Macro.hx

@@ -18,7 +18,10 @@ class Macro {
 		runCommand("haxe", ["run.hxml"]);
 
 		changeDirectory(nullSafetyDir);
+		infoMsg("No-target null safety:");
 		runCommand("haxe", ["test.hxml"]);
+		infoMsg("Js-es6 null safety:");
+		runCommand("haxe", ["test-js-es6.hxml"]);
 
 		changeDirectory(miscDir);
 		getCsDependencies();