@@ -1115,7 +1115,7 @@ function show_unquoted_quote_expr(io::IO, @nospecialize(value), indent::Int, pre
1115
1115
end
1116
1116
else
1117
1117
if isa (value,Expr) && value. head === :block
1118
- show_block (io , " quote" , value, indent, quote_level)
1118
+ show_block (IOContext (io, beginsym => false ) , " quote" , value, indent, quote_level)
1119
1119
print (io, " end" )
1120
1120
else
1121
1121
print (io, " :(" )
@@ -1190,6 +1190,10 @@ function is_core_macro(arg, macro_name::AbstractString)
1190
1190
arg === GlobalRef (Core, Symbol (macro_name))
1191
1191
end
1192
1192
1193
+ # symbol for IOContext flag signaling whether "begin" is treated
1194
+ # as an ordinary symbol, which is true in indexing expressions.
1195
+ const beginsym = gensym (:beginsym )
1196
+
1193
1197
# TODO : implement interpolated strings
1194
1198
function show_unquoted (io:: IO , ex:: Expr , indent:: Int , prec:: Int , quote_level:: Int = 0 )
1195
1199
head, args, nargs = ex. head, ex. args, length (ex. args)
@@ -1324,7 +1328,7 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int, quote_level::In
1324
1328
# other call-like expressions ("A[1,2]", "T{X,Y}", "f.(X,Y)")
1325
1329
elseif haskey (expr_calls, head) && nargs >= 1 # :ref/:curly/:calldecl/:(.)
1326
1330
funcargslike = head === :(.) ? args[2 ]. args : args[2 : end ]
1327
- show_call (io, head, args[1 ], funcargslike, indent, quote_level)
1331
+ show_call (head == :ref ? IOContext (io, beginsym => true ) : io, head, args[1 ], funcargslike, indent, quote_level)
1328
1332
1329
1333
# comprehensions
1330
1334
elseif head === :typed_comprehension && nargs == 2
@@ -1360,50 +1364,52 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int, quote_level::In
1360
1364
# function calls need to transform the function from :call to :calldecl
1361
1365
# so that operators are printed correctly
1362
1366
elseif head === :function && nargs== 2 && is_expr (args[1 ], :call )
1363
- show_block (io , head, Expr (:calldecl , args[1 ]. args... ), args[2 ], indent, quote_level)
1367
+ show_block (IOContext (io, beginsym => false ) , head, Expr (:calldecl , args[1 ]. args... ), args[2 ], indent, quote_level)
1364
1368
print (io, " end" )
1365
1369
1366
1370
elseif (head === :function || head === :macro ) && nargs == 1
1367
1371
print (io, head, ' ' )
1368
- show_unquoted (io , args[1 ])
1372
+ show_unquoted (IOContext (io, beginsym => false ) , args[1 ])
1369
1373
print (io, " end" )
1370
1374
1371
1375
elseif head === :do && nargs == 2
1372
- show_unquoted (io, args[1 ], indent, - 1 , quote_level)
1376
+ iob = IOContext (io, beginsym=> false )
1377
+ show_unquoted (iob, args[1 ], indent, - 1 , quote_level)
1373
1378
print (io, " do " )
1374
- show_list (io , args[2 ]. args[1 ]. args, " , " , 0 , 0 , quote_level)
1379
+ show_list (iob , args[2 ]. args[1 ]. args, " , " , 0 , 0 , quote_level)
1375
1380
for stmt in args[2 ]. args[2 ]. args
1376
1381
print (io, ' \n ' , " " ^ (indent + indent_width))
1377
- show_unquoted (io , stmt, indent + indent_width, - 1 , quote_level)
1382
+ show_unquoted (iob , stmt, indent + indent_width, - 1 , quote_level)
1378
1383
end
1379
1384
print (io, ' \n ' , " " ^ indent)
1380
1385
print (io, " end" )
1381
1386
1382
1387
# block with argument
1383
1388
elseif head in (:for ,:while ,:function ,:macro ,:if ,:elseif ,:let ) && nargs== 2
1384
1389
if Meta. isexpr (args[2 ], :block )
1385
- show_block (io , head, args[1 ], args[2 ], indent, quote_level)
1390
+ show_block (IOContext (io, beginsym => false ) , head, args[1 ], args[2 ], indent, quote_level)
1386
1391
else
1387
- show_block (io , head, args[1 ], Expr (:block , args[2 ]), indent, quote_level)
1392
+ show_block (IOContext (io, beginsym => false ) , head, args[1 ], Expr (:block , args[2 ]), indent, quote_level)
1388
1393
end
1389
1394
print (io, " end" )
1390
1395
1391
1396
elseif (head === :if || head === :elseif ) && nargs == 3
1392
- show_block (io, head, args[1 ], args[2 ], indent, quote_level)
1397
+ iob = IOContext (io, beginsym=> false )
1398
+ show_block (iob, head, args[1 ], args[2 ], indent, quote_level)
1393
1399
if isa (args[3 ],Expr) && args[3 ]. head === :elseif
1394
- show_unquoted (io , args[3 ], indent, prec, quote_level)
1400
+ show_unquoted (iob , args[3 ], indent, prec, quote_level)
1395
1401
else
1396
- show_block (io , " else" , args[3 ], indent, quote_level)
1402
+ show_block (iob , " else" , args[3 ], indent, quote_level)
1397
1403
print (io, " end" )
1398
1404
end
1399
1405
1400
1406
elseif head === :module && nargs== 3 && isa (args[1 ],Bool)
1401
- show_block (io , args[1 ] ? :module : :baremodule , args[2 ], args[3 ], indent, quote_level)
1407
+ show_block (IOContext (io, beginsym => false ) , args[1 ] ? :module : :baremodule , args[2 ], args[3 ], indent, quote_level)
1402
1408
print (io, " end" )
1403
1409
1404
1410
# type declaration
1405
1411
elseif head === :struct && nargs== 3
1406
- show_block (io , args[1 ] ? Symbol (" mutable struct" ) : Symbol (" struct" ), args[2 ], args[3 ], indent, quote_level)
1412
+ show_block (IOContext (io, beginsym => false ) , args[1 ] ? Symbol (" mutable struct" ) : Symbol (" struct" ), args[2 ], args[3 ], indent, quote_level)
1407
1413
print (io, " end" )
1408
1414
1409
1415
elseif head === :primitive && nargs == 2
@@ -1413,7 +1419,7 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int, quote_level::In
1413
1419
1414
1420
elseif head === :abstract && nargs == 1
1415
1421
print (io, " abstract type " )
1416
- show_list (io , args, ' ' , indent, 0 , quote_level)
1422
+ show_list (IOContext (io, beginsym => false ) , args, ' ' , indent, 0 , quote_level)
1417
1423
print (io, " end" )
1418
1424
1419
1425
# empty return (i.e. "function f() return end")
@@ -1515,31 +1521,47 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int, quote_level::In
1515
1521
show_linenumber (io, args... )
1516
1522
1517
1523
elseif head === :try && 3 <= nargs <= 4
1518
- show_block (io, " try" , args[1 ], indent, quote_level)
1524
+ iob = IOContext (io, beginsym=> false )
1525
+ show_block (iob, " try" , args[1 ], indent, quote_level)
1519
1526
if is_expr (args[3 ], :block )
1520
- show_block (io , " catch" , args[2 ] === false ? Any[] : args[2 ], args[3 ], indent, quote_level)
1527
+ show_block (iob , " catch" , args[2 ] === false ? Any[] : args[2 ], args[3 ], indent, quote_level)
1521
1528
end
1522
1529
if nargs >= 4 && is_expr (args[4 ], :block )
1523
- show_block (io , " finally" , Any[], args[4 ], indent, quote_level)
1530
+ show_block (iob , " finally" , Any[], args[4 ], indent, quote_level)
1524
1531
end
1525
1532
print (io, " end" )
1526
1533
1527
1534
elseif head === :block
1528
- show_block (io, " begin" , ex, indent, quote_level)
1529
- print (io, " end" )
1535
+ # print as (...; ...; ...;) inside indexing expression
1536
+ if get (io, beginsym, false )
1537
+ print (io, ' (' )
1538
+ ind = indent + indent_width
1539
+ for i = 1 : length (ex. args)
1540
+ i > 1 && print (io, " ;\n " , ' ' ^ ind)
1541
+ show_unquoted (io, ex. args[i], ind, - 1 , quote_level)
1542
+ end
1543
+ if length (ex. args) < 2
1544
+ print (isempty (ex. args) ? " nothing;)" : " ;)" )
1545
+ else
1546
+ print (io, ' )' )
1547
+ end
1548
+ else
1549
+ show_block (io, " begin" , ex, indent, quote_level)
1550
+ print (io, " end" )
1551
+ end
1530
1552
1531
1553
elseif head === :quote && nargs == 1 && isa (args[1 ], Symbol)
1532
- show_unquoted_quote_expr (io , args[1 ]:: Symbol , indent, 0 , quote_level+ 1 )
1554
+ show_unquoted_quote_expr (IOContext (io, beginsym => false ) , args[1 ]:: Symbol , indent, 0 , quote_level+ 1 )
1533
1555
elseif head === :quote && nargs == 1 && Meta. isexpr (args[1 ], :block )
1534
- show_block (io , " quote" , Expr (:quote , args[1 ]. args... ), indent,
1556
+ show_block (IOContext (io, beginsym => false ) , " quote" , Expr (:quote , args[1 ]. args... ), indent,
1535
1557
quote_level+ 1 )
1536
1558
print (io, " end" )
1537
1559
elseif head === :quote && nargs == 1
1538
1560
print (io, " :(" )
1539
- show_unquoted (io , args[1 ], indent+ 2 , 0 , quote_level+ 1 )
1561
+ show_unquoted (IOContext (io, beginsym => false ) , args[1 ], indent+ 2 , 0 , quote_level+ 1 )
1540
1562
print (io, " )" )
1541
1563
elseif head === :quote
1542
- show_block (io , " quote" , ex, indent, quote_level+ 1 )
1564
+ show_block (IOContext (io, beginsym => false ) , " quote" , ex, indent, quote_level+ 1 )
1543
1565
print (io, " end" )
1544
1566
1545
1567
elseif head === :gotoifnot && nargs == 2 && isa (args[2 ], Int)
0 commit comments