@@ -236,6 +236,75 @@ let visibility_qualified(vis: ast.Visibility, s: string): string =
236236// member self.deref_mut().Target =
237237// self.s
238238
239+ let print_emit_expr self value ( args : Vec < _ >, printArgs ) =
240+ let args = args.ToArray()
241+ // printer.AddLocation(loc)
242+
243+ let inline replace pattern ( f : System.Text.RegularExpressions.Match -> string ) input =
244+ System.Text.RegularExpressions.Regex.Replace( input, pattern, f)
245+
246+ let printSegment ( printer : Pretty.Printer ) ( value : string ) segmentStart segmentEnd =
247+ let segmentLength = segmentEnd - segmentStart
248+ if segmentLength > 0 then
249+ let segment = value.Substring( segmentStart, segmentLength)
250+ self.s.word( segment)
251+
252+ // Macro transformations
253+ // https://fable.io/docs/communicate/js-from-fable.html#Emit-when-F-is-not-enough
254+ let value =
255+ value
256+ |> replace @" \$(\d+)\.\.\." ( fun m ->
257+ let rep = ResizeArray()
258+ let i = int m.Groups.[ 1 ]. Value
259+ for j = i to args.Length - 1 do
260+ rep.Add( " $" + string j)
261+ String.concat " , " rep)
262+
263+ // |> replace @"\{\{\s*\$(\d+)\s*\?(.*?)\:(.*?)\}\}" (fun m ->
264+ // let i = int m.Groups.[1].Value
265+ // match args.[i] with
266+ // | Literal(BooleanLiteral(value=value)) when value -> m.Groups.[2].Value
267+ // | _ -> m.Groups.[3].Value)
268+
269+ |> replace @" \{\{([^\}]*\$(\d+).*?)\}\}" ( fun m ->
270+ let i = int m.Groups.[ 2 ]. Value
271+ match Array.tryItem i args with
272+ | Some _ -> m.Groups.[ 1 ]. Value
273+ | None -> " " )
274+
275+ // If placeholder is followed by !, emit string literals as JS: "let $0! = $1"
276+ // |> replace @"\$(\d+)!" (fun m ->
277+ // let i = int m.Groups.[1].Value
278+ // match Array.tryItem i args with
279+ // | Some(Literal(Literal.StringLiteral(StringLiteral(value, _)))) -> value
280+ // | _ -> "")
281+
282+ let matches = System.Text.RegularExpressions.Regex.Matches( value, @" \$\d+" )
283+ if matches.Count > 0 then
284+ for i = 0 to matches.Count - 1 do
285+ let m = matches.[ i]
286+ let isSurroundedWithParens =
287+ m.Index > 0
288+ && m.Index + m.Length < value.Length
289+ && value.[ m.Index - 1 ] = '('
290+ && value.[ m.Index + m.Length] = ')'
291+
292+ let segmentStart =
293+ if i > 0 then matches.[ i-1 ]. Index + matches.[ i-1 ]. Length
294+ else 0
295+
296+ printSegment self.s value segmentStart m.Index
297+
298+ let argIndex = int m.Value.[ 1 ..]
299+ match Array.tryItem argIndex args with
300+ | Some e -> printArgs e
301+ | None -> self.s.word( " undefined" )
302+
303+ let lastMatch = matches.[ matches.Count - 1 ]
304+ printSegment self.s value ( lastMatch.Index + lastMatch.Length) value.Length
305+ else
306+ printSegment self.s value 0 value.Length
307+
239308type PrintState = State
240309 // abstract comments: unit -> Option<Comments>
241310 // abstract print_ident: ident: Ident -> unit
@@ -868,6 +937,9 @@ type State with
868937 self.print_ mac( m)
869938 | ast.TyKind.CVarArgs ->
870939 self.s.word( " ..." )
940+ | ast.TyKind.EmitTypeExpression( m, p) ->
941+ print_ emit_ expr self m ( p, self.print_ type)
942+ ()
871943 self.s.end_()
872944
873945 member self.print_foreign_item ( item : ast.ForeignItem ) =
@@ -1427,76 +1499,6 @@ type State with
14271499 m.span()
14281500 )
14291501
1430- member self.print_emit_expr ( value , args : Vec < Types.Expr >) =
1431- let args = args.ToArray()
1432- // printer.AddLocation(loc)
1433-
1434- let inline replace pattern ( f : System.Text.RegularExpressions.Match -> string ) input =
1435- System.Text.RegularExpressions.Regex.Replace( input, pattern, f)
1436-
1437- let printSegment ( printer : Pretty.Printer ) ( value : string ) segmentStart segmentEnd =
1438- let segmentLength = segmentEnd - segmentStart
1439- if segmentLength > 0 then
1440- let segment = value.Substring( segmentStart, segmentLength)
1441- self.s.word( segment)
1442-
1443- // Macro transformations
1444- // https://fable.io/docs/communicate/js-from-fable.html#Emit-when-F-is-not-enough
1445- let value =
1446- value
1447- |> replace @" \$(\d+)\.\.\." ( fun m ->
1448- let rep = ResizeArray()
1449- let i = int m.Groups.[ 1 ]. Value
1450- for j = i to args.Length - 1 do
1451- rep.Add( " $" + string j)
1452- String.concat " , " rep)
1453-
1454- // |> replace @"\{\{\s*\$(\d+)\s*\?(.*?)\:(.*?)\}\}" (fun m ->
1455- // let i = int m.Groups.[1].Value
1456- // match args.[i] with
1457- // | Literal(BooleanLiteral(value=value)) when value -> m.Groups.[2].Value
1458- // | _ -> m.Groups.[3].Value)
1459-
1460- |> replace @" \{\{([^\}]*\$(\d+).*?)\}\}" ( fun m ->
1461- let i = int m.Groups.[ 2 ]. Value
1462- match Array.tryItem i args with
1463- | Some _ -> m.Groups.[ 1 ]. Value
1464- | None -> " " )
1465-
1466- // If placeholder is followed by !, emit string literals as JS: "let $0! = $1"
1467- // |> replace @"\$(\d+)!" (fun m ->
1468- // let i = int m.Groups.[1].Value
1469- // match Array.tryItem i args with
1470- // | Some(Literal(Literal.StringLiteral(StringLiteral(value, _)))) -> value
1471- // | _ -> "")
1472-
1473- let matches = System.Text.RegularExpressions.Regex.Matches( value, @" \$\d+" )
1474- if matches.Count > 0 then
1475- for i = 0 to matches.Count - 1 do
1476- let m = matches.[ i]
1477- let isSurroundedWithParens =
1478- m.Index > 0
1479- && m.Index + m.Length < value.Length
1480- && value.[ m.Index - 1 ] = '('
1481- && value.[ m.Index + m.Length] = ')'
1482-
1483- let segmentStart =
1484- if i > 0 then matches.[ i-1 ]. Index + matches.[ i-1 ]. Length
1485- else 0
1486-
1487- printSegment self.s value segmentStart m.Index
1488-
1489- let argIndex = int m.Value.[ 1 ..]
1490- match Array.tryItem argIndex args with
1491- | Some e when isSurroundedWithParens -> self.print_ expr( e)
1492- | Some e -> self.print_ expr( e)
1493- | None -> self.s.word( " undefined" )
1494-
1495- let lastMatch = matches.[ matches.Count - 1 ]
1496- printSegment self.s value ( lastMatch.Index + lastMatch.Length) value.Length
1497- else
1498- printSegment self.s value 0 value.Length
1499-
15001502 member self.print_call_post ( args : Vec < P < ast.Expr >>) =
15011503 self.s.popen()
15021504 self.commasep_ exprs( pp.Breaks.Inconsistent, args)
@@ -2018,7 +2020,7 @@ type State with
20182020 self.s.pclose()
20192021 | ast.ExprKind.MacCall( m) -> self.print_ mac( m)
20202022 | ast.ExprKind.EmitExpression( e, args) ->
2021- self. print_ emit_ expr( e , args)
2023+ print_ emit_ expr self e ( args, self.print _ expr )
20222024 | ast.ExprKind.Paren( e) ->
20232025 self.s.popen()
20242026 self.print_ inner_ attributes_ inline( attrs)
0 commit comments