[clang] [clang-format] Break the line within `@selector` (PR #164674)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 22 10:51:17 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-format
Author: None (sstwcw)
<details>
<summary>Changes</summary>
after, with style `{ColumnLimit: 60}`
```Objective-C
[objectName
respondsToSelector:
@<!-- -->selector(
somelonglonglonglongnameeeeeeee:
loooooooooanotherlonglonglonglongnametopush:
otherlongnameforlimit:)];
```
before
```Objective-C
[objectName
respondsToSelector:
@<!-- -->selector(
somelonglonglonglongnameeeeeeee:loooooooooanotherlonglonglonglongnametopush:otherlongnameforlimit:)];
```
Fixes #<!-- -->164574.
The stuff inside the parentheses got a new type in 2a059042882ed. I neglected to add it to the logic for breaking lines.
---
Full diff: https://github.com/llvm/llvm-project/pull/164674.diff
2 Files Affected:
- (modified) clang/lib/Format/TokenAnnotator.cpp (+9-3)
- (modified) clang/unittests/Format/FormatTestObjC.cpp (+6)
``````````diff
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index c97a9e81eb59e..1d0dfd0b9c151 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -4407,8 +4407,12 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
// breaking after it.
if (Right.is(TT_SelectorName))
return 0;
- if (Left.is(tok::colon) && Left.is(TT_ObjCMethodExpr))
- return Line.MightBeFunctionDecl ? 50 : 500;
+ if (Left.is(tok::colon)) {
+ if (Left.is(TT_ObjCMethodExpr))
+ return Line.MightBeFunctionDecl ? 50 : 500;
+ if (Left.is(TT_ObjCSelector))
+ return 500;
+ }
// In Objective-C type declarations, avoid breaking after the category's
// open paren (we'll prefer breaking after the protocol list's opening
@@ -6291,7 +6295,9 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
TT_BitFieldColon)) {
return false;
}
- if (Left.is(tok::colon) && Left.isOneOf(TT_DictLiteral, TT_ObjCMethodExpr)) {
+ if (Left.is(tok::colon) && Left.isOneOf(TT_ObjCSelector, TT_ObjCMethodExpr))
+ return true;
+ if (Left.is(tok::colon) && Left.is(TT_DictLiteral)) {
if (Style.isProto()) {
if (!Style.AlwaysBreakBeforeMultilineStrings && Right.isStringLiteral())
return false;
diff --git a/clang/unittests/Format/FormatTestObjC.cpp b/clang/unittests/Format/FormatTestObjC.cpp
index 700d7cf8efca6..cf8143ace7b45 100644
--- a/clang/unittests/Format/FormatTestObjC.cpp
+++ b/clang/unittests/Format/FormatTestObjC.cpp
@@ -949,6 +949,12 @@ TEST_F(FormatTestObjC, FormatObjCMethodExpr) {
"[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
" aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
" aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
+ verifyFormat("[objectName\n"
+ " respondsToSelector:\n"
+ " @selector(\n"
+ " somelonglonglonglongnameeeeeeee:\n"
+ " loooooooooanotherlonglonglonglongnametopush:\n"
+ " otherlongnameforlimit:)];");
Style = getChromiumStyle(FormatStyle::LK_ObjC);
Style.ColumnLimit = 80;
``````````
</details>
https://github.com/llvm/llvm-project/pull/164674
More information about the cfe-commits
mailing list