Clang插件学习 Clang插件常用API
来源:互联网 发布:淘宝网上买手机可靠吗 编辑:程序博客网 时间:2024/05/17 01:01
1.定义一个plugin子类头文件
#ifndef MyPlugin_hpp#define MyPlugin_hpp#include <stdio.h>#include<iostream>#include<sstream>#include<typeinfo>#include "clang/Frontend/FrontendPluginRegistry.h"#include "clang/AST/AST.h"#include "clang/AST/ASTConsumer.h"#include "clang/Frontend/CompilerInstance.h"#include "clang/AST/RecursiveASTVisitor.h"#include "ValidAPIUtil.hpp"#pragma GCC visibility push(default)using namespace clang;using namespace std;using namespace llvm;extern string gSrcRootPath;namespace my{ class MyASTVisitor : public RecursiveASTVisitor<MyASTVisitor> { private: ASTContext *context; public: void setContext(ASTContext &context); bool VisitDecl(Decl *decl); bool VisitStmt(Stmt *s); }; ast解析完成后调用 class MyASTConsumer : public ASTConsumer { private: MyASTVisitor visitor; void HandleTranslationUnit(ASTContext &context); }; class MyASTAction : public PluginASTAction { public: // this gets called by Clang when it invokes our Plugin unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &Compiler,llvm::StringRef InFile); //处理插件的命令行参数 bool ParseArgs(const CompilerInstance &CI, const std::vector<std::string>& args); };}#pragma GCC visibility pop#endif /* MyPlugin_hpp */
2.注册plugin
static clang::FrontendPluginRegistry::Add<my::MyASTAction>
X("MyPluginName", "MyPlugin description");
第一个参数是插件名称,第二个是插件描述
3.处理命令行参数
编译的时候添加plugin对应的param就可以通过该方法将param获取到.例如在other_cflag除了上期配置外添加中添加-Xclang -plugin-arg-MyPlugin -Xclang $SRCROOT/..,就可以将srcroot的路径打印出来
//处理命令行参数bool MyASTAction::ParseArgs(const CompilerInstance &CI, const std::vector<std::string>& args) { size_t cnt = args.size(); for(int i = 0;i < cnt;i++){ cout<<"myparam:"<<args.at(i)<<endl; } return true;}
4.重写VisitDel
这个方法获得到声明的接口,实现类,categore等
1.是否是interface声明if(isa<ObjCInterfaceDecl>(decl)){}
获取父类名称:interfDecl->getSuperClass()->>getNameAsString()获取当前类名称:objcClsInterface = interfDecl->getNameAsString();后面获取类的名称都与此类似获取实现的所有ObjCProtocolDecl:for(ObjCList<ObjCProtocolDecl>::iterator it = interfDecl->all_referenced_protocol_begin();it!=interfDecl->all_referenced_protocol_end();it++){ (*it)->getNameAsString();}获取接口文件名称: context->getSourceManager().getFilename(interfDecl->getSourceRange().getBegin()).str();
2.是否是实现类
if(isa<ObjCImplDecl>(decl)){}
3.是否是category
if(isa<ObjCCategoryDecl>(decl)){}
4.是否是协议
if(isa<ObjCProtocolDecl>(decl)){}
5.是否是property
if(isa<ObjCPropertyDecl>(decl)){}
是否是实例变量:objcIsInstanceMethod = propertyDecl->isInstanceProperty();property类型(修饰符例如NSString):propertyDecl->getType().getAsString();getter方法名称:propertyDecl->getGetterName().getAsString()setter方法名称:propertyDecl->getSetterName().getAsString()是否只读:propertyDecl->isReadOnly()是否是类property:propertyDecl->isClassProperty()是否是原子性:propertyDecl->isAtomic()
6.是否是成员变量
if (isa<ObjCIvarDecl>(decl)) {}
成员变量名称:ivarDecl->getNameAsString()
7.是否是参数 if (isa<ObjCTypeParamDecl>(decl)){}
@interface NSDictionary<Key : id<NSCopying>, Value>@endkey,value就是paramter
8.是否是方法 if(isa<ObjCMethodDecl>(decl)){}
是否是实例方法: methodDecl->isInstanceMethod()selector名称: methodDecl->getSelector().getAsString()返回值类型:methodDecl->getReturnType().getAsString()参数:for(ArrayRef<ParmVarDecl *>::iterator it = methodDecl->param_begin();it!=methodDecl->param_end();it++){ cout<<"参数:"<<((*it)->getNameAsString())<<"参数类型:"<<(*it)->getType().getAsString()<<endl;}
5.重写VisitStmt
1.是否是变量方法枚举等 if(isa<DeclRefExpr>(s)){}
声明的名称:callExpr->getDecl()->->getNameAsString()是否是变量:isa<VarDecl>(decl)是否是函数:isa<FunctionDecl>(decl)是否是枚举:isa<EnumConstantDecl>(decl)
2.向object-c对象发送消息 isa<ObjCMessageExpr>(s)
调用者:objcExpr->getSelector().getAsString()
函数本身名称: objcExpr->getSelector().getAsString()
接受消息类型:objcExpr->getReceiverType().getAsString()
6.完成ast读取
ast解析完成后调用 void MyASTConsumer::HandleTranslationUnit(ASTContext &context){ }
7.参考
1.官网教程
2plugindemo
3.插件入门
- Clang插件学习 Clang插件常用API
- clang插件的安装
- clang带来的clang complete代码补全插件
- Vim插件之vim-clang和clang complete
- Sublime Text 3 安装 Clang Format 插件
- Sublime Text3插件Clang-Complete的安装
- 手把手教你开发 clang 插件
- clang
- Clang
- clang
- clang
- clang
- CLANG技术分享系列一:编写你的第一个CLANG插件
- vim clang autocomplete插件---扫地老僧的Blog
- Ubuntu安装sublime text 3以及sublime clang插件使用
- 基于clang插件的一种iOS包大小瘦身方案
- Chromium代码里编写定制的clang插件做C++函数的静态样式检查
- clang 开发应用xcode 编译检查的插件 一:构建篇
- 【黑色飞鱼教程】今天来讲讲115怎么玩得转~
- 喵哈哈村的魔法考试 Round #2 (Div.2) B.喵哈哈村的种花魔法 线段树 区间更新 单点查询
- android 拍照及录短视频---练习
- android 拍照及录短视频---练习
- java异常处理及设计
- Clang插件学习 Clang插件常用API
- sublime插件整理
- Uva11093 Just Finish it up【模拟】【例题8-13】
- 51nod 1086【背包·DP】
- 每日一省之————加权有向图的最短路径问题
- openstack虚拟机发放速度优化
- 字符串(一)strlen、strcpy、strcat的实现
- Android PopupWindow的使用技巧 Android上自定义弹出窗口
- 从键盘输入一个整数,然后逆序输出