clang-format: [JS] support `interface` as a free standing identifier.

Summary:
`interface` can be used as a fee standing identifier in JavaScript/TypeScript.
This change uses the heuristic of whether it's followed by another identifier
as an indication.

Reviewers: djasper

Subscribers: klimek, cfe-commits

Differential Revision: http://reviews.llvm.org/D19240

llvm-svn: 266789
This commit is contained in:
Martin Probst 2016-04-19 18:18:59 +00:00
parent 461f2ff445
commit 1e8261ea04
2 changed files with 18 additions and 0 deletions

View File

@ -1007,6 +1007,21 @@ void UnwrappedLineParser::parseStructuralElement() {
if ((Style.Language == FormatStyle::LK_JavaScript ||
Style.Language == FormatStyle::LK_Java) &&
FormatTok->is(Keywords.kw_interface)) {
if (Style.Language == FormatStyle::LK_JavaScript) {
// In JavaScript/TypeScript, "interface" can be used as a standalone
// identifier, e.g. in `var interface = 1;`. If "interface" is
// followed by another identifier, it is very like to be an actual
// interface declaration.
unsigned StoredPosition = Tokens->getPosition();
FormatToken *Next = Tokens->getNextToken();
FormatTok = Tokens->setPosition(StoredPosition);
if (Next && (Next->isNot(tok::identifier) ||
Next->isOneOf(Keywords.kw_instanceof, Keywords.kw_of,
Keywords.kw_in))) {
nextToken();
break;
}
}
parseRecord();
addUnwrappedLine();
return;

View File

@ -136,6 +136,9 @@ TEST_F(FormatTestJS, ReservedWords) {
"};");
verifyFormat("var struct = 2;");
verifyFormat("var union = 2;");
verifyFormat("var interface = 2;");
verifyFormat("interface = 2;");
verifyFormat("x = interface instanceof y;");
}
TEST_F(FormatTestJS, CppKeywords) {