mprobst created this revision. mprobst added reviewers: krasimir, h-joo. mprobst requested review of this revision. Herald added a project: clang.
`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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D100953 Files: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTestJS.cpp Index: clang/unittests/Format/FormatTestJS.cpp =================================================================== --- clang/unittests/Format/FormatTestJS.cpp +++ clang/unittests/Format/FormatTestJS.cpp @@ -2589,5 +2589,20 @@ "}\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 Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -3853,6 +3853,9 @@ 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))
Index: clang/unittests/Format/FormatTestJS.cpp =================================================================== --- clang/unittests/Format/FormatTestJS.cpp +++ clang/unittests/Format/FormatTestJS.cpp @@ -2589,5 +2589,20 @@ "}\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 Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -3853,6 +3853,9 @@ 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))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits