diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-07-17 14:12:11 -0700 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-07-17 14:12:51 -0700 |
| commit | 0442c8dd216f16c7371873a8e8fd8bf83d30dad0 (patch) | |
| tree | f3ca5f178b9851d27d95bf060f966e2398ef9a6a /nomsu_tree.moon | |
| parent | be06fc096aa28358914bd6a76b4ea380a04b8873 (diff) | |
Overhaul of comment handling, plus a few fixes (e.g. a fix for indented
text that begins with a nomsu comment)
Diffstat (limited to 'nomsu_tree.moon')
| -rw-r--r-- | nomsu_tree.moon | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/nomsu_tree.moon b/nomsu_tree.moon index 923bd72..9df240a 100644 --- a/nomsu_tree.moon +++ b/nomsu_tree.moon @@ -22,17 +22,24 @@ for name in *types .__tostring = => "#{@type}(#{repr tostring(@source)}, #{concat([repr(v) for v in *@], ', ')})" .map = (fn)=> replacement = fn(@) - if replacement != nil then return replacement or nil - replacements = {} - changes = false - for i,v in ipairs(@) - replacement = if AST.is_syntax_tree(v) - v\map(fn) - else v - changes or= replacement != v - replacements[#replacements+1] = replacement - return @ unless changes - return (@__class)(@source, unpack(replacements)) + if replacement == false then return nil + if replacement + -- Clone the replacement, but give it a proper source + replacement = (replacement.__class)(@source, unpack(replacement)) + else + replacements = {} + changes = false + for i,v in ipairs(@) + replacements[#replacements+1] = v + if AST.is_syntax_tree(v) + r = v\map(fn) + continue if r == v or r == nil + changes = true + replacements[#replacements] = r + return @ unless changes + replacement = (@__class)(@source, unpack(replacements)) + replacement.comments = [c for c in *@comments] if @comments + return replacement AST[name] = setmetatable cls, __tostring: => @name |
