Skip to content

Commit cae4d4a

Browse files
committed
refactor transformers to run with context of current block
1 parent 5c409cf commit cae4d4a

File tree

4 files changed

+35
-26
lines changed

4 files changed

+35
-26
lines changed

moonscript/compile.lua

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ Block = (function()
344344
return self:value(node)
345345
end,
346346
value = function(self, node, ...)
347-
node = self.root.transform.value(node)
347+
node = self.transform.value(node)
348348
local action
349349
if type(node) ~= "table" then
350350
action = "raw_value"
@@ -380,7 +380,7 @@ Block = (function()
380380
if not node then
381381
return
382382
end
383-
node = self.root.transform.statement(node)
383+
node = self.transform.statement(node)
384384
local fn = line_compile[ntype(node)]
385385
if not fn then
386386
if has_value(node) then
@@ -429,6 +429,13 @@ Block = (function()
429429
self._posmap = { }
430430
self._names = { }
431431
self._state = { }
432+
do
433+
local _with_0 = transform
434+
self.transform = {
435+
value = _with_0.Value:bind(self),
436+
statement = _with_0.Statement:bind(self)
437+
}
438+
end
432439
if self.parent then
433440
self.root = self.parent.root
434441
self.indent = self.parent.indent + 1
@@ -481,10 +488,6 @@ RootBlock = (function()
481488
local _class_0 = setmetatable({
482489
__init = function(self, ...)
483490
self.root = self
484-
self.transform = {
485-
value = transform.Value:instance(self),
486-
statement = transform.Statement:instance(self)
487-
}
488491
return _parent_0.__init(self, ...)
489492
end,
490493
__base = _base_0,

moonscript/compile.moon

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ class Block
7171
@_names = {}
7272
@_state = {}
7373

74+
with transform
75+
@transform = {
76+
value: .Value\bind self
77+
statement: .Statement\bind self
78+
}
79+
7480
if @parent
7581
@root = @parent.root
7682
@indent = @parent.indent + 1
@@ -239,7 +245,7 @@ class Block
239245
-- line wise compile functions
240246
name: (node) => @value node
241247
value: (node, ...) =>
242-
node = @root.transform.value node
248+
node = @transform.value node
243249
action = if type(node) != "table"
244250
"raw_value"
245251
else
@@ -257,7 +263,7 @@ class Block
257263

258264
stm: (node, ...) =>
259265
return if not node -- skip blank statements
260-
node = @root.transform.statement node
266+
node = @transform.statement node
261267
fn = line_compile[ntype(node)]
262268
if not fn
263269
-- coerce value into statement
@@ -279,10 +285,6 @@ class Block
279285
class RootBlock extends Block
280286
new: (...) =>
281287
@root = self
282-
@transform = {
283-
value: transform.Value\instance self
284-
statement: transform.Statement\instance self
285-
}
286288
super ...
287289

288290
__tostring: => "RootBlock<>"

moonscript/transform.lua

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -297,12 +297,15 @@ Transformer = (function()
297297
end
298298
node = res
299299
end
300+
return node
300301
end,
301-
__call = function(self, node, ...)
302-
return self:transform(self.scope, node, ...)
302+
bind = function(self, scope)
303+
return function(...)
304+
return self:transform(scope, ...)
305+
end
303306
end,
304-
instance = function(self, scope)
305-
return Transformer(self.transformers, scope)
307+
__call = function(self, ...)
308+
return self:transform(...)
306309
end,
307310
can_transform = function(self, node)
308311
return self.transformers[ntype(node)] ~= nil
@@ -313,9 +316,11 @@ Transformer = (function()
313316
setmetatable(_base_0, _parent_0.__base)
314317
end
315318
local _class_0 = setmetatable({
316-
__init = function(self, transformers, scope)
317-
self.transformers, self.scope = transformers, scope
318-
self.seen_nodes = { }
319+
__init = function(self, transformers)
320+
self.transformers = transformers
321+
self.seen_nodes = setmetatable({ }, {
322+
__mode = "k"
323+
})
319324
end,
320325
__base = _base_0,
321326
__name = "Transformer",

moonscript/transform.moon

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,10 @@ expand_elseif_assign = (ifstm) ->
117117
constructor_name = "new"
118118

119119
class Transformer
120-
new: (@transformers, @scope) =>
121-
@seen_nodes = {}
120+
new: (@transformers) =>
121+
@seen_nodes = setmetatable {}, __mode: "k"
122122

123123
transform: (scope, node, ...) =>
124-
-- print scope, node, ...
125124
return node if @seen_nodes[node]
126125
@seen_nodes[node] = true
127126
while true
@@ -132,12 +131,12 @@ class Transformer
132131
node
133132
return node if res == node
134133
node = res
134+
node
135135

136-
__call: (node, ...) =>
137-
@transform @scope, node, ...
136+
bind: (scope) =>
137+
(...) -> @transform scope, ...
138138

139-
instance: (scope) =>
140-
Transformer @transformers, scope
139+
__call: (...) => @transform ...
141140

142141
can_transform: (node) =>
143142
@transformers[ntype node] != nil

0 commit comments

Comments
 (0)