clang-format: [JS] ASI after imports

Summary:
Automatic semicolon insertion should break import and export statements:

Before, this would format on one line:

  // Note: no semi after 'x' below!
  import {x} from 'x'
  export function foo() {}

Into:
  import {x} from 'x' export function foo() {}

With this change, the statements get separated.

This also improves automatic semicolon insertion to consider closing
braces preceding declarations and statements.

Reviewers: klimek

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D28465

llvm-svn: 291428
This commit is contained in:
Martin Probst 2017-01-09 08:56:36 +00:00
parent 6eedfe77c1
commit d40bca431d
2 changed files with 31 additions and 5 deletions

View File

@ -737,7 +737,7 @@ void UnwrappedLineParser::readTokenWithJavaScriptASI() {
return;
}
if (Next->is(tok::exclaim) && PreviousMustBeValue)
addUnwrappedLine();
return addUnwrappedLine();
bool NextMustBeValue = mustBeJSIdentOrValue(Keywords, Next);
bool NextEndsTemplateExpr =
Next->is(TT_TemplateString) && Next->TokenText.startswith("}");
@ -745,9 +745,10 @@ void UnwrappedLineParser::readTokenWithJavaScriptASI() {
(PreviousMustBeValue ||
Previous->isOneOf(tok::r_square, tok::r_paren, tok::plusplus,
tok::minusminus)))
addUnwrappedLine();
if (PreviousMustBeValue && isJSDeclOrStmt(Keywords, Next))
addUnwrappedLine();
return addUnwrappedLine();
if ((PreviousMustBeValue || Previous->is(tok::r_brace)) &&
isJSDeclOrStmt(Keywords, Next))
return addUnwrappedLine();
}
void UnwrappedLineParser::parseStructuralElement() {
@ -1974,7 +1975,14 @@ void UnwrappedLineParser::parseJavaScriptEs6ImportExport() {
!FormatTok->isStringLiteral())
return;
while (!eof() && FormatTok->isNot(tok::semi)) {
while (!eof()) {
if (FormatTok->is(tok::semi))
return;
if (Line->Tokens.size() == 0) {
// Common issue: Automatic Semicolon Insertion wrapped the line, so the
// import statement should terminate.
return;
}
if (FormatTok->is(tok::l_brace)) {
FormatTok->BlockKind = BK_Block;
parseBracedList();

View File

@ -858,6 +858,24 @@ TEST_F(FormatTestJS, AutomaticSemicolonInsertionHeuristic) {
"return 1",
"a = null\n"
" return 1");
verifyFormat(
"x = {a: 1}\n"
"class Y {}",
" x = {a : 1}\n"
" class Y { }");
}
TEST_F(FormatTestJS, ImportExportASI) {
verifyFormat(
"import {x} from 'y'\n"
"export function z() {}",
"import {x} from 'y'\n"
" export function z() {}");
verifyFormat(
"export {x}\n"
"class Y {}",
" export {x}\n"
" class Y {\n}");
}
TEST_F(FormatTestJS, ClosureStyleCasts) {