Browse Source

don't process display request inside during a macro execution (closes #9449)

Aleksandr Kuzmenko 5 years ago
parent
commit
50fdf2399c

+ 1 - 1
src/typing/typeload.ml

@@ -425,7 +425,7 @@ and load_instance ctx ?(allow_display=false) (t,pn) allow_no_params =
 		let t = load_instance' ctx (t,pn) allow_no_params in
 		if allow_display then DisplayEmitter.check_display_type ctx t pn;
 		t
-	with Error (Module_not_found path,_) when (ctx.com.display.dms_kind = DMDefault) && DisplayPosition.display_position#enclosed_in pn ->
+	with Error (Module_not_found path,_) when ctx.macro_depth <= 0 && (ctx.com.display.dms_kind = DMDefault) && DisplayPosition.display_position#enclosed_in pn ->
 		let s = s_type_path path in
 		DisplayToplevel.collect_and_raise ctx TKType NoValue CRTypeHint (s,pn) {pn with pmin = pn.pmax - String.length s;}
 

+ 3 - 0
tests/server/run.hxml

@@ -0,0 +1,3 @@
+build.hxml
+--next
+-cmd node test.js

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

@@ -0,0 +1,25 @@
+package cases.display.issues;
+
+class Issue9449 extends DisplayTestCase {
+	/**
+		class C {
+			public var x:Int;
+			public function new() {}
+		}
+
+		function main() {
+			Macro.f(new C(), {{-1-}});
+		}
+	**/
+	function test(_) {
+		vfs.putContent("Macro.hx", getTemplate("issues/Issue9449/Macro.hx"));
+		runHaxeJson([], DisplayMethods.Completion, {
+			file: file,
+			offset: offset(1),
+			wasAutoTriggered: true
+		});
+		var result = parseCompletion().result;
+		Assert.equals(1, result.items.length);
+		Assert.equals('x', result.items[0].args.field.name);
+	}
+}

+ 38 - 0
tests/server/test/templates/issues/Issue9449/Macro.hx

@@ -0,0 +1,38 @@
+#if macro
+import haxe.macro.Context;
+import haxe.macro.Expr;
+import haxe.macro.Type;
+using haxe.macro.Tools;
+#end
+
+macro function f(a, b) {
+	var t = Context.typeof(a);
+	var ct = generateDerivedType(t);
+	var r = macro @:pos(b.pos) ($b : $ct);
+	return r;
+}
+
+#if macro
+function generateDerivedType(t:Type):ComplexType {
+	var cl = switch (t) {
+		case TInst(_.get() => cl, _): cl;
+		case _: throw "nope";
+	};
+
+	var derivedName = cl.name + "__Derived";
+	try {
+		Context.getType(derivedName);
+	} catch (e) {
+		var derivedFields:Array<Field> = [for (f in cl.fields.get()) {pos: f.pos, name: f.name, kind: FVar(f.type.toComplexType()), meta: [{name: ":optional", pos: f.pos}]}];
+		Context.defineType({
+			pos: cl.pos,
+			pack: [],
+			name: derivedName,
+			kind: TDStructure,
+			fields: derivedFields,
+		}, cl.module);
+	}
+
+	return TPath({pack: [], name: derivedName});
+}
+#end