Libclang Can';t在include语句中的某些偏移处获取CXCursor

Libclang Can';t在include语句中的某些偏移处获取CXCursor,libclang,Libclang,将此源文件指定为test.cpp #包括 如果我使用CXTranslationUnit\u DetailedPreprocessingRecord选项使用clang_parseTranslationUnit()解析它,我会发现在我的源文件中有一个CXCursor,其种类为CXCursor\u InclusionDirective,范围为偏移量0到偏移量17 如果我通过调用clang_getLocationForOffset()和clang_getCursor()来获取偏移量为0到9的CXCur

将此源文件指定为test.cpp

#包括

如果我使用CXTranslationUnit\u DetailedPreprocessingRecord选项使用clang_parseTranslationUnit()解析它,我会发现在我的源文件中有一个CXCursor,其种类为CXCursor\u InclusionDirective,范围为偏移量0到偏移量17

如果我通过调用clang_getLocationForOffset()和clang_getCursor()来获取偏移量为0到9的CXCursor,我就会得到这个光标。对于偏移量10到17,我得到一个CXCursor,其种类为CXCursor\u nodecFound

我希望得到所有偏移量0到17的CXCursor\u inclusion指令CXCursor。有人能解释为什么吗?(对于使用“”而不是“”的include语句,似乎不会出现问题)

CXCursor GetCursorAt(CXTranslationUnit tu,CXFile文件,无符号偏移量)
{
cxsl;
sl=clang_getLocationForOffset(tu、文件、偏移量);
断言(!clang_equalocations(sl,clang_getNullLocation());
返回clang_getCursor(tu,sl);
}
void getcursorextentoffset(CXCursor游标、无符号*开始、无符号*结束)
{
CXSourceRange范围=clang_getCursorExtent(光标);
cxsourceloc;
cxf文件;
无符号l,c,o;
loc=clang_getRangeStart(范围);
clang_getInstantiationLocation(loc、f、l、c和o);
*启动=o;
loc=clang_getRangeEnd(范围);
clang_getInstantiationLocation(loc、f、l、c和o);
*结束=o;
}
int main(int argc,常量字符**argv)
{
CXIndex idx=clang_createIndex(1,0);
CXTranslationUnit tu=clang_parseTranslationUnit(idx,“test.cpp”,NULL,0,NULL,0,CXTranslationUnit_detailedPreprocessRecord);
断言(tu);
CXFile file=clang_getFile(tu,“test.cpp”);
断言(文件);
cxc;
未签名的开始、结束;
无符号testOffset;
//检查偏移量0处的Curosr
testOffset=0;
c=GetCursotAt(tu、文件、testOffset);
断言(!clangu equalCursors(c,clangu getNullCursor());
//检查我们是否有#include的光标
断言(clang_getCursorKind(c)=CXCursor_InclusionDirective);
//检查光标覆盖整个范围(0->17)
GetCursorExtentOffset(c、开始和结束);
断言(start==0);
断言(end==17);
//为偏移量1,2,3…9返回的检查光标
用于(testOffset=1;testOffset<10;testOffset++)
{
c=GetCursotAt(tu、文件、testOffset);
断言(!clangu equalCursors(c,clangu getNullCursor());
//检查我们是否有#include的光标
断言(clang_getCursorKind(c)=CXCursor_InclusionDirective);
}
//检查偏移量9,10…17处的游标。所有将返回一个CXCursor类型为CXCursor\u NoDeclFound的CXCursor
用于(testOffset=10;testOffset<17;testOffset++)
{
c=GetCursotAt(tu,文件,10);
断言(!clangu equalCursors(c,clangu getNullCursor());
//检查我们是否有#include的光标
//!!clang_getCursorKind(c)现在返回CXCursor_nodecFound!!
断言(clang_getCursorKind(c)=CXCursor_NoDeclFound);
}
返回0;
}

“我发现在我的源文件中有一个CXCursor”:您是通过遍历AST并依次查看所有游标得出这个结论的吗?我这样问是因为您的代码没有显示这样的遍历…是的,我没有包含此代码,因为我想保持问题的简洁性。这(获得AST中不存在的
CXCursor
),再加上
#include“…”
按预期工作,在我看来很可能被视为一个bug。也许你应该考虑在LLVM/CLAN邮件列表中提交一个bug或要求澄清,谢谢,弗朗西斯科。