• 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
  • 相关阅读:
    Linux笔记之diff工具软件P4merge的使用
    基于安卓android微信小程序的校园跑腿系统
    NIO学习笔记
    (十三) 共享模型之无锁【字段更新器、原子累加器、Unsafe】
    Win10 cmd如何试用tar命令压缩和解压文件夹
    DJ 12-3 程序控制指令
    多线程编程模式-Producer-consumer
    android红外信号
    C#面试题目含参考答案(四)
    王道链表综合题(下)
  • 原文地址:https://blog.csdn.net/E2MCC/article/details/125461602