Skip to content
This repository was archived by the owner on Jan 19, 2025. It is now read-only.

Commit 8ac9ea3

Browse files
authored
Sadikov Damir. Lab №1. Var 3 (#12)
Deprecated plugin
1 parent a2de4ee commit 8ac9ea3

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
add_llvm_library(DeprecatedPlugin_SadikovD MODULE DeprecatedPlugin_SadikovD.cpp PLUGIN_TOOL clang)
2+
3+
if(WIN32 OR CYGWIN)
4+
set(LLVM_LINK_COMPONENTS
5+
Support
6+
)
7+
clang_target_link_libraries(DeprecatedPlugin_SadikovD PRIVATE
8+
clangAST
9+
clangBasic
10+
clangFrontend
11+
)
12+
endif()
13+
14+
set(CLANG_TEST_DEPS "DeprecatedPlugin_SadikovD" ${CLANG_TEST_DEPS} PARENT_SCOPE)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include "clang/AST/ASTConsumer.h"
2+
#include "clang/AST/RecursiveASTVisitor.h"
3+
#include "clang/Frontend/CompilerInstance.h"
4+
#include "clang/Frontend/FrontendPluginRegistry.h"
5+
6+
class DeprecatedPluginVisitor
7+
: public clang::RecursiveASTVisitor<DeprecatedPluginVisitor> {
8+
public:
9+
bool VisitFunctionDecl(clang::FunctionDecl *FunDec) {
10+
std::string FunctionName = FunDec->getNameInfo().getAsString();
11+
if (FunctionName.find("deprecated") != std::string::npos) {
12+
clang::DiagnosticsEngine &Diags =
13+
FunDec->getASTContext().getDiagnostics();
14+
unsigned DiagID =
15+
Diags.getCustomDiagID(clang::DiagnosticsEngine::Warning,
16+
"Name of function '%0' contains 'deprecated'");
17+
Diags.Report(FunDec->getLocation(), DiagID) << FunctionName;
18+
}
19+
return true;
20+
}
21+
};
22+
23+
class DeprecatedPluginConsumer : public clang::ASTConsumer {
24+
private:
25+
DeprecatedPluginVisitor Visitor;
26+
27+
public:
28+
void HandleTranslationUnit(clang::ASTContext &Context) override {
29+
Visitor.TraverseDecl(Context.getTranslationUnitDecl());
30+
}
31+
};
32+
33+
class DeprecatedPluginAction : public clang::PluginASTAction {
34+
public:
35+
std::unique_ptr<clang::ASTConsumer>
36+
CreateASTConsumer(clang::CompilerInstance &Compiler,
37+
llvm::StringRef InFile) override {
38+
return std::make_unique<DeprecatedPluginConsumer>();
39+
}
40+
41+
protected:
42+
bool ParseArgs(const clang::CompilerInstance &Compiler,
43+
const std::vector<std::string> &args) override {
44+
return true;
45+
}
46+
};
47+
48+
static clang::FrontendPluginRegistry::Add<DeprecatedPluginAction>
49+
X("DeprecatedPlugin_SadikovD",
50+
"Warning if function name contains 'deprecated'");
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// RUN: %clang -cc1 -load %llvmshlibdir/DeprecatedPlugin_SadikovD%pluginext -plugin DeprecatedPlugin_SadikovD %s 2>&1 | FileCheck %s
2+
3+
// CHECK-NOT: warning: Name of function 'just_regular_sum_function' contains 'deprecated'
4+
int just_regular_sum_function(int a, int b) {
5+
return a + b;
6+
}
7+
8+
// CHECK: warning: Name of function 'strange_deprecated_sum_function' contains 'deprecated'
9+
int strange_deprecated_sum_function(int a, int b) {
10+
return a + b;
11+
}
12+
13+
// CHECK-NOT: warning: Name of function 'IsItAlsoDeprecated' contains 'deprecated'
14+
int IsItAlsoDeprecated(int a, int b, int c) {
15+
return a + b + c;
16+
}
17+
18+
struct foo {
19+
// CHECK-NOT: warning: Name of function 'bar' contains 'deprecated'
20+
void bar() {}
21+
// CHECK: warning: Name of function 'bar_deprecated' contains 'deprecated'
22+
void bar_deprecated() {}
23+
};

0 commit comments

Comments
 (0)