aboutsummaryrefslogtreecommitdiff
path: root/syntax_tree.moon
diff options
context:
space:
mode:
Diffstat (limited to 'syntax_tree.moon')
-rw-r--r--syntax_tree.moon25
1 files changed, 23 insertions, 2 deletions
diff --git a/syntax_tree.moon b/syntax_tree.moon
index 278e22b..1800fcb 100644
--- a/syntax_tree.moon
+++ b/syntax_tree.moon
@@ -24,6 +24,7 @@ class SyntaxTree
__eq: (other)=>
return false if type(@) != type(other) or #@ != #other or getmetatable(@) != getmetatable(other)
+ return false if @type != other.type
for i=1,#@
return false if @[i] != other[i]
return true
@@ -44,7 +45,20 @@ class SyntaxTree
})
get_source_file: => @@source_code_for_tree[@]
get_source_code: => @@source_code_for_tree[@]\sub(@source.start, @source.stop-1)
- map: (fn)=>
+
+ add: (...)=>
+ n = #@
+ for i=1,select('#', ...)
+ @[n+i] = select(i, ...)
+ @stub = nil
+
+ with: (fn)=>
+ if type(fn) == 'table'
+ replacements = fn
+ fn = (t)->
+ for k,v in pairs(replacements)
+ if k == t then return v
+
replacement = fn(@)
if replacement == false then return nil
if replacement
@@ -60,7 +74,7 @@ class SyntaxTree
for k,v in pairs(@)
replacement[k] = v
if SyntaxTree\is_instance(v)
- r = v\map(fn)
+ r = v\with(fn)
continue if r == v or r == nil
changes = true
replacement[k] = r
@@ -68,6 +82,13 @@ class SyntaxTree
replacement = SyntaxTree(replacement)
return replacement
+ contains: (subtree)=>
+ if subtree == @ then return true
+ for k,v in pairs(@)
+ if SyntaxTree\is_instance(v)
+ return true if v\contains(subtree)
+ return false
+
get_args: =>
assert(@type == "Action" or @type == "MethodCall", "Only actions and method calls have arguments")
args = {}