From: Daniel Jasper Date: Sun, 14 Jun 2015 07:16:57 +0000 (+0000) Subject: clang-format: [JS] Fix corner case in template string parsing. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2a755b2fd30d803bd49f827f5e222570707e0354;p=clang clang-format: [JS] Fix corner case in template string parsing. Before, these would not properly detected because of the char/string literal found when re-lexing after the first `: var x = `'`; // comment with matching quote ' var x = `"`; // comment with matching quote " git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239693 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index a774f8cdd5..aa91658491 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -785,7 +785,8 @@ private: // Backticks get lexed as tok::unknown tokens. If a template string contains // a comment start, it gets lexed as a tok::comment, or tok::unknown if // unterminated. - if (!EndBacktick->isOneOf(tok::comment, tok::unknown)) + if (!EndBacktick->isOneOf(tok::comment, tok::string_literal, + tok::char_constant, tok::unknown)) return false; size_t CommentBacktickPos = EndBacktick->TokenText.find('`'); // Unknown token that's not actually a backtick, or a comment that doesn't diff --git a/unittests/Format/FormatTestJS.cpp b/unittests/Format/FormatTestJS.cpp index 31386b448a..5b01832ef4 100644 --- a/unittests/Format/FormatTestJS.cpp +++ b/unittests/Format/FormatTestJS.cpp @@ -809,6 +809,11 @@ TEST_F(FormatTestJS, TemplateStrings) { "var y;", format("var x =\n `/*a`;\n" "var y;")); + // Unterminated string literals in a template string. + verifyFormat("var x = `'`; // comment with matching quote '\n" + "var y;"); + verifyFormat("var x = `\"`; // comment with matching quote \"\n" + "var y;"); // Backticks in a comment - not a template string. EXPECT_EQ("var x = 1 // `/*a`;\n" " ;",