diff --git a/src/Diagnostic.cc b/src/Diagnostic.cc index 46693d2..5712527 100644 --- a/src/Diagnostic.cc +++ b/src/Diagnostic.cc @@ -17,8 +17,8 @@ clang::Diagnostic::Diagnostic(clang::TranslationUnit& tu, CXDiagnostic& clang_di clang::SourceRange range(&location, &location); clang::Tokens tokens(&tu, &range); - if(tokens.tokens().size()==1) { - auto& token=tokens.tokens()[0]; + if(tokens.size()==1) { + auto& token=tokens[0]; clang::SourceRange range=token.get_source_range(&tu); clang::SourceLocation location(&range, false); location.get_location_info(NULL, &line, &column, &offset); diff --git a/src/Tokens.cc b/src/Tokens.cc index baf70aa..0975a97 100644 --- a/src/Tokens.cc +++ b/src/Tokens.cc @@ -8,21 +8,17 @@ clang::Tokens::Tokens(clang::TranslationUnit *tu, clang::SourceRange *range): tu &tokens_, &num_tokens_); 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_disposeTokens(tu.tu_, tokens_, tks.size()); + clang_disposeTokens(tu.tu_, tokens_, size()); } -std::vector& clang::Tokens::tokens() { - return tks; -} - -void clang::Tokens::get_token_types(clang::TranslationUnit *tu) { - std::vector clang_cursors(tks.size()); - clang_annotateTokens(tu->tu_, tokens_, tks.size(), clang_cursors.data()); +void clang::Tokens::update_types(clang::TranslationUnit *tu) { + std::vector clang_cursors(size()); + clang_annotateTokens(tu->tu_, tokens_, size(), clang_cursors.data()); std::vector 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; } - for(int c=0;c=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 type=clang_getCanonicalType(clang_getCursorType(clang_cursors[c])); auto cxstr=clang_getTypeSpelling(type); @@ -47,7 +44,7 @@ void clang::Tokens::get_token_types(clang::TranslationUnit *tu) { if(spelling.find(" ")==std::string::npos) spelling+=auto_end; } - tks[c].type=spelling; + (*this)[c].type=spelling; //std::cout << clang_getCString(clang_getTypeSpelling(type)) << ": " << type.kind << endl; ////auto cursor=clang_getTypeDeclaration(type); ////tks[c].type=clang_getCString(clang_getCursorSpelling(cursor)); diff --git a/src/Tokens.h b/src/Tokens.h index 2fc3de8..ee3f883 100644 --- a/src/Tokens.h +++ b/src/Tokens.h @@ -5,14 +5,12 @@ #include "Token.h" namespace clang { - class Tokens { + class Tokens : public std::vector { public: Tokens(TranslationUnit *tu, SourceRange *range); ~Tokens(); - std::vector& tokens(); - void get_token_types(clang::TranslationUnit *tu); + void update_types(clang::TranslationUnit *tu); private: - std::vector tks; CXToken *tokens_; unsigned num_tokens_; TranslationUnit& tu; diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index 1587a6c..09a9b67 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -90,12 +90,11 @@ unsigned clang::TranslationUnit::DefaultFlags() { return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; } -std::vector clang::TranslationUnit::get_diagnostics() { - std::vector diagnostics; +void clang::TranslationUnit::update_diagnostics() { + diagnostics.clear(); for(unsigned c=0;c get_diagnostics(); + void update_diagnostics(); + std::vector diagnostics; private: friend Token; friend Tokens; diff --git a/tests/Diagnostics_Test.cc b/tests/Diagnostics_Test.cc index f9e819d..6351552 100644 --- a/tests/Diagnostics_Test.cc +++ b/tests/Diagnostics_Test.cc @@ -20,13 +20,13 @@ BOOST_AUTO_TEST_CASE(diagnostics_test) { std::vector args; clang::TranslationUnit tu(&index, path, args, map_buffers); - auto diagnostics=tu.get_diagnostics(); - BOOST_CHECK(diagnostics.size()==1); - BOOST_CHECK(diagnostics[0].spelling=="use of undeclared identifier 'undeclared_variable'"); - BOOST_CHECK(diagnostics[0].path=="./case/main_error.cpp"); - BOOST_CHECK(diagnostics[0].severity==3); - BOOST_CHECK(diagnostics[0].start_location.line==5); - BOOST_CHECK(diagnostics[0].end_location.line==5); - BOOST_CHECK(diagnostics[0].start_location.column==16); - BOOST_CHECK(diagnostics[0].end_location.column==35); + tu.update_diagnostics(); + BOOST_CHECK(tu.diagnostics.size()==1); + BOOST_CHECK(tu.diagnostics[0].spelling=="use of undeclared identifier 'undeclared_variable'"); + BOOST_CHECK(tu.diagnostics[0].path=="./case/main_error.cpp"); + BOOST_CHECK(tu.diagnostics[0].severity==3); + BOOST_CHECK(tu.diagnostics[0].start_location.line==5); + BOOST_CHECK(tu.diagnostics[0].end_location.line==5); + BOOST_CHECK(tu.diagnostics[0].start_location.column==16); + BOOST_CHECK(tu.diagnostics[0].end_location.column==35); } diff --git a/tests/SourceLocation_H_Test.cc b/tests/SourceLocation_H_Test.cc index 776fcf7..308fe6a 100644 --- a/tests/SourceLocation_H_Test.cc +++ b/tests/SourceLocation_H_Test.cc @@ -13,7 +13,7 @@ BOOST_AUTO_TEST_CASE(source_location) { clang::SourceRange range(&start, &end); 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, token_end_line, token_end_column, token_end_offset; diff --git a/tests/Token_H_Test.cc b/tests/Token_H_Test.cc index 0b166e2..8befb20 100644 --- a/tests/Token_H_Test.cc +++ b/tests/Token_H_Test.cc @@ -15,9 +15,9 @@ BOOST_AUTO_TEST_CASE(token) { clang::Tokens tokens(&tu, &range); - BOOST_CHECK(tokens.tokens().size() == 32); - BOOST_CHECK(tokens.tokens()[1].kind() == clang::TokenKind::Token_Identifier); + BOOST_CHECK(tokens.size() == 32); + 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"); }