diff options
Diffstat (limited to 'lib/output.js')
-rw-r--r-- | lib/output.js | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/lib/output.js b/lib/output.js index e5531f55..d36c9578 100644 --- a/lib/output.js +++ b/lib/output.js @@ -58,6 +58,7 @@ function OutputStream(options) { beautify : false, source_map : null, bracketize : false, + comments : false }, true); var indentation = 0; @@ -309,10 +310,12 @@ function OutputStream(options) { stream.push_node(self); if (self.needs_parens(stream)) { stream.with_parens(function(){ + self.add_comments(stream); self.add_source_map(stream); generator(self, stream); }); } else { + self.add_comments(stream); self.add_source_map(stream); generator(self, stream); } @@ -326,12 +329,49 @@ function OutputStream(options) { return s.get(); }); + /* -----[ comments ]----- */ + + AST_Node.DEFMETHOD("add_comments", function(output){ + var c = output.option("comments"), self = this; + if (c) { + var start = self.start; + if (start && !start._comments_dumped) { + start._comments_dumped = true; + var comments = start.comments_before; + if (c.test) { + comments = comments.filter(function(comment){ + return c.test(comment.value); + }); + } else if (typeof c == "function") { + comments = comments.filter(function(comment){ + return c(self, comment.value, comment.type); + }); + } + comments.forEach(function(c){ + if (c.type == "comment1") { + output.print("//" + c.value + "\n"); + output.indent(); + } + else if (c.type == "comment2") { + output.print("/*" + c.value + "*/"); + if (start.nlb) { + output.print("\n"); + output.indent(); + } else { + output.space(); + } + } + }); + } + } + }); + + /* -----[ PARENTHESES ]----- */ + function PARENS(nodetype, func) { nodetype.DEFMETHOD("needs_parens", func); }; - /* -----[ PARENTHESES ]----- */ - PARENS(AST_Node, function(){ return false; }); |