Преглед изворни кода

[typer] distinguish plain and failed object typing

closes #10712
Simon Krajewski пре 3 година
родитељ
комит
5345c4d049
3 измењених фајлова са 50 додато и 2 уклоњено
  1. 2 2
      src/typing/typer.ml
  2. 1 0
      src/typing/typerBase.ml
  3. 47 0
      tests/unit/src/unit/issues/Issue10712.hx

+ 2 - 2
src/typing/typer.ml

@@ -785,7 +785,7 @@ and type_object_decl ctx fl with_type p =
 				and fold = fun acc t' -> match loop (t :: seen) t' with ODKPlain -> acc | t -> t :: acc in
 				(match List.fold_left fold [] froms with
 				| [t] -> t
-				| _ -> ODKPlain)
+				| _ -> ODKFailed)
 			| TDynamic t when (follow t != t_dynamic) ->
 				dynamic_parameter := Some t;
 				ODKWithStructure {
@@ -865,7 +865,7 @@ and type_object_decl ctx fl with_type p =
 		mk (TObjectDecl (List.rev fields)) (mk_anon ~fields:types x) p
 	in
 	(match a with
-	| ODKPlain -> type_plain_fields()
+	| ODKPlain | ODKFailed  -> type_plain_fields()
 	| ODKWithStructure a when PMap.is_empty a.a_fields && !dynamic_parameter = None -> type_plain_fields()
 	| ODKWithStructure a ->
 		let t, fl = type_fields a.a_fields in

+ 1 - 0
src/typing/typerBase.ml

@@ -27,6 +27,7 @@ type object_decl_kind =
 	| ODKWithStructure of tanon
 	| ODKWithClass of tclass * tparams
 	| ODKPlain
+	| ODKFailed
 
 let type_call_target_ref : (typer -> expr -> expr list -> WithType.t -> bool -> pos -> access_kind) ref = ref (fun _ _ _ _ _ -> die "" __LOC__)
 let type_access_ref : (typer -> expr_def -> pos -> access_mode -> WithType.t -> access_kind) ref = ref (fun _ _ _ _ _ -> assert false)

+ 47 - 0
tests/unit/src/unit/issues/Issue10712.hx

@@ -0,0 +1,47 @@
+package unit.issues;
+
+import haxe.extern.EitherType;
+
+private typedef PrepareRenameResult = EitherType<Range, EitherType<RangePlaceholder, DefaultBehaviour>>;
+
+private typedef Range = {
+	var start:Position;
+	var end:Position;
+}
+
+private typedef RangePlaceholder = {
+	var range:Range;
+	var placeholder:String;
+}
+
+private typedef DefaultBehaviour = {
+	var defaultBehavior:Bool;
+}
+
+private typedef Position = {
+	var line:Int;
+	var character:Int;
+}
+
+class Issue10712 extends unit.Test {
+	function test() {
+		var pos:Position = {line: 1, character: 10};
+		var range:Range = {start: pos, end: pos};
+
+		var result:PrepareRenameResult = {range: range, placeholder: "Haxe"};
+		result = range;
+		result = {defaultBehavior: true};
+
+		test2({range: range, placeholder: "Haxe"});
+		test2(range);
+		test2({defaultBehavior: true});
+
+		test2(cast {range: range, placeholder: "Haxe"});
+		test2(range);
+		test2(cast {defaultBehavior: true});
+
+		utest.Assert.pass();
+	}
+
+	static function test2(param:PrepareRenameResult) {}
+}