|
|
|
@ -1,4 +1,7 @@ |
|
|
|
#include "Tokens.h" |
|
|
|
#include "Tokens.h" |
|
|
|
|
|
|
|
#include <iostream> |
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
|
|
|
|
clang::Tokens::Tokens(clang::TranslationUnit *tu, clang::SourceRange *range) { |
|
|
|
clang::Tokens::Tokens(clang::TranslationUnit *tu, clang::SourceRange *range) { |
|
|
|
clang_tokenize(tu->tu_, |
|
|
|
clang_tokenize(tu->tu_, |
|
|
|
range->range_, |
|
|
|
range->range_, |
|
|
|
@ -19,3 +22,61 @@ clang::Tokens::~Tokens() { |
|
|
|
std::vector<clang::Token>& clang::Tokens::tokens() { |
|
|
|
std::vector<clang::Token>& clang::Tokens::tokens() { |
|
|
|
return tks; |
|
|
|
return tks; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<clang::Cursor> clang::Tokens::get_token_cursors(clang::TranslationUnit *tu) { |
|
|
|
|
|
|
|
std::vector<CXToken> clang_tokens; |
|
|
|
|
|
|
|
for(auto& token: tks) |
|
|
|
|
|
|
|
clang_tokens.emplace_back(token.token_); |
|
|
|
|
|
|
|
std::vector<CXCursor> clang_cursors(clang_tokens.size()); |
|
|
|
|
|
|
|
clang_annotateTokens(tu->tu_, clang_tokens.data(), clang_tokens.size(), &clang_cursors.data()[0]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<clang::Cursor> cursors; |
|
|
|
|
|
|
|
for(auto clang_cursor: clang_cursors) { |
|
|
|
|
|
|
|
cursors.emplace_back(); |
|
|
|
|
|
|
|
cursors.back().cursor_=clang_cursor; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(int c=0;c<tks.size();c++) { |
|
|
|
|
|
|
|
auto referenced=clang_getCursorReferenced(cursors[c].cursor_); |
|
|
|
|
|
|
|
if(!clang_Cursor_isNull(referenced)) { |
|
|
|
|
|
|
|
//auto type=clang_getCursorType(referenced);
|
|
|
|
|
|
|
|
auto type=clang_getCanonicalType(clang_getCursorType(cursors[c].cursor_)); |
|
|
|
|
|
|
|
//auto cursor=clang_getTypeDeclaration(type);
|
|
|
|
|
|
|
|
//tks[c].type=clang_getCString(clang_getCursorSpelling(cursor));
|
|
|
|
|
|
|
|
//auto type=clang_getCursorType(referenced);
|
|
|
|
|
|
|
|
tks[c].type=clang_getCString(clang_getTypeSpelling(type)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//Testing:
|
|
|
|
|
|
|
|
/*if(tks[c].get_token_spelling(tu)=="text_view") {
|
|
|
|
|
|
|
|
cout << tks[c].get_token_spelling(tu) << endl; |
|
|
|
|
|
|
|
auto kind=clang_getCursorKind(cursors[c].cursor_); |
|
|
|
|
|
|
|
cout << " " << kind << endl; |
|
|
|
|
|
|
|
cout << " Decl: " << clang_isDeclaration(kind) << endl; |
|
|
|
|
|
|
|
cout << " Attr: " << clang_isAttribute(kind) << endl; |
|
|
|
|
|
|
|
cout << " Ref: " << clang_isReference(kind) << endl; |
|
|
|
|
|
|
|
cout << " Expr: " << clang_isExpression(kind) << endl; |
|
|
|
|
|
|
|
auto referenced=clang_getCursorReferenced(cursors[c].cursor_); |
|
|
|
|
|
|
|
if(!clang_Cursor_isNull(referenced)) { |
|
|
|
|
|
|
|
cout << " " << clang_getCursorKind(referenced) << endl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clang::Cursor referenced_cursor; |
|
|
|
|
|
|
|
referenced_cursor.cursor_=referenced; |
|
|
|
|
|
|
|
auto range=clang::SourceRange(&referenced_cursor); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto location=clang::SourceLocation(&range, true); |
|
|
|
|
|
|
|
std::string path; |
|
|
|
|
|
|
|
unsigned line, column, offset; |
|
|
|
|
|
|
|
location.get_location_info(&path, &line, &column, &offset); |
|
|
|
|
|
|
|
cout << " start: " << path << ", " << line << ", " << column << endl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
location=clang::SourceLocation(&range, false); |
|
|
|
|
|
|
|
location.get_location_info(&path, &line, &column, &offset); |
|
|
|
|
|
|
|
cout << " start: " << path << ", " << line << ", " << column << endl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto type=clang_getCursorType(referenced); |
|
|
|
|
|
|
|
cout << " " << clang_getCString(clang_getTypeSpelling(type)) << endl; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}*/ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return cursors; |
|
|
|
|
|
|
|
} |