aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2024-05-16 17:25:37 +0800
committerLi Jin <dragon-fly@qq.com>2024-05-16 17:25:37 +0800
commitfe317e2bdd9cb60b3c7cd347e21ce65cf90396e7 (patch)
treeed0b010b08f91fdb2bc9a4df18e8d638d47b1c7a
parentc857b3b83c7485693bfcc2b65e9e6e95107396f4 (diff)
downloadyuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.tar.gz
yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.tar.bz2
yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.zip
fix ambiguous issue in try-catch syntax.v0.23.4
-rw-r--r--spec/inputs/try_catch.yue86
-rw-r--r--spec/outputs/5.1/try_catch.lua141
-rw-r--r--spec/outputs/try_catch.lua117
-rw-r--r--spec/outputs/unicode/try_catch.lua39
-rw-r--r--src/yuescript/yue_compiler.cpp69
5 files changed, 272 insertions, 180 deletions
diff --git a/spec/inputs/try_catch.yue b/spec/inputs/try_catch.yue
index ccb3f52..419eef4 100644
--- a/spec/inputs/try_catch.yue
+++ b/spec/inputs/try_catch.yue
@@ -1,60 +1,60 @@
1try 1f = ->
2 func 1, 2, 3 2 try
3catch err
4 print err
5
6try func 1, 2, 3
7catch err
8 print err
9
10try
11 print "trying"
12 func 1, 2, 3
13
14do
15 success, result = try
16 func 1, 2, 3 3 func 1, 2, 3
17 catch err 4 catch err
18 print err 5 print err
19 6
20 success, result = try func 1, 2, 3 7 try func 1, 2, 3
8 catch err
9 print err
21 10
22try tb.func 11 try
23try tb.func! 12 print "trying"
24try tb.func() 13 func 1, 2, 3
25try (tb.func!)
26try (tb\func(1, 2, 3))
27 14
28try tb.func 1 15 do
29try tb.func(1) 16 success, result = try
17 func 1, 2, 3
18 catch err
19 print err
30 20
31if (try func 1 21 success, result = try func 1, 2, 3
32catch err
33 print err)
34 print "OK"
35 22
36if try (func 1) 23 try tb.func
37catch err 24 try tb.func!
38 print err 25 try tb.func()
39 print "OK" 26 try (tb.func!)
27 try (tb\func(1, 2, 3))
40 28
41do 29 try tb.func 1
42 if success, result := try func "abc", 123 30 try tb.func(1)
43 print result
44 31
45 success, result = try func "abc", 123 32 if (try func 1
46 catch err 33 catch err
47 print err 34 print err)
35 print "OK"
48 36
49 print result if success, result := try func "abc", 123 37 if try (func 1)
50 catch err 38 catch err
51 print err 39 print err
40 print "OK"
52 41
53do 42 do
54 try 43 if success, result := try func "abc", 123
55 func 1, 2, 3 44 print result
56 45
57 try func 1, 2, 3 46 success, result = try func "abc", 123
47 catch err
48 print err
49
50 print result if success, result := try func "abc", 123
51 catch err
52 print err
53
54 do
55 try
56 func 1, 2, 3
58 57
59nil 58 try func 1, 2, 3
60 59
60 nil
diff --git a/spec/outputs/5.1/try_catch.lua b/spec/outputs/5.1/try_catch.lua
index 9972dca..f63cd91 100644
--- a/spec/outputs/5.1/try_catch.lua
+++ b/spec/outputs/5.1/try_catch.lua
@@ -1,75 +1,94 @@
1xpcall(function() 1local _anon_func_0 = function(func, print)
2 return func(1, 2, 3)
3end, function(err)
4 return print(err)
5end)
6xpcall(function()
7 return func(1, 2, 3)
8end, function(err)
9 return print(err)
10end)
11pcall(function()
12 print("trying") 2 print("trying")
13 return func(1, 2, 3) 3 return func(1, 2, 3)
14end) 4end
15do 5local _anon_func_1 = function(tb)
16 local success, result = xpcall(function() 6 return tb.func
7end
8local _anon_func_2 = function(tb)
9 return tb.func()
10end
11local _anon_func_3 = function(tb)
12 return tb.func()
13end
14local _anon_func_4 = function(tb)
15 return tb.func()
16end
17local _anon_func_5 = function(tb)
18 return tb:func(1, 2, 3)
19end
20local _anon_func_6 = function(tb)
21 return tb.func(1)
22end
23local _anon_func_7 = function(tb)
24 return tb.func(1)
25end
26local f
27f = function()
28 xpcall(function()
17 return func(1, 2, 3) 29 return func(1, 2, 3)
18 end, function(err) 30 end, function(err)
19 return print(err) 31 return print(err)
20 end) 32 end)
21 success, result = pcall(func, 1, 2, 3) 33 xpcall(function()
22end 34 return func(1, 2, 3)
23pcall(tb.func) 35 end, function(err)
24pcall(tb.func) 36 return print(err)
25pcall(tb.func) 37 end)
26pcall((tb.func)) 38 pcall(_anon_func_0, func, print)
27pcall(((function()
28 local _base_0 = tb
29 local _fn_0 = _base_0.func
30 return _fn_0 and function(...)
31 return _fn_0(_base_0, ...)
32 end
33end)()), 1, 2, 3)
34pcall(tb.func, 1)
35pcall(tb.func, 1)
36if (xpcall(function()
37 return func(1)
38end, function(err)
39 return print(err)
40end)) then
41 print("OK")
42end
43if xpcall(function()
44 return func(1)
45end, function(err)
46 return print(err)
47end) then
48 print("OK")
49end
50do
51 do 39 do
52 local success, result = pcall(func, "abc", 123) 40 local success, result = xpcall(function()
53 if success then 41 return func(1, 2, 3)
54 print(result) 42 end, function(err)
55 end 43 return print(err)
44 end)
45 success, result = pcall(func, 1, 2, 3)
56 end 46 end
57 local success, result = xpcall(function() 47 pcall(_anon_func_1, tb)
58 return func("abc", 123) 48 pcall(_anon_func_2, tb)
49 pcall(_anon_func_3, tb)
50 pcall(_anon_func_4, tb)
51 pcall(_anon_func_5, tb)
52 pcall(_anon_func_6, tb)
53 pcall(_anon_func_7, tb)
54 if (xpcall(function()
55 return func(1)
59 end, function(err) 56 end, function(err)
60 return print(err) 57 return print(err)
61 end) 58 end)) then
62 success, result = xpcall(function() 59 print("OK")
63 return func("abc", 123) 60 end
61 if xpcall(function()
62 return func(1)
64 end, function(err) 63 end, function(err)
65 return print(err) 64 return print(err)
66 end) 65 end) then
67 if success then 66 print("OK")
68 print(result)
69 end 67 end
68 do
69 do
70 local success, result = pcall(func, "abc", 123)
71 if success then
72 print(result)
73 end
74 end
75 local success, result = xpcall(function()
76 return func("abc", 123)
77 end, function(err)
78 return print(err)
79 end)
80 success, result = xpcall(function()
81 return func("abc", 123)
82 end, function(err)
83 return print(err)
84 end)
85 if success then
86 print(result)
87 end
88 end
89 do
90 pcall(func, 1, 2, 3)
91 pcall(func, 1, 2, 3)
92 end
93 return nil
70end 94end
71do
72pcall(func, 1, 2, 3)
73pcall(func, 1, 2, 3)
74end
75return nil
diff --git a/spec/outputs/try_catch.lua b/spec/outputs/try_catch.lua
index de52c6c..3c3dd3c 100644
--- a/spec/outputs/try_catch.lua
+++ b/spec/outputs/try_catch.lua
@@ -1,61 +1,80 @@
1xpcall(func, function(err) 1local _anon_func_0 = function(func, print)
2 return print(err)
3end, 1, 2, 3)
4xpcall(func, function(err)
5 return print(err)
6end, 1, 2, 3)
7pcall(function()
8 print("trying") 2 print("trying")
9 return func(1, 2, 3) 3 return func(1, 2, 3)
10end) 4end
11do 5local _anon_func_1 = function(tb)
12 local success, result = xpcall(func, function(err) 6 return tb.func
7end
8local _anon_func_2 = function(tb)
9 return tb.func()
10end
11local _anon_func_3 = function(tb)
12 return tb.func()
13end
14local _anon_func_4 = function(tb)
15 return tb.func()
16end
17local _anon_func_5 = function(tb)
18 return tb:func(1, 2, 3)
19end
20local _anon_func_6 = function(tb)
21 return tb.func(1)
22end
23local _anon_func_7 = function(tb)
24 return tb.func(1)
25end
26local f
27f = function()
28 xpcall(func, function(err)
29 return print(err)
30 end, 1, 2, 3)
31 xpcall(func, function(err)
13 return print(err) 32 return print(err)
14 end, 1, 2, 3) 33 end, 1, 2, 3)
15 success, result = pcall(func, 1, 2, 3) 34 pcall(_anon_func_0, func, print)
16end 35 do
17pcall(tb.func) 36 local success, result = xpcall(func, function(err)
18pcall(tb.func) 37 return print(err)
19pcall(tb.func) 38 end, 1, 2, 3)
20pcall((tb.func)) 39 success, result = pcall(func, 1, 2, 3)
21pcall(((function() 40 end
22 local _base_0 = tb 41 pcall(_anon_func_1, tb)
23 local _fn_0 = _base_0.func 42 pcall(_anon_func_2, tb)
24 return _fn_0 and function(...) 43 pcall(_anon_func_3, tb)
25 return _fn_0(_base_0, ...) 44 pcall(_anon_func_4, tb)
45 pcall(_anon_func_5, tb)
46 pcall(_anon_func_6, tb)
47 pcall(_anon_func_7, tb)
48 if (xpcall(func, function(err)
49 return print(err)
50 end, 1)) then
51 print("OK")
52 end
53 if xpcall((func), function(err)
54 return print(err)
55 end, 1) then
56 print("OK")
26 end 57 end
27end)()), 1, 2, 3)
28pcall(tb.func, 1)
29pcall(tb.func, 1)
30if (xpcall(func, function(err)
31 return print(err)
32end, 1)) then
33 print("OK")
34end
35if xpcall((func), function(err)
36 return print(err)
37end, 1) then
38 print("OK")
39end
40do
41 do 58 do
42 local success, result = pcall(func, "abc", 123) 59 do
60 local success, result = pcall(func, "abc", 123)
61 if success then
62 print(result)
63 end
64 end
65 local success, result = xpcall(func, function(err)
66 return print(err)
67 end, "abc", 123)
68 success, result = xpcall(func, function(err)
69 return print(err)
70 end, "abc", 123)
43 if success then 71 if success then
44 print(result) 72 print(result)
45 end 73 end
46 end 74 end
47 local success, result = xpcall(func, function(err) 75 do
48 return print(err) 76 pcall(func, 1, 2, 3)
49 end, "abc", 123) 77 pcall(func, 1, 2, 3)
50 success, result = xpcall(func, function(err)
51 return print(err)
52 end, "abc", 123)
53 if success then
54 print(result)
55 end 78 end
79 return nil
56end 80end
57do
58pcall(func, 1, 2, 3)
59pcall(func, 1, 2, 3)
60end
61return nil
diff --git a/spec/outputs/unicode/try_catch.lua b/spec/outputs/unicode/try_catch.lua
index fde63d6..7d95f9b 100644
--- a/spec/outputs/unicode/try_catch.lua
+++ b/spec/outputs/unicode/try_catch.lua
@@ -14,19 +14,28 @@ do
14 end, 1, 2, 3) 14 end, 1, 2, 3)
15 _u6210_u529f, _u7ed3_u679c = pcall(_u51fd_u6570, 1, 2, 3) 15 _u6210_u529f, _u7ed3_u679c = pcall(_u51fd_u6570, 1, 2, 3)
16end 16end
17pcall(_u8868["函数"]) 17pcall(function()
18pcall(_u8868["函数"]) 18 return _u8868["函数"]
19pcall(_u8868["函数"]) 19end)
20pcall((_u8868["函数"])) 20pcall(function()
21pcall(((function() 21 return _u8868["函数"]()
22 local _base_0 = _u8868 22end)
23 local _fn_0 = _base_0["函数"] 23pcall(function()
24 return _fn_0 and function(...) 24 return _u8868["函数"]()
25 return _fn_0(_base_0, ...) 25end)
26 end 26pcall(function()
27end)()), 1, 2, 3) 27 return _u8868["函数"]()
28pcall(_u8868["函数"], 1) 28end)
29pcall(_u8868["函数"], 1) 29pcall(function()
30 local _call_0 = _u8868
31 return _call_0["函数"](_call_0, 1, 2, 3)
32end)
33pcall(function()
34 return _u8868["函数"](1)
35end)
36pcall(function()
37 return _u8868["函数"](1)
38end)
30if (xpcall(_u51fd_u6570, function(_u9519_u8bef) 39if (xpcall(_u51fd_u6570, function(_u9519_u8bef)
31 return _u6253_u5370(_u9519_u8bef) 40 return _u6253_u5370(_u9519_u8bef)
32end, 1)) then 41end, 1)) then
@@ -55,7 +64,7 @@ do
55 end 64 end
56end 65end
57do 66do
58pcall(_u51fd_u6570, 1, 2, 3) 67 pcall(_u51fd_u6570, 1, 2, 3)
59pcall(_u51fd_u6570, 1, 2, 3) 68 pcall(_u51fd_u6570, 1, 2, 3)
60end 69end
61return nil 70return nil
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 9a632fb..c205031 100644
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -75,7 +75,7 @@ static std::unordered_set<std::string> Metamethods = {
75 "close"s // Lua 5.4 75 "close"s // Lua 5.4
76}; 76};
77 77
78const std::string_view version = "0.23.3"sv; 78const std::string_view version = "0.23.4"sv;
79const std::string_view extension = "yue"sv; 79const std::string_view extension = "yue"sv;
80 80
81class CompileError : public std::logic_error { 81class CompileError : public std::logic_error {
@@ -4663,8 +4663,10 @@ private:
4663 return 503; 4663 return 503;
4664 } else if (target.value() == "5.4"sv) { 4664 } else if (target.value() == "5.4"sv) {
4665 return 504; 4665 return 504;
4666 } else if (target.value() == "5.5"sv) {
4667 return 505;
4666 } else { 4668 } else {
4667 throw CompileError("get invalid Lua target \""s + target.value() + "\", should be 5.1, 5.2, 5.3 or 5.4"s, x); 4669 throw CompileError("get invalid Lua target \""s + target.value() + "\", should be from 5.1 to 5.5"s, x);
4668 } 4670 }
4669 } 4671 }
4670#ifndef YUE_NO_MACRO 4672#ifndef YUE_NO_MACRO
@@ -9112,7 +9114,9 @@ private:
9112 body->content.set(tryNode->catchBlock->block); 9114 body->content.set(tryNode->catchBlock->block);
9113 funLit->body.set(body); 9115 funLit->body.set(body);
9114 } 9116 }
9115 if (auto tryBlock = tryNode->func.as<Block_t>()) { 9117 ast_sel<false, Block_t, Exp_t> tryFunc;
9118 tryFunc.set(tryNode->func);
9119 if (auto tryBlock = tryFunc.as<Block_t>()) {
9116 BLOCK_START 9120 BLOCK_START
9117 BREAK_IF(tryBlock->statements.size() != 1); 9121 BREAK_IF(tryBlock->statements.size() != 1);
9118 auto stmt = static_cast<Statement_t*>(tryBlock->statements.front()); 9122 auto stmt = static_cast<Statement_t*>(tryBlock->statements.front());
@@ -9124,11 +9128,43 @@ private:
9124 auto chainValue = value->item.as<ChainValue_t>(); 9128 auto chainValue = value->item.as<ChainValue_t>();
9125 BREAK_IF(!chainValue); 9129 BREAK_IF(!chainValue);
9126 BREAK_IF(!isChainValueCall(chainValue)); 9130 BREAK_IF(!isChainValueCall(chainValue));
9127 tryNode->func.set(expListAssign->expList->exprs.front()); 9131 auto tmpChain = chainValue->new_ptr<ChainValue_t>();
9132 tmpChain->items.dup(chainValue->items);
9133 tmpChain->items.pop_back();
9134 auto var = singleVariableFrom(tmpChain, AccessType::None);
9135 BREAK_IF(var.empty());
9136 tryFunc.set(expListAssign->expList->exprs.front());
9128 BLOCK_END 9137 BLOCK_END
9138 } else {
9139 auto tryExp = tryFunc.as<Exp_t>();
9140 bool needWrap = singleVariableFrom(tryExp, AccessType::None).empty();
9141 BLOCK_START
9142 auto value = singleValueFrom(tryExp);
9143 BREAK_IF(!value);
9144 auto chainValue = value->item.as<ChainValue_t>();
9145 BREAK_IF(!chainValue);
9146 BREAK_IF(!isChainValueCall(chainValue));
9147 auto tmpChain = chainValue->new_ptr<ChainValue_t>();
9148 tmpChain->items.dup(chainValue->items);
9149 tmpChain->items.pop_back();
9150 auto var = singleVariableFrom(tmpChain, AccessType::None);
9151 BREAK_IF(var.empty());
9152 needWrap = false;
9153 BLOCK_END
9154 if (needWrap) {
9155 auto expList = x->new_ptr<ExpList_t>();
9156 expList->exprs.push_back(tryFunc);
9157 auto expListAssign = x->new_ptr<ExpListAssign_t>();
9158 expListAssign->expList.set(expList);
9159 auto stmt = x->new_ptr<Statement_t>();
9160 stmt->content.set(expListAssign);
9161 auto block = x->new_ptr<Block_t>();
9162 block->statements.push_back(stmt);
9163 tryFunc.set(block);
9164 }
9129 } 9165 }
9130 if (auto tryBlock = tryNode->func.as<Block_t>()) { 9166 if (auto tryBlock = tryFunc.as<Block_t>()) {
9131 { 9167 if (getLuaTarget(tryBlock) >= 502 || !errHandler) {
9132 if (auto result = upValueFuncFrom(tryBlock)) { 9168 if (auto result = upValueFuncFrom(tryBlock)) {
9133 auto [funcName, args] = std::move(*result); 9169 auto [funcName, args] = std::move(*result);
9134 if (errHandler) { 9170 if (errHandler) {
@@ -9150,6 +9186,7 @@ private:
9150 transformChainValue(pcall, out, ExpUsage::Closure); 9186 transformChainValue(pcall, out, ExpUsage::Closure);
9151 } 9187 }
9152 if (usage == ExpUsage::Common) { 9188 if (usage == ExpUsage::Common) {
9189 out.back().insert(0, indent());
9153 out.back().append(nlr(x)); 9190 out.back().append(nlr(x));
9154 } 9191 }
9155 return; 9192 return;
@@ -9173,19 +9210,25 @@ private:
9173 transformChainValue(pcall, out, ExpUsage::Closure); 9210 transformChainValue(pcall, out, ExpUsage::Closure);
9174 } 9211 }
9175 if (usage == ExpUsage::Common) { 9212 if (usage == ExpUsage::Common) {
9213 out.back().insert(0, indent());
9176 out.back().append(nlr(x)); 9214 out.back().append(nlr(x));
9177 } 9215 }
9178 return; 9216 return;
9179 } else if (auto value = singleValueFrom(tryNode->func)) { 9217 } else if (auto value = singleValueFrom(tryFunc)) {
9180 BLOCK_START 9218 BLOCK_START
9181 auto chainValue = value->item.as<ChainValue_t>(); 9219 auto chainValue = value->item.as<ChainValue_t>();
9182 BREAK_IF(!chainValue); 9220 BREAK_IF(!chainValue);
9183 BREAK_IF(!isChainValueCall(chainValue)); 9221 BREAK_IF(!isChainValueCall(chainValue));
9222 auto tmpChain = chainValue->new_ptr<ChainValue_t>();
9223 tmpChain->items.dup(chainValue->items);
9224 tmpChain->items.pop_back();
9225 auto var = singleVariableFrom(tmpChain, AccessType::None);
9226 BREAK_IF(var.empty());
9184 if (errHandler && getLuaTarget(x) < 502) { 9227 if (errHandler && getLuaTarget(x) < 502) {
9185 auto tryExp = toAst<Exp_t>("->"sv, x); 9228 auto tryExp = toAst<Exp_t>("->"sv, x);
9186 auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>(); 9229 auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>();
9187 auto expList = x->new_ptr<ExpList_t>(); 9230 auto expList = x->new_ptr<ExpList_t>();
9188 expList->exprs.push_back(tryNode->func); 9231 expList->exprs.push_back(tryFunc);
9189 auto expListAssign = x->new_ptr<ExpListAssign_t>(); 9232 auto expListAssign = x->new_ptr<ExpListAssign_t>();
9190 expListAssign->expList.set(expList); 9233 expListAssign->expList.set(expList);
9191 auto stmt = x->new_ptr<Statement_t>(); 9234 auto stmt = x->new_ptr<Statement_t>();
@@ -9210,7 +9253,7 @@ private:
9210 if (errHandler) { 9253 if (errHandler) {
9211 auto xpcall = toAst<ChainValue_t>("xpcall()", x); 9254 auto xpcall = toAst<ChainValue_t>("xpcall()", x);
9212 auto invoke = ast_to<Invoke_t>(xpcall->items.back()); 9255 auto invoke = ast_to<Invoke_t>(xpcall->items.back());
9213 invoke->args.push_back(tryNode->func); 9256 invoke->args.push_back(tryFunc);
9214 invoke->args.push_back(errHandler); 9257 invoke->args.push_back(errHandler);
9215 for (auto arg : args->objects()) { 9258 for (auto arg : args->objects()) {
9216 invoke->args.push_back(arg); 9259 invoke->args.push_back(arg);
@@ -9219,7 +9262,7 @@ private:
9219 } else { 9262 } else {
9220 auto pcall = toAst<ChainValue_t>("pcall()", x); 9263 auto pcall = toAst<ChainValue_t>("pcall()", x);
9221 auto invoke = ast_to<Invoke_t>(pcall->items.back()); 9264 auto invoke = ast_to<Invoke_t>(pcall->items.back());
9222 invoke->args.push_back(tryNode->func); 9265 invoke->args.push_back(tryFunc);
9223 for (auto arg : args->objects()) { 9266 for (auto arg : args->objects()) {
9224 invoke->args.push_back(arg); 9267 invoke->args.push_back(arg);
9225 } 9268 }
@@ -9227,6 +9270,7 @@ private:
9227 } 9270 }
9228 } 9271 }
9229 if (usage == ExpUsage::Common) { 9272 if (usage == ExpUsage::Common) {
9273 out.back().insert(0, indent());
9230 out.back().append(nlr(x)); 9274 out.back().append(nlr(x));
9231 } 9275 }
9232 return; 9276 return;
@@ -9235,16 +9279,17 @@ private:
9235 if (errHandler) { 9279 if (errHandler) {
9236 auto xpcall = toAst<ChainValue_t>("xpcall()", x); 9280 auto xpcall = toAst<ChainValue_t>("xpcall()", x);
9237 auto invoke = ast_to<Invoke_t>(xpcall->items.back()); 9281 auto invoke = ast_to<Invoke_t>(xpcall->items.back());
9238 invoke->args.push_back(tryNode->func); 9282 invoke->args.push_back(tryFunc);
9239 invoke->args.push_back(errHandler); 9283 invoke->args.push_back(errHandler);
9240 transformChainValue(xpcall, out, ExpUsage::Closure); 9284 transformChainValue(xpcall, out, ExpUsage::Closure);
9241 } else { 9285 } else {
9242 auto pcall = toAst<ChainValue_t>("pcall()", x); 9286 auto pcall = toAst<ChainValue_t>("pcall()", x);
9243 auto invoke = ast_to<Invoke_t>(pcall->items.back()); 9287 auto invoke = ast_to<Invoke_t>(pcall->items.back());
9244 invoke->args.push_back(tryNode->func); 9288 invoke->args.push_back(tryFunc);
9245 transformChainValue(pcall, out, ExpUsage::Closure); 9289 transformChainValue(pcall, out, ExpUsage::Closure);
9246 } 9290 }
9247 if (usage == ExpUsage::Common) { 9291 if (usage == ExpUsage::Common) {
9292 out.back().insert(0, indent());
9248 out.back().append(nlr(x)); 9293 out.back().append(nlr(x));
9249 } 9294 }
9250 } 9295 }