Skip to content

Commit 448c2e5

Browse files
committed
render takes a buffer
1 parent a6c9206 commit 448c2e5

File tree

2 files changed

+49
-76
lines changed

2 files changed

+49
-76
lines changed

moonscript/compile.lua

Lines changed: 25 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,6 @@ end
1919
local concat, insert = table.concat, table.insert
2020
local pos_to_line, get_closest_line, trim = util.pos_to_line, util.get_closest_line, util.trim
2121
local mtype = util.moon.type
22-
local insert_many
23-
insert_many = function(tbl, ...)
24-
local i = #tbl + 1
25-
local _list_0 = {
26-
...
27-
}
28-
for _index_0 = 1, #_list_0 do
29-
local val = _list_0[_index_0]
30-
tbl[i] = val
31-
i = i + 1
32-
end
33-
end
3422
local Line
3523
Line = (function()
3624
local _parent_0 = nil
@@ -65,28 +53,25 @@ Line = (function()
6553
end
6654
return nil
6755
end,
68-
render = function(self)
69-
local parts = { }
56+
render = function(self, buffer)
7057
local current = { }
7158
local add_current
7259
add_current = function()
73-
return insert(parts, table.concat(current))
60+
return insert(buffer, concat(current))
7461
end
7562
local _list_0 = self
7663
for _index_0 = 1, #_list_0 do
7764
local chunk = _list_0[_index_0]
7865
local _exp_0 = mtype(chunk)
7966
if Block == _exp_0 then
80-
local _list_1 = {
81-
chunk:render()
82-
}
67+
local _list_1 = chunk:render({ })
8368
for _index_1 = 1, #_list_1 do
8469
local block_chunk = _list_1[_index_1]
8570
if "string" == type(block_chunk) then
8671
insert(current, block_chunk)
8772
else
8873
add_current()
89-
insert(parts, block_chunk)
74+
insert(buffer, block_chunk)
9075
current = { }
9176
end
9277
end
@@ -97,7 +82,7 @@ Line = (function()
9782
if #current > 0 then
9883
add_current()
9984
end
100-
return unpack(parts)
85+
return buffer
10186
end,
10287
__tostring = function(self)
10388
return "Line<" .. tostring(self:render()) .. ">"
@@ -138,7 +123,7 @@ Line = (function()
138123
return _class_0
139124
end)()
140125
Block = (function()
141-
local flatten
126+
local add_to_buffer
142127
local _parent_0 = nil
143128
local _base_0 = {
144129
header = "do",
@@ -150,7 +135,7 @@ Block = (function()
150135
if "string" == type(self.header) then
151136
h = self.header
152137
else
153-
h = self.header:render()
138+
h = unpack(self.header:render({ }))
154139
end
155140
return "Block<" .. tostring(h) .. "> <- " .. tostring(self.parent)
156141
end,
@@ -317,44 +302,38 @@ Block = (function()
317302
if "string" == _exp_0 then
318303
return insert(self._lines, line)
319304
elseif Block == _exp_0 then
320-
return insert_many(self._lines, line:render())
305+
return line:render(self._lines)
321306
elseif Line == _exp_0 then
322-
return insert_many(self._lines, line:render())
307+
return line:render(self._lines)
323308
else
324309
return error("Adding unknown item")
325310
end
326311
end,
327-
render = function(self)
328-
local out = {
329-
flatten(self.header)
330-
}
312+
render = function(self, buffer)
313+
add_to_buffer(buffer, self.header)
331314
local lines = (function()
332315
local _accum_0 = { }
333316
local _len_0 = 0
334317
local _list_0 = self._lines
335318
for _index_0 = 1, #_list_0 do
336-
local line = _list_0[_index_0]
337-
local _value_0 = flatten(line)
338-
if _value_0 ~= nil then
339-
_len_0 = _len_0 + 1
340-
_accum_0[_len_0] = _value_0
341-
end
319+
local l = _list_0[_index_0]
320+
_len_0 = _len_0 + 1
321+
_accum_0[_len_0] = l
342322
end
343323
return _accum_0
344324
end)()
345325
if self.next then
346-
insert(out, lines)
347-
insert_many(out, self.next:render())
326+
insert(buffer, lines)
327+
self.next:render(buffer)
348328
else
349-
local footer = flatten(self.footer)
350-
if #lines == 0 and #out == 1 then
351-
out[1] = out[1] .. (" " .. footer)
329+
if #lines == 0 and "string" == type(buffer[#buffer]) then
330+
buffer[#buffer] = buffer[#buffer] .. (" " .. (unpack(add_to_buffer({ }, self.footer))))
352331
else
353-
insert(out, lines)
354-
insert(out, footer)
332+
insert(buffer, lines)
333+
add_to_buffer(buffer, self.footer)
355334
end
356335
end
357-
return unpack(out)
336+
return buffer
358337
end,
359338
block = function(self, header, footer)
360339
return Block(self, header, footer)
@@ -511,13 +490,14 @@ Block = (function()
511490
})
512491
_base_0.__class = _class_0
513492
local self = _class_0
514-
flatten = function(line)
493+
add_to_buffer = function(buffer, line)
515494
local _exp_0 = mtype(line)
516495
if Line == _exp_0 then
517-
return line:render()
496+
line:render(buffer)
518497
else
519-
return line
498+
insert(buffer, line)
520499
end
500+
return buffer
521501
end
522502
if _parent_0 and _parent_0.__inherited then
523503
_parent_0.__inherited(_parent_0, _class_0)

moonscript/compile.moon

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,6 @@ mtype = util.moon.type
2121
export tree, value, format_error
2222
export Block, RootBlock
2323

24-
insert_many = (tbl, ...) ->
25-
i = #tbl + 1
26-
for val in *{...}
27-
tbl[i] = val
28-
i += 1
29-
3024
-- buffer for building up a line
3125
class Line
3226
_append_single: (item) =>
@@ -46,31 +40,29 @@ class Line
4640
nil
4741

4842
-- todo: remove concats from here
49-
render: =>
50-
parts = {}
43+
render: (buffer) =>
5144
current = {}
5245

5346
add_current = ->
54-
insert parts, table.concat current
47+
insert buffer, concat current
5548

5649
for chunk in *@
5750
switch mtype chunk
5851
when Block
59-
for block_chunk in *{chunk\render!}
52+
for block_chunk in *chunk\render{}
6053
if "string" == type block_chunk
6154
insert current, block_chunk
6255
else
6356
add_current!
64-
insert parts, block_chunk
57+
insert buffer, block_chunk
6558
current = {}
6659
else
6760
insert current, chunk
6861

6962
if #current > 0
7063
add_current!
7164

72-
unpack parts
73-
65+
buffer
7466

7567
__tostring: => "Line<#{@render!}>"
7668

@@ -85,7 +77,7 @@ class Block
8577
h = if "string" == type @header
8678
@header
8779
else
88-
@header\render!
80+
unpack @header\render {}
8981

9082
"Block<#{h}> <- " .. tostring @parent
9183

@@ -222,38 +214,39 @@ class Block
222214
when "string"
223215
insert @_lines, line
224216
when Block
225-
insert_many @_lines, line\render!
217+
line\render @_lines
226218
when Line
227-
insert_many @_lines, line\render!
219+
line\render @_lines
228220
else
229221
error "Adding unknown item"
230222

231-
flatten = (line) ->
223+
add_to_buffer = (buffer, line) ->
232224
switch mtype line
233225
when Line
234-
line\render!
226+
line\render buffer
235227
else
236-
line
228+
insert buffer, line
229+
buffer
237230

238231
-- todo: pass in buffer as argument
239-
render: =>
240-
out = { flatten @header }
232+
render: (buffer) =>
233+
add_to_buffer buffer, @header
241234

242-
lines = for line in *@_lines
243-
flatten line
235+
-- copy lines
236+
lines = [l for l in *@_lines]
244237

245238
if @next
246-
insert out, lines
247-
insert_many out, @next\render!
239+
insert buffer, lines
240+
@next\render buffer
248241
else
249-
footer = flatten @footer
250-
if #lines == 0 and #out == 1
251-
out[1] ..= " " ..footer
242+
-- join an empty block into a single line
243+
if #lines == 0 and "string" == type buffer[#buffer]
244+
buffer[#buffer] ..= " " .. (unpack add_to_buffer {}, @footer)
252245
else
253-
insert out, lines
254-
insert out, footer
246+
insert buffer, lines
247+
add_to_buffer buffer, @footer
255248

256-
unpack out
249+
buffer
257250

258251
block: (header, footer) =>
259252
Block self, header, footer

0 commit comments

Comments
 (0)