使用 libclang,我在 AST 中有一个游标,它对应于宏扩展产生的语句。我想检索原始的、未扩展的宏文本。
我一直在寻找一个 libclang API 来执行此操作,但找不到。我错过了什么吗?
假设不存在这样的 API,我看到了几种方法可以做到这一点,它们都基于使用 clang_getCursorExtent() 来获取光标的源范围——大概是原始文本的范围。
第一个想法是使用 clang_getFileLocation() 获取文件名和位置以及范围开始和结束,并直接从文件中读取文本。如果我是从未保存的文件编译的,那么我需要处理这个问题,但我对这种方法的主要担忧是,当我确定 clang 在内部保存所有这些信息时,似乎不适合到文件系统之外. 如果 AST 已经加载而不是生成,或者源文件在解析后被修改,也会产生影响。
第二种方法是在游标范围上调用 clang_tokenize()。我尝试这样做,发现它无法为 AST 中的大多数游标生成令牌列表。跟踪代码,发现内部 clang_tokenize() 操作了提供的范围并最终得出结论它跨越多个文件(可能是由于宏扩展的某些影响),然后中止。这对我来说似乎不正确,但我确实觉得无论如何我都在滥用 clang_tokenize() 试图做到这一点。
那么,最好的方法是什么?