From: Martin Probst Date: Tue, 19 Mar 2019 11:15:52 +0000 (+0000) Subject: [clang-format] [JS] Don't break between template string and tag X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e40a5a512cae6848aa78ddf8194f1ef1fa0798e2;p=clang [clang-format] [JS] Don't break between template string and tag Before: const x = veryLongIdentifier `hello`; After: const x = veryLongIdentifier`hello`; While it's allowed to have the template string and tag identifier separated by a line break, currently the clang-format output is not stable when a break is forced. Additionally, disallowing a line break makes it clear that the identifier is actually a tag for a template string. Patch originally by mitchellwills (thanks!). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@356447 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 246ac781fd..ef449e44c9 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -3171,6 +3171,11 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, return false; // must not break in "module foo { ...}" if (Right.is(TT_TemplateString) && Right.closesScope()) return false; + // Don't split tagged template literal so there is a break between the tag + // identifier and template string. + if (Left.is(tok::identifier) && Right.is(TT_TemplateString)) { + return false; + } if (Left.is(TT_TemplateString) && Left.opensScope()) return true; } diff --git a/unittests/Format/FormatTestJS.cpp b/unittests/Format/FormatTestJS.cpp index ed8faabb3f..528e4cf57c 100644 --- a/unittests/Format/FormatTestJS.cpp +++ b/unittests/Format/FormatTestJS.cpp @@ -1962,6 +1962,12 @@ TEST_F(FormatTestJS, NestedTemplateStrings) { TEST_F(FormatTestJS, TaggedTemplateStrings) { verifyFormat("var x = html`