Find clang::按名称键入clang AST
在Clang AST中,是否可以按名称查找类型 例如,我有限定名:Find clang::按名称键入clang AST,clang,clang++,llvm-clang,llvm-c++-api,libclang,Clang,Clang++,Llvm Clang,Llvm C++ Api,Libclang,在Clang AST中,是否可以按名称查找类型 例如,我有限定名:nspace::my_type。如何检查当前翻译单元中是否存在类型?注意:我的知识非常有限,只需写一次铿锵有力的检查就可以进行所需的更新。可能是错的 根据手头的任务,在clang AST中可能需要两件事:Type和TypeLocation。我需要类型位置,所以这是我首先要提到的 查找类型拼写。 在本例中,实际需要的是TypeLocationast节点。它们代表一种类型的拼写。 不幸的是,它们不是通过叮当声查询打印的 搜索它们的方法
nspace::my_type
。如何检查当前翻译单元中是否存在类型?注意:我的知识非常有限,只需写一次铿锵有力的检查就可以进行所需的更新。可能是错的
根据手头的任务,在clang AST中可能需要两件事:Type
和TypeLocation
。我需要类型位置,所以这是我首先要提到的
查找类型拼写。
在本例中,实际需要的是TypeLocation
ast节点。它们代表一种类型的拼写。
不幸的是,它们不是通过叮当声查询打印的
搜索它们的方法是使用类型\u loc
匹配器
这是我所需要的:查找wide
模板的所有专业知识。
这将为我找到wide
wideLoc
-是我用来更改类型拼写的内容
不同的type\u loc
的父级也是type\u loc
例如,我可以找到T
的所有条目,除非它们位于wide
查找该类型的所有实际用法,无论其拼写如何。
现在,对于这种类型的问题,您需要匹配一个类型
我本人从未这样做过,但我们可以看到abseil在这里这样做:
PS。以防万一-所有叮当作响的ast匹配器:
l isWide hasDeclaration(classTemplateDecl(namedDecl(hasName("wide"))))
l isWideSpec templateSpecializationType(isWide)
l wideLoc typeLoc(loc(isWideSpec))
typeLoc(loc(asString("T")), unless(hasAncestor(wideLoc)))