Răsfoiți Sursa

rework display handling in interpolated strings (closes #5653, closes #5654)

Simon Krajewski 9 ani în urmă
părinte
comite
880f73d17d
4 a modificat fișierele cu 9 adăugiri și 12 ștergeri
  1. 1 1
      Makefile
  2. 0 1
      src/display/display.ml
  3. 1 1
      src/optimization/optimizer.ml
  4. 7 9
      src/typing/typer.ml

+ 1 - 1
Makefile

@@ -190,7 +190,7 @@ src/optimization/dce.$(MODULE_EXT): src/path.$(MODULE_EXT) src/syntax/ast.$(MODU
 
 src/optimization/filters.$(MODULE_EXT): src/syntax/ast.$(MODULE_EXT) src/optimization/analyzer.$(MODULE_EXT) src/typing/common.$(MODULE_EXT) src/typing/type.$(MODULE_EXT) src/optimization/dce.$(MODULE_EXT) src/generators/codegen.$(MODULE_EXT) src/typing/typecore.$(MODULE_EXT)
 
-src/optimization/optimizer.$(MODULE_EXT): src/typing/typecore.$(MODULE_EXT) src/typing/type.$(MODULE_EXT) src/syntax/parser.$(MODULE_EXT) src/typing/common.$(MODULE_EXT) src/syntax/ast.$(MODULE_EXT)
+src/optimization/optimizer.$(MODULE_EXT): src/display/display.$(MODULE_EXT) src/typing/typecore.$(MODULE_EXT) src/typing/type.$(MODULE_EXT) src/syntax/parser.$(MODULE_EXT) src/typing/common.$(MODULE_EXT) src/syntax/ast.$(MODULE_EXT)
 
 # syntax
 

+ 0 - 1
src/display/display.ml

@@ -29,7 +29,6 @@ exception Metadata of string
 exception DisplaySignatures of (t * documentation) list
 exception DisplayType of t * pos
 exception DisplayPosition of Ast.pos list
-exception DisplaySubExpression of Ast.expr
 exception DisplayFields of (string * display_field_kind * documentation) list
 exception DisplayToplevel of IdentifierType.t list
 exception DisplayPackage of string list

+ 1 - 1
src/optimization/optimizer.ml

@@ -1681,7 +1681,7 @@ let optimize_completion_expr e =
 			let el = List.fold_left (fun acc e ->
 				typing_side_effect := false;
 				let e = loop e in
-				if !typing_side_effect then begin told := true; e :: acc end else acc
+				if !typing_side_effect || Display.is_display_position (pos e) then begin told := true; e :: acc end else acc
 			) [] el in
 			old();
 			typing_side_effect := !told;

+ 7 - 9
src/typing/typer.ml

@@ -2792,12 +2792,15 @@ and format_string ctx s p =
 	let min = ref (p.pmin + 1) in
 	let add_expr (enext,p) len =
 		min := !min + len;
-		if ctx.in_display && Display.is_display_position p then
-			raise (Display.DisplaySubExpression (enext,p));
+		let enext = if ctx.in_display && Display.is_display_position p then
+			Display.process_expr ctx.com (enext,p)
+		else
+			enext,p
+		in
 		match !e with
-		| None -> e := Some (enext,p)
+		| None -> e := Some enext
 		| Some prev ->
-			e := Some (EBinop (OpAdd,prev,(enext,p)),punion (pos prev) p)
+			e := Some (EBinop (OpAdd,prev,enext),punion (pos prev) p)
 	in
 	let add enext len =
 		let p = { p with pmin = !min; pmax = !min + len } in
@@ -3733,11 +3736,6 @@ and handle_display ctx e_ast iscall with_type =
 		with Not_found ->
 			raise err
 		end
-	| Display.DisplaySubExpression e ->
-		ctx.in_display <- false;
-		let e = type_expr ctx e Value in
-		ctx.in_display <- true;
-		e
 	in
 	let p = e.epos in
 	let e = match with_type with