clang-format: [JS] ASI insertion after boolean literals.

Summary:
Before when a semicolon was missing after a boolean literal:
    a = true
    return 1;

clang-format would parse this as one line and format as:
    a = true return 1;

It turns out that C++ does not consider `true` and `false` to be literals, we
have to check for that explicitly.

Reviewers: djasper

Subscribers: klimek, cfe-commits

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

llvm-svn: 281856
This commit is contained in:
Martin Probst 2016-09-18 17:21:52 +00:00
parent 3f307518f8
commit b9316ff849
2 changed files with 15 additions and 1 deletions

View File

@ -681,7 +681,9 @@ static bool mustBeJSIdent(const AdditionalKeywords &Keywords,
static bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords,
const FormatToken *FormatTok) {
return FormatTok->Tok.isLiteral() || mustBeJSIdent(Keywords, FormatTok);
return FormatTok->Tok.isLiteral() ||
FormatTok->isOneOf(tok::kw_true, tok::kw_false) ||
mustBeJSIdent(Keywords, FormatTok);
}
// isJSDeclOrStmt returns true if |FormatTok| starts a declaration or statement

View File

@ -774,6 +774,18 @@ TEST_F(FormatTestJS, AutomaticSemicolonInsertionHeuristic) {
"String");
verifyFormat("function f(@Foo bar) {}", "function f(@Foo\n"
" bar) {}");
verifyFormat("a = true\n"
"return 1",
"a = true\n"
" return 1");
verifyFormat("a = 's'\n"
"return 1",
"a = 's'\n"
" return 1");
verifyFormat("a = null\n"
"return 1",
"a = null\n"
" return 1");
}
TEST_F(FormatTestJS, ClosureStyleCasts) {