diff --git a/clang/lib/Format/SortJavaScriptImports.cpp b/clang/lib/Format/SortJavaScriptImports.cpp --- a/clang/lib/Format/SortJavaScriptImports.cpp +++ b/clang/lib/Format/SortJavaScriptImports.cpp @@ -548,10 +548,12 @@ nextToken(); if (Current->is(tok::r_brace)) break; - bool isTypeOnly = - Current->is(Keywords.kw_type) && Current->Next && - Current->Next->isOneOf(tok::identifier, tok::kw_default); - if (!isTypeOnly && !Current->isOneOf(tok::identifier, tok::kw_default)) + auto IsIdentifier = [](const auto *Tok) { + return Tok->isOneOf(tok::identifier, tok::kw_default, tok::kw_template); + }; + bool isTypeOnly = Current->is(Keywords.kw_type) && Current->Next && + IsIdentifier(Current->Next); + if (!isTypeOnly && !IsIdentifier(Current)) return false; JsImportedSymbol Symbol; @@ -565,7 +567,7 @@ if (Current->is(Keywords.kw_as)) { nextToken(); - if (!Current->isOneOf(tok::identifier, tok::kw_default)) + if (!IsIdentifier(Current)) return false; Symbol.Alias = Current->TokenText; nextToken(); diff --git a/clang/unittests/Format/SortImportsTestJS.cpp b/clang/unittests/Format/SortImportsTestJS.cpp --- a/clang/unittests/Format/SortImportsTestJS.cpp +++ b/clang/unittests/Format/SortImportsTestJS.cpp @@ -514,6 +514,14 @@ "export {Y};\n"); } +TEST_F(SortImportsTestJS, TemplateKeyword) { + // Reproduces issue where importing "template" disables imports sorting. + verifySort("import {template} from './a';\n" + "import {b} from './b';\n", + "import {b} from './b';\n" + "import {template} from './a';"); +} + } // end namespace } // end namespace format } // end namespace clang