Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <clang-c/Index.h>
  2. #include <iostream>
  3.  
  4. std::ostream&
  5. operator<<(std::ostream& stream, const CXString& str)
  6. {
  7.   stream << clang_getCString(str);
  8.   clang_disposeString(str);
  9.   return stream;
  10. }
  11.  
  12. void
  13. displayDiagnostics(CXTranslationUnit TU)
  14. {
  15.   if (TU == nullptr) {
  16.     std::cerr << "Parsing error!" << std::endl;
  17.     return;
  18.   }
  19.  
  20.   unsigned int numDiagnostics = clang_getNumDiagnostics(TU);
  21.   std::cerr << numDiagnostics << " diagnostics" << std::endl;
  22.   for (unsigned int i = 0; i < numDiagnostics; ++i) {
  23.     auto diagnostic = clang_getDiagnostic(TU, i);
  24.     auto string = clang_formatDiagnostic(
  25.       diagnostic, clang_defaultDiagnosticDisplayOptions());
  26.     std::cerr << clang_getCString(string) << std::endl;
  27.     clang_disposeString(string);
  28.     clang_disposeDiagnostic(diagnostic);
  29.   }
  30. }
  31.  
  32. int
  33. main(int argc, char** argv)
  34. {
  35.   CXIndex index = clang_createIndex(false, // excludeDeclarationFromPCH
  36.                                     true   // displayDiagnostics
  37.   );
  38.  
  39.   CXTranslationUnit tu;
  40.   unsigned options = clang_defaultEditingTranslationUnitOptions();
  41.  
  42.   auto unit = clang_parseTranslationUnit2FullArgv(
  43.     index,                       // CIdx
  44.     "/usr/include/c++/9/vector", // source_filename
  45.     argv + 1,                    // command_line_args
  46.     argc - 1,                    // num_command_line_args
  47.     nullptr,                     // unsave_files
  48.     0,                           // num_unsaved_files
  49.     options,                     // options
  50.     &tu);
  51.   if (unit == CXError_Success)
  52.     std::cout << "Translation unit successfully created" << std::endl;
  53.   else
  54.     std::cout << "Translation unit was not created:" << unit << std::endl;
  55.  
  56.   CXCursor cursor = clang_getTranslationUnitCursor(tu);
  57.   clang_visitChildren(
  58.     cursor,
  59.     [](CXCursor c, CXCursor /*parent*/, CXClientData /*client_data*/) {
  60.       std::cout << "Cursor '" << clang_getCursorSpelling(c) << "' of kind '"
  61.                 << clang_getCursorKindSpelling(clang_getCursorKind(c)) << "'\n";
  62.       return CXChildVisit_Recurse;
  63.     },
  64.     nullptr);
  65.  
  66.   clang_disposeIndex(index);
  67.   return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement