From: Martin Probst Date: Fri, 2 Sep 2016 14:06:32 +0000 (+0000) Subject: clang-format: [JS] handle default bindings in imports. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=546274f58d993b8ccb3fb438f446f1bd003abaa9;p=clang clang-format: [JS] handle default bindings in imports. Summary: Default imports appear outside of named bindings in curly braces: import A from 'a'; import A, {symbol} from 'a'; Reviewers: djasper Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D23973 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280486 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/SortJavaScriptImports.cpp b/lib/Format/SortJavaScriptImports.cpp index 72da52bf16..2a90e9ab76 100644 --- a/lib/Format/SortJavaScriptImports.cpp +++ b/lib/Format/SortJavaScriptImports.cpp @@ -346,7 +346,6 @@ private: if (!parseModuleBindings(Keywords, Reference)) return false; - nextToken(); if (Current->is(Keywords.kw_from)) { // imports have a 'from' clause, exports might not. @@ -389,19 +388,28 @@ private: if (Current->isNot(tok::identifier)) return false; Reference.Prefix = Current->TokenText; + nextToken(); return true; } bool parseNamedBindings(const AdditionalKeywords &Keywords, JsModuleReference &Reference) { + if (Current->is(tok::identifier)) { + nextToken(); + if (Current->is(Keywords.kw_from)) + return true; + if (Current->isNot(tok::comma)) + return false; + nextToken(); // eat comma. + } if (Current->isNot(tok::l_brace)) return false; // {sym as alias, sym2 as ...} from '...'; - nextToken(); - while (true) { + while (Current->isNot(tok::r_brace)) { + nextToken(); if (Current->is(tok::r_brace)) - return true; + break; if (Current->isNot(tok::identifier)) return false; @@ -422,12 +430,11 @@ private: Symbol.Range.setEnd(Current->Tok.getLocation()); Reference.Symbols.push_back(Symbol); - if (Current->is(tok::r_brace)) - return true; - if (Current->isNot(tok::comma)) + if (!Current->isOneOf(tok::r_brace, tok::comma)) return false; - nextToken(); } + nextToken(); // consume r_brace + return true; } }; diff --git a/unittests/Format/SortImportsTestJS.cpp b/unittests/Format/SortImportsTestJS.cpp index e43844c49c..2bb35a2de0 100644 --- a/unittests/Format/SortImportsTestJS.cpp +++ b/unittests/Format/SortImportsTestJS.cpp @@ -70,6 +70,26 @@ TEST_F(SortImportsTestJS, BasicSorting) { "let x = 1;"); } +TEST_F(SortImportsTestJS, DefaultBinding) { + verifySort("import A from 'a';\n" + "import B from 'b';\n" + "\n" + "let x = 1;", + "import B from 'b';\n" + "import A from 'a';\n" + "let x = 1;"); +} + +TEST_F(SortImportsTestJS, DefaultAndNamedBinding) { + verifySort("import A, {a} from 'a';\n" + "import B, {b} from 'b';\n" + "\n" + "let x = 1;", + "import B, {b} from 'b';\n" + "import A, {a} from 'a';\n" + "let x = 1;"); +} + TEST_F(SortImportsTestJS, WrappedImportStatements) { verifySort("import {sym1, sym2} from 'a';\n" "import {sym} from 'b';\n"