Skip to content

Commit

Permalink
render comments in custom ASTs gracefully (#3393)
Browse files Browse the repository at this point in the history
fixes #3246
  • Loading branch information
alexlamsl committed May 2, 2019
1 parent 429d2b5 commit a89d424
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
38 changes: 23 additions & 15 deletions lib/output.js
Expand Up @@ -451,16 +451,11 @@ function OutputStream(options) {

function prepend_comments(node) {
var self = this;
var start = node.start;
if (!start) return;
if (start.comments_before && start.comments_before._dumped === self) return;
var comments = start.comments_before;
if (!comments) {
comments = start.comments_before = [];
}
comments._dumped = self;
var scan = node instanceof AST_Exit && node.value;
var comments = dump(node);
if (!comments) return;

if (node instanceof AST_Exit && node.value) {
if (scan) {
var tw = new TreeWalker(function(node) {
var parent = tw.parent();
if (parent instanceof AST_Exit
Expand All @@ -471,11 +466,8 @@ function OutputStream(options) {
|| parent instanceof AST_Sequence && parent.expressions[0] === node
|| parent instanceof AST_Sub && parent.expression === node
|| parent instanceof AST_UnaryPostfix) {
var text = node.start.comments_before;
if (text && text._dumped !== self) {
text._dumped = self;
comments = comments.concat(text);
}
var before = dump(node);
if (before) comments = comments.concat(before);
} else {
return true;
}
Expand Down Expand Up @@ -518,13 +510,29 @@ function OutputStream(options) {
}
});
if (!last_nlb) {
if (start.nlb) {
if (node.start.nlb) {
print("\n");
indent();
} else {
space();
}
}

function dump(node) {
var token = node.start;
if (!token) {
if (!scan) return;
node.start = token = new AST_Token();
}
var comments = token.comments_before;
if (!comments) {
if (!scan) return;
token.comments_before = comments = [];
}
if (comments._dumped === self) return;
comments._dumped = self;
return comments;
}
}

function append_comments(node, tail) {
Expand Down
17 changes: 17 additions & 0 deletions test/mocha/comments.js
Expand Up @@ -260,6 +260,23 @@ describe("comments", function() {
].join("\n"));
});

it("Should handle programmatic AST insertions gracefully", function() {
var ast = UglifyJS.parse([
"function f() {",
" //foo",
" bar;",
" return;",
"}",
].join("\n"));
ast.body[0].body[0] = new UglifyJS.AST_Throw({value: ast.body[0].body[0].body});
ast.body[0].body[1].value = new UglifyJS.AST_Number({value: 42});
assert.strictEqual(ast.print_to_string({comments: "all"}), [
"function f(){",
"//foo",
"throw bar;return 42}",
].join("\n"));
});

describe("comment before constant", function() {
var js = 'function f() { /*c1*/ var /*c2*/ foo = /*c3*/ false; return foo; }';

Expand Down
3 changes: 2 additions & 1 deletion test/run-tests.js
Expand Up @@ -219,8 +219,9 @@ function run_compress_tests() {
var input_code = make_code(input);
var input_formatted = make_code(test.input, {
beautify: true,
comments: "all",
keep_quoted_props: true,
quote_style: 3,
keep_quoted_props: true
});
try {
U.parse(input_code);
Expand Down

0 comments on commit a89d424

Please sign in to comment.