From dfafb4ac7fb0fd9387f1065f010d78a02b379888 Mon Sep 17 00:00:00 2001 From: Martin Probst Date: Tue, 19 Apr 2016 14:55:37 +0000 Subject: [PATCH] clang-format: [JS] simplify import/export. Summary: Change `import` and `export` parsing to special case the renaming syntax (`import x, {y as bar} ...`, `export {x}`) and otherwise just parse a regular structural element. This simplifies the code a bit and should be more correct - it's easier to recognise the specific import syntax than to recognise arbitrary expressions and declarations. Reviewers: djasper Subscribers: cfe-commits, klimek Differential Revision: http://reviews.llvm.org/D19242 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@266743 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/UnwrappedLineParser.cpp | 18 +++++++++--------- unittests/Format/FormatTestJS.cpp | 4 ++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 6cd74f91a8..91856a74c3 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -1880,7 +1880,8 @@ void UnwrappedLineParser::parseObjCProtocol() { } void UnwrappedLineParser::parseJavaScriptEs6ImportExport() { - assert(FormatTok->isOneOf(Keywords.kw_import, tok::kw_export)); + bool IsImport = FormatTok->is(Keywords.kw_import); + assert(IsImport || FormatTok->is(tok::kw_export)); nextToken(); // Consume the "default" in "export default class/function". @@ -1894,14 +1895,13 @@ void UnwrappedLineParser::parseJavaScriptEs6ImportExport() { return; } - // Consume the "abstract" in "export abstract class". - if (FormatTok->is(Keywords.kw_abstract)) - nextToken(); - - if (FormatTok->isOneOf(tok::kw_const, tok::kw_class, tok::kw_enum, - Keywords.kw_interface, Keywords.kw_let, - Keywords.kw_var)) - return; // Fall through to parsing the corresponding structure. + // For imports, `export *`, `export {...}`, consume the rest of the line up + // to the terminating `;`. For everything else, just return and continue + // parsing the structural element, i.e. the declaration or expression for + // `export default`. + if (!IsImport && !FormatTok->isOneOf(tok::l_brace, tok::star) && + !FormatTok->isStringLiteral()) + return; while (!eof() && FormatTok->isNot(tok::semi)) { if (FormatTok->is(tok::l_brace)) { diff --git a/unittests/Format/FormatTestJS.cpp b/unittests/Format/FormatTestJS.cpp index 5fa91e986a..a3cb6016d6 100644 --- a/unittests/Format/FormatTestJS.cpp +++ b/unittests/Format/FormatTestJS.cpp @@ -961,6 +961,10 @@ TEST_F(FormatTestJS, Modules) { verifyFormat("export function A() {}\n" "export default function B() {}\n" "export function C() {}"); + verifyFormat("export default () => {\n" + " let x = 1;\n" + " return x;\n" + "}"); verifyFormat("export const x = 12;"); verifyFormat("export default class X {}"); verifyFormat("export {X, Y} from 'some/module.js';"); -- 2.40.0