Author: Martin Probst Date: 2021-04-21T16:33:55+02:00 New Revision: 70ae843d99808b19247e968507c0019225597066
URL: https://github.com/llvm/llvm-project/commit/70ae843d99808b19247e968507c0019225597066 DIFF: https://github.com/llvm/llvm-project/commit/70ae843d99808b19247e968507c0019225597066.diff LOG: clang-format: [JS] do not wrap after `asserts` `asserts` is a pseudo keyword in TypeScript used in return types. Wrapping after it triggers automatic semicolon insertion, which breaks the code semantics/syntax. `asserts` is different from other pseudo keywords in that it is specific to TS and only carries meaning in a very specific location. Thus introducing a token type is probably overkill. Differential Revision: https://reviews.llvm.org/D100953 Added: Modified: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTestJS.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index e42f28ed55cd..fd0116714d9f 100755 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -3853,6 +3853,9 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, Left.isOneOf(tok::r_square, tok::r_paren)) && Right.isOneOf(tok::l_square, tok::l_paren)) return false; // Otherwise automatic semicolon insertion would trigger. + if (NonComment && NonComment->is(tok::identifier) && + NonComment->TokenText == "asserts") + return false; if (Left.is(TT_JsFatArrow) && Right.is(tok::l_brace)) return false; if (Left.is(TT_JsTypeColon)) diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index 91a98bf64c5c..c92c81f66a87 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -2589,5 +2589,20 @@ TEST_F(FormatTestJS, DeclaredFields) { "}\n"); } +TEST_F(FormatTestJS, NoBreakAfterAsserts) { + verifyFormat( + "interface Assertable<State extends {}> {\n" + " assert<ExportedState extends {}, DependencyState extends State = " + "State>(\n" + " callback: Callback<ExportedState, DependencyState>):\n" + " asserts this is ExtendedState<DependencyState&ExportedState>;\n" + "}\n", + "interface Assertable<State extends {}> {\n" + " assert<ExportedState extends {}, DependencyState extends State = " + "State>(callback: Callback<ExportedState, DependencyState>): asserts " + "this is ExtendedState<DependencyState&ExportedState>;\n" + "}\n"); +} + } // namespace format } // end namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits