Fix trailing commas with a trailing comment (#664)

The reason why trailing comments on a line work with commas is because of a special `lineSuffix` document that delays printing the content until a \n is printed. But `lineSuffix` only worked for pure string. By making it work with arbitrary documents we can fix trailing commas with trailing comments.

Fixes #538
master
Christopher Chedeau 2017-02-13 07:13:16 -08:00 committed by James Long
parent 287db4a9b6
commit 1a8e97f92b
5 changed files with 198 additions and 12 deletions

View File

@ -439,7 +439,7 @@ function printTrailingComment(commentPath, print, options, parentNode) {
comment
);
return concat([hardline, isLineBeforeEmpty ? hardline : "", contents]);
return lineSuffix(concat([hardline, isLineBeforeEmpty ? hardline : "", contents]));
} else if (isBlock) {
// Trailing block comments never need a newline
return concat([" ", contents]);

View File

@ -63,11 +63,7 @@ function ifBreak(breakContents, flatContents) {
}
function lineSuffix(contents) {
if (typeof contents !== "string") {
throw new Error(
"lineSuffix only takes a string, but given: " + JSON.stringify(contents)
);
}
assertDoc(contents);
return { type: "line-suffix", contents };
}

View File

@ -87,7 +87,7 @@ function printDocToString(doc, width, newLine) {
let cmds = [[0, MODE_BREAK, doc]];
let out = [];
let shouldRemeasure = false;
let lineSuffix = "";
let lineSuffix = [];
while (cmds.length !== 0) {
const x = cmds.pop();
@ -190,7 +190,7 @@ function printDocToString(doc, width, newLine) {
break;
case "line-suffix":
lineSuffix += doc.contents;
lineSuffix.push([ind, mode, doc.contents]);
break;
case "line":
switch (mode) {
@ -215,8 +215,15 @@ function printDocToString(doc, width, newLine) {
}
case MODE_BREAK:
if (lineSuffix.length) {
cmds.push([ind, mode, doc]);
[].push.apply(cmds, lineSuffix.reverse());
lineSuffix = [];
break;
}
if (doc.literal) {
out.push(lineSuffix + newLine);
out.push(newLine);
pos = 0;
} else {
if (out.length > 0) {
@ -227,11 +234,9 @@ function printDocToString(doc, width, newLine) {
);
}
out.push(lineSuffix + newLine + " ".repeat(ind));
out.push(newLine + " ".repeat(ind));
pos = ind;
}
lineSuffix = "";
break;
}
break;

View File

@ -153,3 +153,153 @@ const aLong = {
};
"
`;
exports[`test trailing_whitespace.js 1`] = `
"let example = [
\'FOO\',
\'BAR\',
// Comment
];
foo({},
// Comment
);
o = {
state,
// Comment
};
o = {
state,
// Comment
};
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB
// Comment
) {
a
}
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB,
// Comment
) {
a
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
let example = [
\"FOO\",
\"BAR\"
// Comment
];
foo(
{}
// Comment
);
o = {
state
// Comment
};
o = {
state
// Comment
};
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB
) // Comment
{
a;
}
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB
) // Comment
{
a;
}
"
`;
exports[`test trailing_whitespace.js 2`] = `
"let example = [
\'FOO\',
\'BAR\',
// Comment
];
foo({},
// Comment
);
o = {
state,
// Comment
};
o = {
state,
// Comment
};
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB
// Comment
) {
a
}
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB,
// Comment
) {
a
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
let example = [
\"FOO\",
\"BAR\",
// Comment
];
foo(
{},
// Comment
);
o = {
state,
// Comment
};
o = {
state,
// Comment
};
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB,
) // Comment
{
a;
}
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB,
) // Comment
{
a;
}
"
`;

View File

@ -0,0 +1,35 @@
let example = [
'FOO',
'BAR',
// Comment
];
foo({},
// Comment
);
o = {
state,
// Comment
};
o = {
state,
// Comment
};
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB
// Comment
) {
a
}
function supersupersupersuperLongF(
supersupersupersuperLongA,
supersupersupersuperLongB,
// Comment
) {
a
}