[clang] [clang-format] Improve BlockIndent at ColumnLimit (PR #93140)

Owen Pan via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 22 00:19:34 PDT 2024


================
@@ -803,6 +803,51 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
     return !Tok.Previous->isOneOf(TT_CastRParen, tok::kw_for, tok::kw_while,
                                   tok::kw_switch);
   };
+  auto IsLambdaParameterList = [](const FormatToken *Tok) {
+    // adapted from TokenAnnotator.cpp:isLambdaParameterList()
+    // Skip <...> if present.
+    if (Tok->Previous && Tok->Previous->is(tok::greater) &&
+        Tok->Previous->MatchingParen &&
+        Tok->Previous->MatchingParen->is(TT_TemplateOpener)) {
+      Tok = Tok->Previous->MatchingParen;
+    }
+
+    // Check for `[...]`.
+    return Tok->Previous && Tok->Previous->is(tok::r_square) &&
+           Tok->Previous->MatchingParen &&
+           Tok->Previous->MatchingParen->is(TT_LambdaLSquare);
+  };
+  auto IsFunctionCallParen = [&](const FormatToken &Tok) {
+    return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&
+           Tok.Previous->is(tok::identifier);
+  };
+  const auto IsInTemplateString = [&](const FormatToken &Tok) {
+    if (!Style.isJavaScript())
+      return false;
+    for (const FormatToken *Prev = &Tok; Prev; Prev = Prev->Previous) {
+      if (Prev->is(TT_TemplateString) && Prev->opensScope())
+        return true;
+      if (Prev->is(TT_TemplateString) && Prev->closesScope())
+        break;
+    }
+    return false;
+  };
+  // Identifies simple (no expression) one-argument function calls.
+  const auto IsNotSimpleFunction = [&](const FormatToken &Tok) {
+    const auto *Previous = Tok.Previous;
+    const auto *Next = Tok.Next;
+    if (Tok.FakeLParens.size() > 0 && Tok.FakeLParens.back() > prec::Unknown)
+      return true;
+    if (Previous &&
+        (Previous->is(TT_FunctionDeclarationLParen) ||
+         IsFunctionCallParen(*Previous) || IsLambdaParameterList(Previous))) {
+      return !IsOpeningBracket(Tok) && Next && !Next->isMemberAccess() &&
+             !IsInTemplateString(Tok) &&
+             !Next->is(TT_FunctionDeclarationLParen) &&
+             !IsFunctionCallParen(*Next);
+    }
+    return false;
+  };
----------------
owenca wrote:

I'd drop the `Not` and rewrite it as something like below:
```
   // Identifies simple (no expression) one-argument function calls.
-  const auto IsNotSimpleFunction = [&](const FormatToken &Tok) {
+  const auto IsSimpleFunctionCall = [&](const FormatToken &Tok) {
+    if (!Tok.FakeLParens.empty() && Tok.FakeLParens.back() > prec::Unknown)
+      return false;
     const auto *Previous = Tok.Previous;
-    const auto *Next = Tok.Next;
-    if (Tok.FakeLParens.size() > 0 && Tok.FakeLParens.back() > prec::Unknown)
+    if (!Previous || (!Previous->isOneOf(TT_FunctionDeclarationLParen,
+                                         TT_LambdaDefinitionLParen) &&
+                      !IsFunctionCallParen(*Previous))) {
       return true;
-    if (Previous &&
-        (Previous->is(TT_FunctionDeclarationLParen) ||
-         IsFunctionCallParen(*Previous) || IsLambdaParameterList(Previous))) {
-      return !IsOpeningBracket(Tok) && Next && !Next->isMemberAccess() &&
-             !IsInTemplateString(Tok) &&
-             !Next->is(TT_FunctionDeclarationLParen) &&
-             !IsFunctionCallParen(*Next);
     }
-    return false;
+    if (IsOpeningBracket(Tok) || IsInTemplateString(Tok))
+      return true;
+    const auto *Next = Tok.Next;
+    return !Next || Next->isMemberAccess() ||
+           Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next);
   };
```

https://github.com/llvm/llvm-project/pull/93140


More information about the cfe-commits mailing list