Răsfoiți Sursa

[display] respect DKDot for non-field expressions

closes #8180
Simon Krajewski 6 ani în urmă
părinte
comite
4f82f3d71b
2 a modificat fișierele cu 33 adăugiri și 4 ștergeri
  1. 8 4
      src/typing/typerDisplay.ml
  2. 25 0
      tests/display/src/cases/Issue8180.hx

+ 8 - 4
src/typing/typerDisplay.ml

@@ -369,13 +369,17 @@ and display_expr ctx e_ast e dk with_type p =
 	| DMTypeDefinition ->
 		raise_position_of_type e.etype
 	| DMDefault when not (!Parser.had_resume)->
+		let display_fields e_ast e l =
+			let fields = DisplayFields.collect ctx e_ast e dk with_type p in
+			let item = completion_item_of_expr ctx e in
+			raise_fields fields (CRField(item,e.epos,None,None)) (Some {e.epos with pmin = e.epos.pmax - l;})
+		in
 		begin match fst e_ast,e.eexpr with
 			| EField(e1,s),TField(e2,_) ->
-				let fields = DisplayFields.collect ctx e1 e2 dk with_type p in
-				let item = completion_item_of_expr ctx e2 in
-				raise_fields fields (CRField(item,e2.epos,None,None)) (Some {e.epos with pmin = e.epos.pmax - String.length s;})
+				display_fields e1 e2 (String.length s)
 			| _ ->
-				raise_toplevel ctx dk with_type None p
+				if dk = DKDot then display_fields e_ast e 0
+				else raise_toplevel ctx dk with_type None p
 		end
 	| DMDefault | DMNone | DMModuleSymbols _ | DMDiagnostics _ | DMStatistics ->
 		let fields = DisplayFields.collect ctx e_ast e dk with_type p in

+ 25 - 0
tests/display/src/cases/Issue8180.hx

@@ -0,0 +1,25 @@
+package cases;
+
+class Issue8180 extends DisplayTestCase {
+	/**
+		class Main {
+			#if !macro
+			static function main() {
+				f({-1-}
+			}
+			#end
+
+			static macro function f(e) {
+				switch e {
+					case {expr: EDisplay(macro null, DKMarked), pos: p}:
+						return {pos: p, expr: EDisplay(macro {x:1}, DKDot)};
+					case _:
+						return macro null;
+				}
+			}
+		}
+	**/
+	function test() {
+		eq(true, hasField(fields(pos(1)), "x", "Int"));
+	}
+}