Skip to content

Instantly share code, notes, and snippets.

@sbwtw
Forked from raphaelmor/clanglib.c
Created July 23, 2018 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sbwtw/d0b71dcbea3fcc51479c0d6787075b8a to your computer and use it in GitHub Desktop.
Save sbwtw/d0b71dcbea3fcc51479c0d6787075b8a to your computer and use it in GitHub Desktop.
clanglib usage example
#include <iostream>
#include <clang-c/Index.h>
#include <clang-c/Platform.h>
void printDiagnostics(CXTranslationUnit translationUnit);
void printTokenInfo(CXTranslationUnit translationUnit,CXToken currentToken);
void printCursorTokens(CXTranslationUnit translationUnit,CXCursor currentCursor);
CXChildVisitResult cursorVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data);
CXChildVisitResult functionDeclVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data);
int main (int argc, const char * argv[])
{
CXIndex index = clang_createIndex(0, 0);
if(index == 0){
fprintf(stderr, "error creating index\n");
return 1;
}
CXTranslationUnit translationUnit = clang_parseTranslationUnit(index, 0,
argv, argc, 0, 0, CXTranslationUnit_None);
if(translationUnit == 0){
fprintf(stderr, "error creating translationUnit\n");
return 1;
}
printDiagnostics(translationUnit);
CXCursor rootCursor = clang_getTranslationUnitCursor(translationUnit);
//printCursorTokens(translationUnit,rootCursor);
unsigned int res = clang_visitChildren(rootCursor, *cursorVisitor,0);
clang_disposeTranslationUnit(translationUnit);
clang_disposeIndex(index);
return 0;
}
void printDiagnostics(CXTranslationUnit translationUnit){
int nbDiag = clang_getNumDiagnostics(translationUnit);
printf("There is %i diagnostics\n",nbDiag);
for (unsigned int currentDiag = 0; currentDiag < nbDiag; ++currentDiag) {
CXDiagnostic diagnotic = clang_getDiagnostic(translationUnit, currentDiag);
CXString errorString = clang_formatDiagnostic(diagnotic,clang_defaultDiagnosticDisplayOptions());
fprintf(stderr, "%s\n", clang_getCString(errorString));
clang_disposeString(errorString);
}
}
void printTokenInfo(CXTranslationUnit translationUnit,CXToken currentToken)
{
CXString tokenString = clang_getTokenSpelling(translationUnit, currentToken);
CXTokenKind kind = clang_getTokenKind(currentToken);
switch (kind) {
case CXToken_Comment:
printf("Token : %s \t| COMMENT\n", clang_getCString(tokenString));
break;
case CXToken_Identifier:
printf("Token : %s \t| IDENTIFIER\n", clang_getCString(tokenString));
break;
case CXToken_Keyword:
printf("Token : %s \t| KEYWORD\n", clang_getCString(tokenString));
break;
case CXToken_Literal:
printf("Token : %s \t| LITERAL\n", clang_getCString(tokenString));
break;
case CXToken_Punctuation:
printf("Token : %s \t| PUNCTUATION\n", clang_getCString(tokenString));
break;
default:
break;
}
}
void printCursorTokens(CXTranslationUnit translationUnit,CXCursor currentCursor)
{
CXToken *tokens;
unsigned int nbTokens;
CXSourceRange srcRange;
srcRange = clang_getCursorExtent(currentCursor);
clang_tokenize(translationUnit, srcRange, &tokens, &nbTokens);
for (int i = 0; i < nbTokens; ++i)
{
CXToken currentToken = tokens[i];
printTokenInfo(translationUnit,currentToken);
}
clang_disposeTokens(translationUnit,tokens,nbTokens);
}
CXChildVisitResult cursorVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data){
CXCursorKind kind = clang_getCursorKind(cursor);
CXString name = clang_getCursorSpelling(cursor);
if (kind == CXCursor_FunctionDecl || kind == CXCursor_ObjCInstanceMethodDecl)
{
printf("method '%s'\n",clang_getCString(name));
// visit method childs
int nbParams = 0;
clang_visitChildren(cursor, *functionDeclVisitor,&nbParams);
printf("nb Params : %i'\n",nbParams);
CXSourceLocation location = clang_getCursorLocation(cursor);
CXString filename;
unsigned int line, column;
clang_getPresumedLocation(location, &filename, &line, &column);
printf("source location : %s, (%i,%i)\n",clang_getCString(filename),line,column);
return CXChildVisit_Continue;
}
//printf("cursor '%s' -> %i\n",clang_getCString(name),kind);
return CXChildVisit_Recurse;
}
CXChildVisitResult functionDeclVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data){
CXCursorKind kind = clang_getCursorKind(cursor);
CXType type = clang_getCursorType(cursor);
if (kind == CXCursor_ParmDecl){
CXString name = clang_getCursorSpelling(cursor);
printf("\tparameter: '%s' of type '%i'\n",clang_getCString(name),type.kind);
int *nbParams = (int *)client_data;
(*nbParams)++;
}
return CXChildVisit_Continue;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment