diff --git a/src/Cursor.h b/src/Cursor.h index f7cd903..5740226 100644 --- a/src/Cursor.h +++ b/src/Cursor.h @@ -174,12 +174,14 @@ namespace clang { class Cursor { public: + Cursor() {} Cursor(TranslationUnit *tu, SourceLocation *source_location); const CursorKind kind(); private: CXCursor cursor_; friend SourceRange; friend SourceLocation; + friend Tokens; }; } // namespace clang #endif // CURSOR_H_ diff --git a/src/Token.h b/src/Token.h index 6ff1ffc..5208b6b 100644 --- a/src/Token.h +++ b/src/Token.h @@ -19,7 +19,7 @@ namespace clang { std::string get_token_spelling(TranslationUnit *tu); SourceLocation get_source_location(TranslationUnit *tu); SourceRange get_source_range(TranslationUnit *tu); - + std::string type; private: explicit Token(const CXToken &token); friend SourceRange; diff --git a/src/Tokens.cc b/src/Tokens.cc index 0b709b5..575102a 100644 --- a/src/Tokens.cc +++ b/src/Tokens.cc @@ -1,4 +1,7 @@ #include "Tokens.h" +#include +using namespace std; + clang::Tokens::Tokens(clang::TranslationUnit *tu, clang::SourceRange *range) { clang_tokenize(tu->tu_, range->range_, @@ -19,3 +22,61 @@ clang::Tokens::~Tokens() { std::vector& clang::Tokens::tokens() { return tks; } + +std::vector clang::Tokens::get_token_cursors(clang::TranslationUnit *tu) { + std::vector clang_tokens; + for(auto& token: tks) + clang_tokens.emplace_back(token.token_); + std::vector clang_cursors(clang_tokens.size()); + clang_annotateTokens(tu->tu_, clang_tokens.data(), clang_tokens.size(), &clang_cursors.data()[0]); + + std::vector cursors; + for(auto clang_cursor: clang_cursors) { + cursors.emplace_back(); + cursors.back().cursor_=clang_cursor; + } + + for(int c=0;c& tokens(); + std::vector get_token_cursors(clang::TranslationUnit *tu); private: std::vector tks; CXToken *tokens_;