Browse Source

don't generate getter call for display on abstracts (#8823)

Aleksandr Kuzmenko 5 years ago
parent
commit
035711de59

+ 3 - 0
src/typing/fields.ml

@@ -544,6 +544,9 @@ let rec type_field cfg ctx e i p mode =
 			let et = type_module_type ctx (TClassDecl c) None p in
 			let field_expr f t = mk (TField (et,FStatic (c,f))) t p in
 			(match mode, f.cf_kind with
+			| (MGet | MCall), Var {v_read = AccCall } when ctx.in_display && DisplayPosition.display_position#enclosed_in p ->
+				let ef = field_expr f (field_type f) in
+				AKExpr(ef)
 			| (MGet | MCall), Var {v_read = AccCall } ->
 				(* getter call *)
 				let getter = PMap.find ("get_" ^ f.cf_name) c.cl_statics in

+ 12 - 0
tests/server/src/DisplayTests.hx

@@ -246,6 +246,18 @@ typedef Foo = {
 		});
 	}
 
+	function testIssue8805_gotoAbstractPropertyWithInlineGetter() {
+		vfs.putContent("Main.hx", getTemplate("issues/Issue8805/Main.hx"));
+		var args = ["-main", "Main"];
+		runHaxeJson(args, DisplayMethods.GotoDefinition, {file: new FsPath("Main.hx"), offset: 56});
+		var result = parseGotoDefinition();
+		if(result.result.length == 0) {
+			Assert.fail('display/definition failed');
+		} else {
+			Assert.same({"start":{"line":7, "character":12}, "end":{"line":7, "character":15}}, result.result[0].range);
+		}
+	}
+
 	function testIssue8992() {
 		var mainHx = Marker.extractMarkers('class Main {
 	static func{-1-}tion main() {

+ 4 - 0
tests/server/src/HaxeServerTestCase.hx

@@ -120,6 +120,10 @@ class HaxeServerTestCase implements ITest {
 		return Json.parse(lastResult.stderr).result;
 	}
 
+	function parseGotoDefinition():GotoTypeDefinitionResult {
+		return Json.parse(lastResult.stderr).result;
+	}
+
 	function assertSuccess(?p:haxe.PosInfos) {
 		Assert.isTrue(0 == errorMessages.length, p);
 	}

+ 13 - 0
tests/server/test/templates/issues/Issue8805/Main.hx

@@ -0,0 +1,13 @@
+class Main {
+	static function main() {
+		(null : Foo).bar;
+	}
+}
+
+abstract Foo(String) from String {
+	public var bar(get, never):String;
+
+	inline function get_bar() {
+		return this;
+	}
+}