ソースを参照

fail softer on multiple read/write resolve methods

closes #11757
Simon Krajewski 5 ヶ月 前
コミット
e496d325de

+ 2 - 2
src/typing/typeloadFields.ml

@@ -1018,11 +1018,11 @@ let check_abstract (ctx,cctx,fctx) a c cf fd t ret p =
 		in
 		begin match follow t with
 			| TFun((_,_,t1) :: (_,_,t2) :: args,_) when is_empty_or_pos_infos args ->
-				if a.a_read <> None then raise_typing_error "Multiple resolve-read methods are not supported" cf.cf_pos;
+				if a.a_read <> None then display_error ctx.com "Multiple resolve-read methods are not supported" cf.cf_pos;
 				check_fun t1 t2;
 				a.a_read <- Some cf;
 			| TFun((_,_,t1) :: (_,_,t2) :: (_,_,t3) :: args,_) when is_empty_or_pos_infos args ->
-				if a.a_write <> None then raise_typing_error "Multiple resolve-write methods are not supported" cf.cf_pos;
+				if a.a_write <> None then display_error ctx.com "Multiple resolve-write methods are not supported" cf.cf_pos;
 				check_fun t1 t2;
 				a.a_write <- Some cf;
 			| _ ->

+ 25 - 0
tests/server/src/cases/issues/Issue11757.hx

@@ -0,0 +1,25 @@
+package cases.issues;
+
+class Issue11757 extends TestCase {
+	function test(_) {
+		var content = getTemplate("issues/Issue11757/Main.hx");
+		var transform = Markers.parse(content);
+		vfs.putContent("Main.hx", transform.source);
+
+		var args = ["-main", "Main"];
+		runHaxe(args);
+		assertSuccess();
+		function check(name:String, res:HoverDisplayItemOccurence<Dynamic>) {
+			switch (res.item.kind) {
+				case ClassField:
+					Assert.equals(name, res.item.args.field.name);
+
+				case kind:
+					Assert.fail("unexpected item kind: " + kind);
+			}
+		}
+		runHaxeJsonCb(args, DisplayMethods.Hover, {file: new FsPath("Main.hx"), offset: transform.offset(1)}, res -> check("get", res));
+		runHaxeJsonCb(args, DisplayMethods.Hover, {file: new FsPath("Main.hx"), offset: transform.offset(2)}, res -> check("set", res));
+		assertSuccess();
+	}
+}

+ 15 - 0
tests/server/test/templates/issues/Issue11757/Main.hx

@@ -0,0 +1,15 @@
+abstract State({}) from {} {
+	public function new() {
+		this = {};
+	}
+
+	@:op(a.b) function g{-1-}et(key:String):Any {
+		return key;
+	}
+
+	@:op(a.b) function s{-2-}et(key:String, value:Any):Any {
+		return "set" + key;
+	}
+}
+
+function main() {}