diff --git a/clang/lib/Format/BreakableToken.cpp b/clang/lib/Format/BreakableToken.cpp --- a/clang/lib/Format/BreakableToken.cpp +++ b/clang/lib/Format/BreakableToken.cpp @@ -86,6 +86,18 @@ MaxSplitBytes += BytesInChar; } + // In JavaScript, some @tags can be followed by {, and machinery that parses + // these comments will fail to understand the comment if followed by a line + // break. So avoid ever breaking before a {. + if (Style.Language == FormatStyle::LK_JavaScript) { + StringRef::size_type SpaceOffset = + Text.find_first_of(Blanks, MaxSplitBytes); + if (SpaceOffset != StringRef::npos && SpaceOffset + 1 < Text.size() && + Text[SpaceOffset + 1] == '{') { + MaxSplitBytes = SpaceOffset + 1; + } + } + StringRef::size_type SpaceOffset = Text.find_last_of(Blanks, MaxSplitBytes); static const auto kNumberedListRegexp = llvm::Regex("^[1-9][0-9]?\\."); @@ -94,9 +106,7 @@ // as a numbered list, which would prevent re-flowing in subsequent passes. if (kNumberedListRegexp.match(Text.substr(SpaceOffset).ltrim(Blanks))) SpaceOffset = Text.find_last_of(Blanks, SpaceOffset); - // In JavaScript, some @tags can be followed by {, and machinery that parses - // these comments will fail to understand the comment if followed by a line - // break. So avoid ever breaking before a {. + // Avoid ever breaking before a { in JavaScript. else if (Style.Language == FormatStyle::LK_JavaScript && SpaceOffset + 1 < Text.size() && Text[SpaceOffset + 1] == '{') SpaceOffset = Text.find_last_of(Blanks, SpaceOffset); diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -2184,6 +2184,16 @@ " * @lala {lala {lalala\n" " */\n", getGoogleJSStyleWithColumns(20)); + // cases where '{' is around the column limit + for (int ColumnLimit = 6; ColumnLimit < 13; ++ColumnLimit) { + verifyFormat("/**\n" + " * @param {type}\n" + " */", + "/**\n" + " * @param {type}\n" + " */", + getGoogleJSStyleWithColumns(ColumnLimit)); + } verifyFormat("/**\n" " * @see http://very/very/long/url/is/long\n" " */",