@@ -1115,7 +1115,7 @@ function show_unquoted_quote_expr(io::IO, @nospecialize(value), indent::Int, pre
11151115 end
11161116 else
11171117 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)
11191119 print (io, " end" )
11201120 else
11211121 print (io, " :(" )
@@ -1190,6 +1190,10 @@ function is_core_macro(arg, macro_name::AbstractString)
11901190 arg === GlobalRef (Core, Symbol (macro_name))
11911191end
11921192
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+
11931197# TODO : implement interpolated strings
11941198function show_unquoted (io:: IO , ex:: Expr , indent:: Int , prec:: Int , quote_level:: Int = 0 )
11951199 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
13241328 # other call-like expressions ("A[1,2]", "T{X,Y}", "f.(X,Y)")
13251329 elseif haskey (expr_calls, head) && nargs >= 1 # :ref/:curly/:calldecl/:(.)
13261330 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)
13281332
13291333 # comprehensions
13301334 elseif head === :typed_comprehension && nargs == 2
@@ -1360,50 +1364,52 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int, quote_level::In
13601364 # function calls need to transform the function from :call to :calldecl
13611365 # so that operators are printed correctly
13621366 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)
13641368 print (io, " end" )
13651369
13661370 elseif (head === :function || head === :macro ) && nargs == 1
13671371 print (io, head, ' ' )
1368- show_unquoted (io , args[1 ])
1372+ show_unquoted (IOContext (io, beginsym => false ) , args[1 ])
13691373 print (io, " end" )
13701374
13711375 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)
13731378 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)
13751380 for stmt in args[2 ]. args[2 ]. args
13761381 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)
13781383 end
13791384 print (io, ' \n ' , " " ^ indent)
13801385 print (io, " end" )
13811386
13821387 # block with argument
13831388 elseif head in (:for ,:while ,:function ,:macro ,:if ,:elseif ,:let ) && nargs== 2
13841389 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)
13861391 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)
13881393 end
13891394 print (io, " end" )
13901395
13911396 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)
13931399 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)
13951401 else
1396- show_block (io , " else" , args[3 ], indent, quote_level)
1402+ show_block (iob , " else" , args[3 ], indent, quote_level)
13971403 print (io, " end" )
13981404 end
13991405
14001406 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)
14021408 print (io, " end" )
14031409
14041410 # type declaration
14051411 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)
14071413 print (io, " end" )
14081414
14091415 elseif head === :primitive && nargs == 2
@@ -1413,7 +1419,7 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int, quote_level::In
14131419
14141420 elseif head === :abstract && nargs == 1
14151421 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)
14171423 print (io, " end" )
14181424
14191425 # 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
15151521 show_linenumber (io, args... )
15161522
15171523 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)
15191526 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)
15211528 end
15221529 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)
15241531 end
15251532 print (io, " end" )
15261533
15271534 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
15301552
15311553 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 )
15331555 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,
15351557 quote_level+ 1 )
15361558 print (io, " end" )
15371559 elseif head === :quote && nargs == 1
15381560 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 )
15401562 print (io, " )" )
15411563 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 )
15431565 print (io, " end" )
15441566
15451567 elseif head === :gotoifnot && nargs == 2 && isa (args[2 ], Int)
0 commit comments