湖南大学 SCCI 并行计算组
LLVM Clang AST 04
使用 libclang (C Routine) 操作 AST
LLVM Clang AST 04
使用 libclang (C Routine) 操作 AST
1. CXRewriter类型
2.clang_CXRewriter_create()例程
该例程为Rewriter开辟一个空间,返回这个空间的指针。
依赖库
libclang.a
or
libclang.so
函数名
clang_CXRewriter_create
函数原型
CXRewriter clang_CXRewriter_create(CXTranslationUnit TU)
3. clang_CXRewriter_dispose()例程
该例程用于释放由clang_CXRewriter_create()例程开辟的空间
依赖库
libclang.a
or
libclang.so
函数名
clang_CXRewriter_dispose
函数原型
void clang_CXRewriter_dispose(CXRewriter Rew)
4. clang_CXRewriter_insertTextBefore()例程
该例程用于在原始缓冲区中的指定位置插入指定字符串。
依赖库
libclang.a
or
libclang.so
函数名
clang_CXRewriter_insertTextBefore
函数原型
CXRewriter clang_CXRewriter_create
(
CXRewriter Rew,
CXSourceLocation Loc,
const char * InsertStr
)
5. clang_CXRewriter_overwriteChangedFiles()例程
该例程用于将所有已更改的文件保存到磁盘。
依赖库
libclang.a
or
libclang.so
函数名
clang_CXRewriter_overwriteChangedFiles
函数原型
int clang_CXRewriter_overwriteChangedFiles(CXRewriter Rew)
返回1表示未成功保存任何文件;返回0表示成功保存。
6. clang_CXRewriter_removeText()例程
该例程用于删除源码中指定的范围的字符串。
依赖库
libclang.a
or
libclang.so
函数名
clang_CXRewriter_removeText
函数原型
void clang_CXRewriter_removeText(CXRewriter Rew, CXSourceRange ToBeRemoved)
7. clang_CXRewriter_replaceText()例程
该例程用于替换源码中指定范围字符串,将目标范围内的字符串替换为指定的字符串。
依赖库
libclang.a
or
libclang.so
函数名
clang_CXRewriter_replaceText
函数原型
void clang_CXRewriter_replaceText
(
CXRewriter Rew,
CXSourceRange ToBeReplaced,
const char * ReplaceStr
)
由此我们可以写一个在指定Cursor处插入,删除和替换的例程
//插入
int SCCICOMPLIER_InsertStrToSourceFile
(
CXTranslationUnit const TU,
CXCursor const Cursor,
char const * const InsertStr,
int const Upon
)
{
int CheckCode;
CXRewriter Rew = clang_CXRewriter_create(TU);
CXSourceRange range = clang_getCursorExtent(Cursor);
CXSourceLocation SourceLocation;
if(Upon)//如果是在Cursor位置前插入
{
SourceLocation = clang_getRangeStart(range);
}
else//如果是在Cursor位置后插入
{
SourceLocation = clang_getRangeEnd(range);
}
clang_CXRewriter_insertTextBefore(Rew, SourceLocation, InsertStr);
CheckCode = clang_CXRewriter_overwriteChangedFiles(Rew);
clang_CXRewriter_dispose(Rew);
return CheckCode;
}
//删除
int SCCICOMPLIER_RemoveCursorInSourceFile
(
CXTranslationUnit const TU,
CXCursor const Cursor
)
{
int CheckCode;
CXRewriter Rew = clang_CXRewriter_create(TU);
CXSourceRange Range = clang_getCursorExtent(Cursor);
clang_CXRewriter_removeText(Rew,Range);
CheckCode = clang_CXRewriter_overwriteChangedFiles(Rew);
clang_CXRewriter_dispose(Rew);
return CheckCode;
}
//替换
int SCCICOMPLIER_ReplaceCursorInSourceFile
(
CXTranslationUnit const TU,
CXCursor const Cursor,
char const * const ReplaceStr
)
{
int CheckCode;
CXRewriter Rew = clang_CXRewriter_create(TU);
CXSourceRange Range = clang_getCursorExtent(Cursor);
clang_CXRewriter_replaceText(Rew,Range,ReplaceStr);
CheckCode = clang_CXRewriter_overwriteChangedFiles(Rew);
clang_CXRewriter_dispose(Rew);
return CheckCode;
}