• Clang AST 学习(五):使用libclang (C Routine) 操作 AST


    Clang官网
    Clang AST官网简介


    Clang AST 学习(五):使用libclang (C Routine) 操作 AST

    Rewrite 重写源码


    1. CXRewriter类型

    CXRewriter类型官方解释

    头文件
    clang-c/Rewrite.h

    2.clang_CXRewriter_create()例程

    该例程为Rewriter开辟一个空间,返回这个空间的指针。

    头文件
    clang-c/Rewrite.h

    依赖库
    libclang.a
    or
    libclang.so

    函数名
    clang_CXRewriter_create

    函数原型

    CXRewriter clang_CXRewriter_create(CXTranslationUnit TU)
    
    • 1

    3. clang_CXRewriter_dispose()例程

    该例程用于释放由clang_CXRewriter_create()例程开辟的空间

    头文件
    clang-c/Rewrite.h

    依赖库
    libclang.a
    or
    libclang.so

    函数名
    clang_CXRewriter_dispose

    函数原型

    void clang_CXRewriter_dispose(CXRewriter Rew)
    
    • 1

    4. clang_CXRewriter_insertTextBefore()例程

    该例程用于在原始缓冲区中的指定位置插入指定字符串。

    头文件
    clang-c/Rewrite.h

    依赖库
    libclang.a
    or
    libclang.so

    函数名
    clang_CXRewriter_insertTextBefore

    函数原型

    CXRewriter clang_CXRewriter_create
    (
    	CXRewriter          Rew,
    	CXSourceLocation    Loc,
    	const char        * InsertStr
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5. clang_CXRewriter_overwriteChangedFiles()例程

    该例程用于将所有已更改的文件保存到磁盘。

    头文件
    clang-c/Rewrite.h

    依赖库
    libclang.a
    or
    libclang.so

    函数名
    clang_CXRewriter_overwriteChangedFiles

    函数原型

    int clang_CXRewriter_overwriteChangedFiles(CXRewriter Rew)
    
    • 1

    返回1表示未成功保存任何文件;返回0表示成功保存。

    6. clang_CXRewriter_removeText()例程

    该例程用于删除源码中指定的范围的字符串。

    头文件
    clang-c/Rewrite.h

    依赖库
    libclang.a
    or
    libclang.so

    函数名
    clang_CXRewriter_removeText

    函数原型

    void clang_CXRewriter_removeText(CXRewriter Rew, CXSourceRange ToBeRemoved)
    
    • 1

    7. clang_CXRewriter_replaceText()例程

    该例程用于替换源码中指定范围字符串,将目标范围内的字符串替换为指定的字符串。

    头文件
    clang-c/Rewrite.h

    依赖库
    libclang.a
    or
    libclang.so

    函数名
    clang_CXRewriter_replaceText

    函数原型

    void clang_CXRewriter_replaceText
    (
    	CXRewriter          Rew,
    	CXSourceRange       ToBeReplaced,
    	const char        * ReplaceStr
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6



    由此我们可以写一个在指定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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
  • 相关阅读:
    [Shell]常用shell命令及测试判断语句总结
    百度地图——地图找房功能
    蓝桥杯入门即劝退(十)反转链表
    防止非法盗链的几种解决方案
    什么叫共同富裕,刘强东给老板们打了个样
    prometheus + grafana + node_exporter 搭建监控服务
    Web前端:Ionic Vs React Native——下一个项目该选哪一个?
    leetcode刷题:栈与队列01(用栈实现队列)
    杀疯了,GitHub疯传2022Java面试八股文解析+大厂面试攻略
    C++——vector
  • 原文地址:https://blog.csdn.net/E2MCC/article/details/125461602