clang-format: [JS] Correctly format JavaScript imports with long module paths

Currently the `UnwrappedLineParser` fails to correctly unwrap JavaScript
imports where the module path is not on the same line as the `from` keyword.
For example:

    import {A} from
    'some/path/longer/than/column/limit/module.js';```

This causes issues when in the middle a list of imports because the formatter
thinks it has reached the end of the imports, and therefore will not sort any
imports lower in the list.

The formatter will, however, split the `from` keyword and the module path if
the path exceeds the column limit, which triggers the issue the next time the
file is formatted.

Patch originally by Jared Neil - thanks!

Differential Revision: https://reviews.llvm.org/D34920

llvm-svn: 308306
This commit is contained in:
Martin Probst 2017-07-18 14:00:19 +00:00
parent 393ef84cb6
commit 93008f0154
3 changed files with 29 additions and 1 deletions

View File

@ -747,7 +747,7 @@ static bool mustBeJSIdent(const AdditionalKeywords &Keywords,
Keywords.kw_let, Keywords.kw_var, tok::kw_const, Keywords.kw_let, Keywords.kw_var, tok::kw_const,
Keywords.kw_abstract, Keywords.kw_extends, Keywords.kw_implements, Keywords.kw_abstract, Keywords.kw_extends, Keywords.kw_implements,
Keywords.kw_instanceof, Keywords.kw_interface, Keywords.kw_instanceof, Keywords.kw_interface,
Keywords.kw_throws)); Keywords.kw_throws, Keywords.kw_from));
} }
static bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords, static bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords,

View File

@ -1464,6 +1464,17 @@ TEST_F(FormatTestJS, ImportWrapping) {
" A,\n" " A,\n"
"} from 'some/module.js';", "} from 'some/module.js';",
Style); Style);
Style.ColumnLimit = 40;
// Using this version of verifyFormat because test::messUp hides the issue.
verifyFormat("import {\n"
" A,\n"
"} from\n"
" 'some/path/longer/than/column/limit/module.js';",
" import { \n"
" A, \n"
" } from\n"
" 'some/path/longer/than/column/limit/module.js' ; ",
Style);
} }
TEST_F(FormatTestJS, TemplateStrings) { TEST_F(FormatTestJS, TemplateStrings) {

View File

@ -283,6 +283,23 @@ TEST_F(SortImportsTestJS, SortCaseInsensitive) {
"1;"); "1;");
} }
TEST_F(SortImportsTestJS, SortMultiLine) {
// Reproduces issue where multi-line import was not parsed correctly.
verifySort("import {A} from 'a';\n"
"import {A} from 'b';\n"
"\n"
"1;",
"import\n"
"{\n"
"A\n"
"}\n"
"from\n"
"'b';\n"
"import {A} from 'a';\n"
"\n"
"1;");
}
} // end namespace } // end namespace
} // end namespace format } // end namespace format
} // end namespace clang } // end namespace clang