Browse Source

Cleanup of Tokens.*.

merge-requests/37/head
eidheim 11 years ago
parent
commit
e845d58531
  1. 4
      src/Diagnostic.cc
  2. 21
      src/Tokens.cc
  3. 6
      src/Tokens.h
  4. 5
      src/TranslationUnit.cc
  5. 3
      src/TranslationUnit.h
  6. 18
      tests/Diagnostics_Test.cc
  7. 2
      tests/SourceLocation_H_Test.cc
  8. 6
      tests/Token_H_Test.cc

4
src/Diagnostic.cc

@ -17,8 +17,8 @@ clang::Diagnostic::Diagnostic(clang::TranslationUnit& tu, CXDiagnostic& clang_di
clang::SourceRange range(&location, &location); clang::SourceRange range(&location, &location);
clang::Tokens tokens(&tu, &range); clang::Tokens tokens(&tu, &range);
if(tokens.tokens().size()==1) { if(tokens.size()==1) {
auto& token=tokens.tokens()[0]; auto& token=tokens[0];
clang::SourceRange range=token.get_source_range(&tu); clang::SourceRange range=token.get_source_range(&tu);
clang::SourceLocation location(&range, false); clang::SourceLocation location(&range, false);
location.get_location_info(NULL, &line, &column, &offset); location.get_location_info(NULL, &line, &column, &offset);

21
src/Tokens.cc

@ -8,21 +8,17 @@ clang::Tokens::Tokens(clang::TranslationUnit *tu, clang::SourceRange *range): tu
&tokens_, &tokens_,
&num_tokens_); &num_tokens_);
for (int i = 0; i < num_tokens_; i++) { for (int i = 0; i < num_tokens_; i++) {
tks.push_back(clang::Token(tokens_[i])); push_back(clang::Token(tokens_[i]));
} }
} }
clang::Tokens::~Tokens() { clang::Tokens::~Tokens() {
clang_disposeTokens(tu.tu_, tokens_, tks.size()); clang_disposeTokens(tu.tu_, tokens_, size());
} }
std::vector<clang::Token>& clang::Tokens::tokens() { void clang::Tokens::update_types(clang::TranslationUnit *tu) {
return tks; std::vector<CXCursor> clang_cursors(size());
} clang_annotateTokens(tu->tu_, tokens_, size(), clang_cursors.data());
void clang::Tokens::get_token_types(clang::TranslationUnit *tu) {
std::vector<CXCursor> clang_cursors(tks.size());
clang_annotateTokens(tu->tu_, tokens_, tks.size(), clang_cursors.data());
std::vector<clang::Cursor> cursors; std::vector<clang::Cursor> cursors;
for(auto clang_cursor: clang_cursors) { for(auto clang_cursor: clang_cursors) {
@ -30,7 +26,7 @@ void clang::Tokens::get_token_types(clang::TranslationUnit *tu) {
cursors.back().cursor_=clang_cursor; cursors.back().cursor_=clang_cursor;
} }
for(int c=0;c<tks.size();c++) { for(int c=0;c<size();c++) {
auto referenced=clang_getCursorReferenced(clang_cursors[c]); auto referenced=clang_getCursorReferenced(clang_cursors[c]);
if(!clang_Cursor_isNull(referenced)) { if(!clang_Cursor_isNull(referenced)) {
auto type=clang_getCursorType(referenced); auto type=clang_getCursorType(referenced);
@ -38,7 +34,8 @@ void clang::Tokens::get_token_types(clang::TranslationUnit *tu) {
std::string spelling=clang_getCString(cxstr); std::string spelling=clang_getCString(cxstr);
clang_disposeString(cxstr); clang_disposeString(cxstr);
std::string auto_end=""; std::string auto_end="";
if(spelling.size()>=4 && spelling.substr(0, 4)=="auto") { //TODO fix const auto
if((spelling.size()>=4 && spelling.substr(0, 4)=="auto")) {
auto_end=spelling.substr(4); auto_end=spelling.substr(4);
auto type=clang_getCanonicalType(clang_getCursorType(clang_cursors[c])); auto type=clang_getCanonicalType(clang_getCursorType(clang_cursors[c]));
auto cxstr=clang_getTypeSpelling(type); auto cxstr=clang_getTypeSpelling(type);
@ -47,7 +44,7 @@ void clang::Tokens::get_token_types(clang::TranslationUnit *tu) {
if(spelling.find(" ")==std::string::npos) if(spelling.find(" ")==std::string::npos)
spelling+=auto_end; spelling+=auto_end;
} }
tks[c].type=spelling; (*this)[c].type=spelling;
//std::cout << clang_getCString(clang_getTypeSpelling(type)) << ": " << type.kind << endl; //std::cout << clang_getCString(clang_getTypeSpelling(type)) << ": " << type.kind << endl;
////auto cursor=clang_getTypeDeclaration(type); ////auto cursor=clang_getTypeDeclaration(type);
////tks[c].type=clang_getCString(clang_getCursorSpelling(cursor)); ////tks[c].type=clang_getCString(clang_getCursorSpelling(cursor));

6
src/Tokens.h

@ -5,14 +5,12 @@
#include "Token.h" #include "Token.h"
namespace clang { namespace clang {
class Tokens { class Tokens : public std::vector<clang::Token> {
public: public:
Tokens(TranslationUnit *tu, SourceRange *range); Tokens(TranslationUnit *tu, SourceRange *range);
~Tokens(); ~Tokens();
std::vector<Token>& tokens(); void update_types(clang::TranslationUnit *tu);
void get_token_types(clang::TranslationUnit *tu);
private: private:
std::vector<clang::Token> tks;
CXToken *tokens_; CXToken *tokens_;
unsigned num_tokens_; unsigned num_tokens_;
TranslationUnit& tu; TranslationUnit& tu;

5
src/TranslationUnit.cc

@ -90,12 +90,11 @@ unsigned clang::TranslationUnit::DefaultFlags() {
return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete;
} }
std::vector<clang::Diagnostic> clang::TranslationUnit::get_diagnostics() { void clang::TranslationUnit::update_diagnostics() {
std::vector<clang::Diagnostic> diagnostics; diagnostics.clear();
for(unsigned c=0;c<clang_getNumDiagnostics(tu_);c++) { for(unsigned c=0;c<clang_getNumDiagnostics(tu_);c++) {
CXDiagnostic clang_diagnostic=clang_getDiagnostic(tu_, c); CXDiagnostic clang_diagnostic=clang_getDiagnostic(tu_, c);
diagnostics.emplace_back(clang::Diagnostic(*this, clang_diagnostic)); diagnostics.emplace_back(clang::Diagnostic(*this, clang_diagnostic));
clang_disposeDiagnostic(clang_diagnostic); clang_disposeDiagnostic(clang_diagnostic);
} }
return diagnostics;
} }

3
src/TranslationUnit.h

@ -36,8 +36,9 @@ namespace clang {
&buffers, &buffers,
unsigned flags=DefaultFlags()); unsigned flags=DefaultFlags());
static unsigned DefaultFlags(); static unsigned DefaultFlags();
std::vector<clang::Diagnostic> get_diagnostics(); void update_diagnostics();
std::vector<clang::Diagnostic> diagnostics;
private: private:
friend Token; friend Token;
friend Tokens; friend Tokens;

18
tests/Diagnostics_Test.cc

@ -20,13 +20,13 @@ BOOST_AUTO_TEST_CASE(diagnostics_test) {
std::vector<std::string> args; std::vector<std::string> args;
clang::TranslationUnit tu(&index, path, args, map_buffers); clang::TranslationUnit tu(&index, path, args, map_buffers);
auto diagnostics=tu.get_diagnostics(); tu.update_diagnostics();
BOOST_CHECK(diagnostics.size()==1); BOOST_CHECK(tu.diagnostics.size()==1);
BOOST_CHECK(diagnostics[0].spelling=="use of undeclared identifier 'undeclared_variable'"); BOOST_CHECK(tu.diagnostics[0].spelling=="use of undeclared identifier 'undeclared_variable'");
BOOST_CHECK(diagnostics[0].path=="./case/main_error.cpp"); BOOST_CHECK(tu.diagnostics[0].path=="./case/main_error.cpp");
BOOST_CHECK(diagnostics[0].severity==3); BOOST_CHECK(tu.diagnostics[0].severity==3);
BOOST_CHECK(diagnostics[0].start_location.line==5); BOOST_CHECK(tu.diagnostics[0].start_location.line==5);
BOOST_CHECK(diagnostics[0].end_location.line==5); BOOST_CHECK(tu.diagnostics[0].end_location.line==5);
BOOST_CHECK(diagnostics[0].start_location.column==16); BOOST_CHECK(tu.diagnostics[0].start_location.column==16);
BOOST_CHECK(diagnostics[0].end_location.column==35); BOOST_CHECK(tu.diagnostics[0].end_location.column==35);
} }

2
tests/SourceLocation_H_Test.cc

@ -13,7 +13,7 @@ BOOST_AUTO_TEST_CASE(source_location) {
clang::SourceRange range(&start, &end); clang::SourceRange range(&start, &end);
clang::Tokens tokens(&tu, &range); clang::Tokens tokens(&tu, &range);
clang::SourceRange token_range = tokens.tokens()[28].get_source_range(&tu); clang::SourceRange token_range = tokens[28].get_source_range(&tu);
unsigned token_start_line, token_start_column, token_start_offset, unsigned token_start_line, token_start_column, token_start_offset,
token_end_line, token_end_column, token_end_offset; token_end_line, token_end_column, token_end_offset;

6
tests/Token_H_Test.cc

@ -15,9 +15,9 @@ BOOST_AUTO_TEST_CASE(token) {
clang::Tokens tokens(&tu, &range); clang::Tokens tokens(&tu, &range);
BOOST_CHECK(tokens.tokens().size() == 32); BOOST_CHECK(tokens.size() == 32);
BOOST_CHECK(tokens.tokens()[1].kind() == clang::TokenKind::Token_Identifier); BOOST_CHECK(tokens[1].kind() == clang::TokenKind::Token_Identifier);
std::string str = tokens.tokens()[28].get_token_spelling(&tu); std::string str = tokens[28].get_token_spelling(&tu);
BOOST_CHECK(str == "return"); BOOST_CHECK(str == "return");
} }

Loading…
Cancel
Save