[clang] [clang-format] Recognize Verilog followed-by operators (PR #165594)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 29 09:49:40 PDT 2025
https://github.com/sstwcw created https://github.com/llvm/llvm-project/pull/165594
When formatting Verilog code, the program changes the hash to `kw_verilogHash` and the backtick to `tok::hash`. The developer did not take that into account when writing the part for recognizing the `#-#` and `#=#` operators. The part did not work. The program would add a space within the operator.
after
```SystemVerilog
##[0 : 5] done #-# always !rst;
```
before
```SystemVerilog
##[0 : 5] done #- #always !rst;
```
>From 8d6f6905e1d28ced6a89b63f65f6cb4e0aa07e2e Mon Sep 17 00:00:00 2001
From: sstwcw <su3e8a96kzlver at posteo.net>
Date: Wed, 29 Oct 2025 16:38:24 +0000
Subject: [PATCH] [clang-format] Recognize Verilog followed-by operators
When formatting Verilog code, the program changes the hash to
`kw_verilogHash` and the backtick to `tok::hash`. The developer did not
take that into account when writing the part for recognizing the `#-#`
and `#=#` operators. The part did not work. The program would add a
space within the operator.
after
```SystemVerilog
##[0 : 5] done #-# always !rst;
```
before
```SystemVerilog
##[0 : 5] done #- #always !rst;
```
---
clang/lib/Format/FormatTokenLexer.cpp | 13 ++++++++++---
clang/unittests/Format/TokenAnnotatorTest.cpp | 1 +
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp
index ab3293841a2a4..a9ea5ec9009c4 100644
--- a/clang/lib/Format/FormatTokenLexer.cpp
+++ b/clang/lib/Format/FormatTokenLexer.cpp
@@ -318,14 +318,21 @@ void FormatTokenLexer::tryMergePreviousTokens() {
{tok::equal, tok::greater},
{tok::star, tok::greater},
{tok::pipeequal, tok::greater},
- {tok::pipe, tok::arrow},
- {tok::hash, tok::minus, tok::hash},
- {tok::hash, tok::equal, tok::hash}},
+ {tok::pipe, tok::arrow}},
TT_BinaryOperator) ||
Tokens.back()->is(tok::arrow)) {
Tokens.back()->ForcedPrecedence = prec::Comma;
return;
}
+ if (Tokens.size() >= 3 &&
+ Tokens[Tokens.size() - 3]->is(Keywords.kw_verilogHash) &&
+ Tokens[Tokens.size() - 2]->isOneOf(tok::minus, tok::equal) &&
+ Tokens[Tokens.size() - 1]->is(Keywords.kw_verilogHash) &&
+ tryMergeTokens(3, TT_BinaryOperator)) {
+ Tokens.back()->setFinalizedType(TT_BinaryOperator);
+ Tokens.back()->ForcedPrecedence = prec::Comma;
+ return;
+ }
} else if (Style.isTableGen()) {
// TableGen's Multi line string starts with [{
if (tryMergeTokens({tok::l_square, tok::l_brace},
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index c046142c613b0..6c05feaeb13e0 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -2686,6 +2686,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
// precedence.
std::pair<prec::Level, std::string> JoinedBinary[] = {
{prec::Comma, "->"}, {prec::Comma, "<->"},
+ {prec::Comma, "#-#"}, {prec::Comma, "#=#"},
{prec::Assignment, "+="}, {prec::Assignment, "-="},
{prec::Assignment, "*="}, {prec::Assignment, "/="},
{prec::Assignment, "%="}, {prec::Assignment, "&="},
More information about the cfe-commits
mailing list