clang-format: [JS] Support pseudo-keywords

JavaScript allows keywords to appear in IdenfierName positions, e.g.
fields, or object literal members, but not as plain identifiers.

Patch by Martin Probst. Thank you!

llvm-svn: 248714
This commit is contained in:
Daniel Jasper 2015-09-28 14:29:45 +00:00
parent 9f642f7d7a
commit ba52fcb7d5
3 changed files with 19 additions and 1 deletions

View File

@ -374,7 +374,7 @@ private:
FormatToken *Previous = CurrentToken->getPreviousNonComment();
if ((CurrentToken->is(tok::colon) ||
Style.Language == FormatStyle::LK_Proto) &&
Previous->is(tok::identifier))
Previous->Tok.getIdentifierInfo())
Previous->Type = TT_SelectorName;
if (CurrentToken->is(tok::colon) ||
Style.Language == FormatStyle::LK_JavaScript)

View File

@ -844,6 +844,11 @@ void UnwrappedLineParser::parseStructuralElement() {
if (Style.Language == FormatStyle::LK_Java && FormatTok &&
FormatTok->is(tok::kw_class))
nextToken();
if (Style.Language == FormatStyle::LK_JavaScript && FormatTok &&
FormatTok->Tok.getIdentifierInfo())
// JavaScript only has pseudo keywords, all keywords are allowed to
// appear in "IdentifierName" positions. See http://es5.github.io/#x7.6
nextToken();
break;
case tok::semi:
nextToken();

View File

@ -99,6 +99,19 @@ TEST_F(FormatTestJS, LiteralOperatorsCanBeKeywords) {
verifyFormat("not.and.or.not_eq = 1;");
}
TEST_F(FormatTestJS, ReservedWords) {
// JavaScript reserved words (aka keywords) are only illegal when used as
// Identifiers, but are legal as IdentifierNames.
verifyFormat("x.class.struct = 1;");
verifyFormat("x.case = 1;");
verifyFormat("x.interface = 1;");
verifyFormat("x = {\n"
" a: 12,\n"
" interface: 1,\n"
" switch: 1,\n"
"};");
}
TEST_F(FormatTestJS, ES6DestructuringAssignment) {
verifyFormat("var [a, b, c] = [1, 2, 3];");
verifyFormat("let [a, b, c] = [1, 2, 3];");