[clang-tools-extra] 019f525 - [clang-tidy] add fixhint for misc-use-internal-linkage (#96203)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 26 07:30:18 PDT 2024
Author: Congcong Cai
Date: 2024-06-26T22:30:15+08:00
New Revision: 019f525716348578802b02961c328b43f7cad0fb
URL: https://github.com/llvm/llvm-project/commit/019f525716348578802b02961c328b43f7cad0fb
DIFF: https://github.com/llvm/llvm-project/commit/019f525716348578802b02961c328b43f7cad0fb.diff
LOG: [clang-tidy] add fixhint for misc-use-internal-linkage (#96203)
Added:
clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-fix-mode-none.cpp
Modified:
clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.h
clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-var.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
index 70d0281df28fa..44ccc2bc906a5 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
@@ -18,6 +18,26 @@
using namespace clang::ast_matchers;
+namespace clang::tidy {
+
+template <>
+struct OptionEnumMapping<misc::UseInternalLinkageCheck::FixModeKind> {
+ static llvm::ArrayRef<
+ std::pair<misc::UseInternalLinkageCheck::FixModeKind, StringRef>>
+ getEnumMapping() {
+ static constexpr std::pair<misc::UseInternalLinkageCheck::FixModeKind,
+ StringRef>
+ Mapping[] = {
+ {misc::UseInternalLinkageCheck::FixModeKind::None, "None"},
+ {misc::UseInternalLinkageCheck::FixModeKind::UseStatic,
+ "UseStatic"},
+ };
+ return {Mapping};
+ }
+};
+
+} // namespace clang::tidy
+
namespace clang::tidy::misc {
namespace {
@@ -57,6 +77,16 @@ AST_POLYMORPHIC_MATCHER(isExternStorageClass,
} // namespace
+UseInternalLinkageCheck::UseInternalLinkageCheck(StringRef Name,
+ ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context),
+ HeaderFileExtensions(Context->getHeaderFileExtensions()),
+ FixMode(Options.get("FixMode", FixModeKind::UseStatic)) {}
+
+void UseInternalLinkageCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "FixMode", FixMode);
+}
+
void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
auto Common =
allOf(isFirstDecl(), isAllRedeclsInMainFile(HeaderFileExtensions),
@@ -82,11 +112,21 @@ static constexpr StringRef Message =
void UseInternalLinkageCheck::check(const MatchFinder::MatchResult &Result) {
if (const auto *FD = Result.Nodes.getNodeAs<FunctionDecl>("fn")) {
- diag(FD->getLocation(), Message) << "function" << FD;
+ DiagnosticBuilder DB = diag(FD->getLocation(), Message) << "function" << FD;
+ SourceLocation FixLoc = FD->getTypeSpecStartLoc();
+ if (FixLoc.isInvalid() || FixLoc.isMacroID())
+ return;
+ if (FixMode == FixModeKind::UseStatic)
+ DB << FixItHint::CreateInsertion(FixLoc, "static ");
return;
}
if (const auto *VD = Result.Nodes.getNodeAs<VarDecl>("var")) {
- diag(VD->getLocation(), Message) << "variable" << VD;
+ DiagnosticBuilder DB = diag(VD->getLocation(), Message) << "variable" << VD;
+ SourceLocation FixLoc = VD->getTypeSpecStartLoc();
+ if (FixLoc.isInvalid() || FixLoc.isMacroID())
+ return;
+ if (FixMode == FixModeKind::UseStatic)
+ DB << FixItHint::CreateInsertion(FixLoc, "static ");
return;
}
llvm_unreachable("");
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.h b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.h
index a3c1c33965903..0d6c3e43aa945 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.h
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.h
@@ -20,17 +20,22 @@ namespace clang::tidy::misc {
/// http://clang.llvm.org/extra/clang-tidy/checks/misc/use-internal-linkage.html
class UseInternalLinkageCheck : public ClangTidyCheck {
public:
- UseInternalLinkageCheck(StringRef Name, ClangTidyContext *Context)
- : ClangTidyCheck(Name, Context),
- HeaderFileExtensions(Context->getHeaderFileExtensions()) {}
+ UseInternalLinkageCheck(StringRef Name, ClangTidyContext *Context);
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+ void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
std::optional<TraversalKind> getCheckTraversalKind() const override {
return TK_IgnoreUnlessSpelledInSource;
}
+ enum class FixModeKind {
+ None,
+ UseStatic,
+ };
+
private:
FileExtensionsSet HeaderFileExtensions;
+ FixModeKind FixMode;
};
} // namespace clang::tidy::misc
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst b/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
index e8e43a1fb3d63..1cfc889f67886 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
@@ -25,3 +25,16 @@ Example:
}
// already declared as extern
extern int v2;
+
+Options
+-------
+
+.. option:: FixMode
+
+ Selects what kind of a fix the check should provide.
+
+ ``None``
+ Don't fix automatically.
+
+ ``UseStatic``
+ Add ``static`` for internal linkage variable and function.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-fix-mode-none.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-fix-mode-none.cpp
new file mode 100644
index 0000000000000..3f2f5897bf718
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-fix-mode-none.cpp
@@ -0,0 +1,10 @@
+// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
+// RUN: -config="{CheckOptions: {misc-use-internal-linkage.FixMode: 'None'}}" -- -I%S/Inputs/use-internal-linkage
+
+void func() {}
+// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func'
+// CHECK-FIXES-NOT: static void func() {}
+
+int global;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'global'
+// CHECK-FIXES-NOT: static int global;
diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
index c6c513fe0b0c0..9c91389542b03 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
@@ -1,16 +1,21 @@
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
+// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
+// RUN: -config="{CheckOptions: {misc-use-internal-linkage.FixMode: 'UseStatic'}}" -- -I%S/Inputs/use-internal-linkage
#include "func.h"
void func() {}
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func'
+// CHECK-FIXES: static void func() {}
template<class T>
void func_template() {}
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func_template'
+// CHECK-FIXES: static void func_template() {}
void func_cpp_inc();
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func_cpp_inc'
+// CHECK-FIXES: static void func_cpp_inc();
#include "func_cpp.inc"
diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-var.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-var.cpp
index bd5ef5431de6c..01b8d28e61230 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-var.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-var.cpp
@@ -1,13 +1,17 @@
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
+// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
+// RUN: -config="{CheckOptions: {misc-use-internal-linkage.FixMode: 'UseStatic'}}" -- -I%S/Inputs/use-internal-linkage
#include "var.h"
int global;
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'global'
+// CHECK-FIXES: static int global;
template<class T>
T global_template;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: variable 'global_template'
+// CHECK-FIXES: static T global_template;
int gloabl_header;
More information about the cfe-commits
mailing list