Skip to content

Commit

Permalink
clang-format: [JS] support interface as a free standing identifier.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
mprobst committed Apr 19, 2016
1 parent 461f2ff commit 1e8261e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
15 changes: 15 additions & 0 deletions clang/lib/Format/UnwrappedLineParser.cpp
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions clang/unittests/Format/FormatTestJS.cpp
Expand Up @@ -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) {
Expand Down

0 comments on commit 1e8261e

Please sign in to comment.