1 //===--- UnusedAliasDeclsCheck.cpp - clang-tidy----------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "UnusedAliasDeclsCheck.h"
10 #include "clang/AST/ASTContext.h"
11 #include "clang/ASTMatchers/ASTMatchFinder.h"
12 #include "clang/Lex/Lexer.h"
14 using namespace clang::ast_matchers
;
16 namespace clang::tidy::misc
{
18 void UnusedAliasDeclsCheck::registerMatchers(MatchFinder
*Finder
) {
19 // We cannot do anything about headers (yet), as the alias declarations
20 // used in one header could be used by some other translation unit.
21 Finder
->addMatcher(namespaceAliasDecl(isExpansionInMainFile()).bind("alias"),
23 Finder
->addMatcher(nestedNameSpecifier().bind("nns"), this);
26 void UnusedAliasDeclsCheck::check(const MatchFinder::MatchResult
&Result
) {
27 if (const auto *AliasDecl
= Result
.Nodes
.getNodeAs
<NamedDecl
>("alias")) {
28 FoundDecls
[AliasDecl
] = CharSourceRange::getCharRange(
29 AliasDecl
->getBeginLoc(),
30 Lexer::findLocationAfterToken(
31 AliasDecl
->getEndLoc(), tok::semi
, *Result
.SourceManager
,
33 /*SkipTrailingWhitespaceAndNewLine=*/true));
37 if (const auto *NestedName
=
38 Result
.Nodes
.getNodeAs
<NestedNameSpecifier
>("nns")) {
39 if (const auto *AliasDecl
= NestedName
->getAsNamespaceAlias()) {
40 FoundDecls
[AliasDecl
] = CharSourceRange();
45 void UnusedAliasDeclsCheck::onEndOfTranslationUnit() {
46 for (const auto &FoundDecl
: FoundDecls
) {
47 if (!FoundDecl
.second
.isValid())
49 diag(FoundDecl
.first
->getLocation(), "namespace alias decl %0 is unused")
50 << FoundDecl
.first
<< FixItHint::CreateRemoval(FoundDecl
.second
);
54 } // namespace clang::tidy::misc