• 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
  • 相关阅读:
    工业智能网关BL110详解之1:实现三菱 PLC FX1S 接入Modbus TCP Server云平台
    Mysql 的分布式策略
    【MySQL】数据库排查慢查询、死锁进程排查、预防以及解决方法
    不一样的“中国速度”,数据可视化交通运输大屏,带你见证中国高铁
    地平线 旭日X3 PI (一)首次开机细节
    NC7 买卖股票的最好时机(一)
    数字逻辑·时序线路分析【触发器和时序线路分析方法】
    面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
    当我点击桌面App的图标时发生了什么-浅析Activity启动流程(代码基于Android-12)
    oracle中获取连续几天最低数据
  • 原文地址:https://blog.csdn.net/E2MCC/article/details/125461602