Skip to content

Commit 91bf1b6

Browse files
committed
Move logic into matcher
1 parent 909d2bb commit 91bf1b6

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "clang/AST/Stmt.h"
1313
#include "clang/ASTMatchers/ASTMatchFinder.h"
1414
#include "clang/ASTMatchers/ASTMatchers.h"
15+
#include "clang/ASTMatchers/ASTMatchersMacros.h"
1516
#include <algorithm>
1617
#include <iterator>
1718
#include <vector>
@@ -40,24 +41,32 @@ UseDesignatedInitializersCheck::UseDesignatedInitializersCheck(
4041
Options.get(IgnoreSingleElementAggregatesName,
4142
IgnoreSingleElementAggregatesDefault)) {}
4243

44+
AST_MATCHER(CXXRecordDecl, isAggregate) { return Node.isAggregate(); }
45+
46+
AST_MATCHER(InitListExpr, isFullyDesignated) {
47+
return getUndesignatedComponents(&Node).empty();
48+
}
49+
50+
AST_MATCHER(InitListExpr, hasSingleElement) { return Node.getNumInits() == 1; }
4351
void UseDesignatedInitializersCheck::registerMatchers(MatchFinder *Finder) {
4452
Finder->addMatcher(
45-
initListExpr(hasType(recordDecl().bind("type"))).bind("init"), this);
53+
initListExpr(hasType(cxxRecordDecl(isAggregate()).bind("type")),
54+
unless(IgnoreSingleElementAggregates ? hasSingleElement()
55+
: unless(anything())),
56+
unless(isFullyDesignated()))
57+
.bind("init"),
58+
this);
4659
}
4760

4861
void UseDesignatedInitializersCheck::check(
4962
const MatchFinder::MatchResult &Result) {
5063
const auto *InitList = Result.Nodes.getNodeAs<InitListExpr>("init");
5164
const auto *Type = Result.Nodes.getNodeAs<CXXRecordDecl>("type");
52-
if (!Type || !InitList || !Type->isAggregate())
53-
return;
54-
if (IgnoreSingleElementAggregates && InitList->getNumInits() == 1)
65+
if (!Type || !InitList)
5566
return;
5667
if (const auto *SyntacticInitList = InitList->getSyntacticForm()) {
5768
const auto UndesignatedComponents =
5869
getUndesignatedComponents(SyntacticInitList);
59-
if (UndesignatedComponents.empty())
60-
return;
6170
if (UndesignatedComponents.size() == SyntacticInitList->getNumInits()) {
6271
diag(InitList->getLBraceLoc(), "use designated initializer list");
6372
return;

0 commit comments

Comments
 (0)