added option to keep some comments in the output
authorMihai Bazon <mihai@bazon.net>
Tue, 2 Oct 2012 11:32:30 +0000 (14:32 +0300)
committerMihai Bazon <mihai@bazon.net>
Tue, 2 Oct 2012 11:32:30 +0000 (14:32 +0300)
lib/output.js

index e5531f5..d36c957 100644 (file)
@@ -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;
     });