aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsstwcw <su3e8a96kzlver@posteo.net>2023-11-29 15:17:59 +0000
committerGitHub <noreply@github.com>2023-11-29 15:17:59 +0000
commit3af82b3962c443d43edba1abb50a82fb3048999a (patch)
treef6096f8bce9bdae021df85e5651cfa184d9b04cd
parent0468867c982c9438cf1e9adb71709cb9c7d66391 (diff)
downloadllvm-3af82b3962c443d43edba1abb50a82fb3048999a.zip
llvm-3af82b3962c443d43edba1abb50a82fb3048999a.tar.gz
llvm-3af82b3962c443d43edba1abb50a82fb3048999a.tar.bz2
[clang-format] Add spaces around the Verilog implication operator (#71352)
The Verilog implication operator `->` is a binary operator meaning either the left hand side is false or the right hand side is true. Previously it was treated as the C++ struct member operator. I didn't even know it existed when I added the operator formatting part. And I didn't check all the tests for all the operators I added. That is how the bad test got in.
-rw-r--r--clang/lib/Format/FormatTokenLexer.cpp6
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp6
-rw-r--r--clang/unittests/Format/FormatTestVerilog.cpp2
-rw-r--r--clang/unittests/Format/TokenAnnotatorTest.cpp23
4 files changed, 23 insertions, 14 deletions
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp
index a90ba4a..db52add 100644
--- a/clang/lib/Format/FormatTokenLexer.cpp
+++ b/clang/lib/Format/FormatTokenLexer.cpp
@@ -253,7 +253,8 @@ void FormatTokenLexer::tryMergePreviousTokens() {
TT_BinaryOperator)) {
return;
}
- // Module paths in specify blocks and implications in properties.
+ // Module paths in specify blocks and the implication and boolean equality
+ // operators.
if (tryMergeTokensAny({{tok::plusequal, tok::greater},
{tok::plus, tok::star, tok::greater},
{tok::minusequal, tok::greater},
@@ -265,7 +266,8 @@ void FormatTokenLexer::tryMergePreviousTokens() {
{tok::pipe, tok::arrow},
{tok::hash, tok::minus, tok::hash},
{tok::hash, tok::equal, tok::hash}},
- TT_BinaryOperator)) {
+ TT_BinaryOperator) ||
+ Tokens.back()->is(tok::arrow)) {
Tokens.back()->ForcedPrecedence = prec::Comma;
return;
}
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 4a684e2..bffb59f 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -2028,6 +2028,9 @@ private:
} else if (Current.is(tok::arrow) &&
Style.Language == FormatStyle::LK_Java) {
Current.setType(TT_TrailingReturnArrow);
+ } else if (Current.is(tok::arrow) && Style.isVerilog()) {
+ // The implication operator.
+ Current.setType(TT_BinaryOperator);
} else if (Current.is(tok::arrow) && AutoFound &&
Line.MightBeFunctionDecl && Current.NestingLevel == 0 &&
!Current.Previous->isOneOf(tok::kw_operator, tok::identifier)) {
@@ -4717,6 +4720,9 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
(Left.is(TT_VerilogNumberBase) && Right.is(tok::numeric_constant))) {
return false;
}
+ // Add spaces around the implication operator `->`.
+ if (Left.is(tok::arrow) || Right.is(tok::arrow))
+ return true;
// Don't add spaces between two at signs. Like in a coverage event.
// Don't add spaces between at and a sensitivity list like
// `@(posedge clk)`.
diff --git a/clang/unittests/Format/FormatTestVerilog.cpp b/clang/unittests/Format/FormatTestVerilog.cpp
index 1c26924..6650cae 100644
--- a/clang/unittests/Format/FormatTestVerilog.cpp
+++ b/clang/unittests/Format/FormatTestVerilog.cpp
@@ -1005,7 +1005,7 @@ TEST_F(FormatTestVerilog, Operators) {
verifyFormat("x = x ^~ x;");
verifyFormat("x = x && x;");
verifyFormat("x = x || x;");
- verifyFormat("x = x->x;");
+ verifyFormat("x = x -> x;");
verifyFormat("x = x <-> x;");
verifyFormat("x += x;");
verifyFormat("x -= x;");
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 7b3b619..bc73457 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -1980,17 +1980,18 @@ TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
// joined operators, we don't have a separate type, so we only test for their
// precedence.
std::pair<prec::Level, std::string> JoinedBinary[] = {
- {prec::Comma, "<->"}, {prec::Assignment, "+="},
- {prec::Assignment, "-="}, {prec::Assignment, "*="},
- {prec::Assignment, "/="}, {prec::Assignment, "%="},
- {prec::Assignment, "&="}, {prec::Assignment, "^="},
- {prec::Assignment, "<<="}, {prec::Assignment, ">>="},
- {prec::Assignment, "<<<="}, {prec::Assignment, ">>>="},
- {prec::LogicalOr, "||"}, {prec::LogicalAnd, "&&"},
- {prec::Equality, "=="}, {prec::Equality, "!="},
- {prec::Equality, "==="}, {prec::Equality, "!=="},
- {prec::Equality, "==?"}, {prec::Equality, "!=?"},
- {prec::ExclusiveOr, "~^"}, {prec::ExclusiveOr, "^~"},
+ {prec::Comma, "->"}, {prec::Comma, "<->"},
+ {prec::Assignment, "+="}, {prec::Assignment, "-="},
+ {prec::Assignment, "*="}, {prec::Assignment, "/="},
+ {prec::Assignment, "%="}, {prec::Assignment, "&="},
+ {prec::Assignment, "^="}, {prec::Assignment, "<<="},
+ {prec::Assignment, ">>="}, {prec::Assignment, "<<<="},
+ {prec::Assignment, ">>>="}, {prec::LogicalOr, "||"},
+ {prec::LogicalAnd, "&&"}, {prec::Equality, "=="},
+ {prec::Equality, "!="}, {prec::Equality, "==="},
+ {prec::Equality, "!=="}, {prec::Equality, "==?"},
+ {prec::Equality, "!=?"}, {prec::ExclusiveOr, "~^"},
+ {prec::ExclusiveOr, "^~"},
};
for (auto Operator : JoinedBinary) {
auto Tokens = Annotate(std::string("x = x ") + Operator.second + " x;");