流程就是先提取出TU,get其中的cursor,将之打印出来:
CXIndex Index = clang_createIndex(0,0);
CXTranslationUnit TU = clang_parseTranslationUnit(Index, 0, argv, argc,
0, 0,
CXTranslationUnit_None);
CXCursor C = clang_getTranslationUnitCursor(TU);
打印出cursor和cursorKind的方法实现很简单,不多赘述
主要是CXChildVisitResult要注意,其返回值虽然可以有不同,但是我们一般都是返回CXChildVisit_Recurse
clang_visitChildren(cursor,
[](CXCursor c,CXCursor parent,CXClientData data){
printSpell(c);
printLocation(c);
return CXChildVisit_Recurse;},
NULL);
这里我套进去了,上面的代码拆开来看应该是这样的:
enum CXChildVisitResult printVisitor(CXCursor cursor, CXCursor parent,
CXClientData client_data) {
printSpelling(cursor);
printKindSpelling(cursor);
printLocation(cursor);
return CXChildVisit_Recurse;
}
和
clang_visitChildren(cursor, printVisitor, NULL);
完整代码如下:
#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <string.h>
#include <fcntl.h>
#include "clang-c/Index.h"
using namespace std;
bool printSpell(CXCursor cursor){
CXCursorKind kind=clang_getCursorKind(cursor);
printf("the cursorSpelling is:%s\n",clang_getCString(clang_getCursorSpelling(cursor)));
printf("the cursorKindSpelling is:%s\n",clang_getCString(clang_getCursorKindSpelling(kind)));
return true;
}
bool printLocation(CXCursor cursor){
CXSourceRange range=clang_getCursorExtent(cursor);
CXSourceLocation startLocation=clang_getRangeStart(range);
CXSourceLocation endLocation=clang_getRangeEnd(range);
CXFile file;
unsigned int line,col,offset;
clang_getInstantiationLocation(startLocation,&file,&line,&col,&offset);
printf("start_Location is:l:%u c:%u offset:%u\n",line,col,offset);
clang_getInstantiationLocation(endLocation,&file,&line,&col,&offset);
printf("end_Location is:l:%u c:%u offset:%u\n",line,col,offset);
}
int main(int argc , char *argv[]){
CXIndex index = clang_createIndex(0,0);
CXTranslationUnit TU=clang_parseTranslationUnit(index,0,argv,
argc,0,
0,CXTranslationUnit_None);
CXCursor cursor=clang_getTranslationUnitCursor(TU);
printSpell(cursor);
clang_visitChildren(cursor,
[](CXCursor c,CXCursor parent,CXClientData data){
printSpell(c);
printLocation(c);
return CXChildVisit_Recurse;},
NULL);
clang_disposeTranslationUnit(TU);
clang_disposeIndex(index);
return 0;
}
CMakeLists.txt我也贴出来吧,没怎么好好写,有的没的都加上去了,路径有不一样改一下就好了。
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(example)
ADD_EXECUTABLE(example example.cpp)
INCLUDE_DIRECTORIES(./include/)
#Need to do more about find library#
FIND_LIBRARY(LIBCLANG_PATH clang HINTS /home/xioazhiming/clang+llvm-10.0.0/lib)
TARGET_LINK_LIBRARIES(example ${LIBCLANG_PATH})
add_compile_options(-fno-rtti)
include_directories("/home/xioazhiming/clang+llvm-10.0.0/include")
include_directories("/home/xioazhiming/clang+llvm-10.0.0/include/llvm")
include_directories("/home/xioazhiming/clang+llvm-10.0.0/include/clang")
include_directories("/usr/include")
include_directories("/usr/local/include")
include_directories("/usr/lib/gcc/x86_64-linux-gnu/7/include")
include_directories("/usr/lib/gcc/x86_64-linux-gnu")
include_directories("/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed")
include_directories("/home/xioazhiming/clang+llvm-10.0.0/include/llvm/ADT")