Browse Source

Major cleanup. Think I got rid of all the forward declarations. The library is much easier to use now while having the same features.

merge-requests/37/head
eidheim 11 years ago
parent
commit
de4ca52818
  1. 14
      src/CodeCompleteResults.cc
  2. 4
      src/CodeCompleteResults.h
  3. 4
      src/CompilationDatabase.cc
  4. 2
      src/CompilationDatabase.h
  5. 12
      src/CompileCommand.cc
  6. 4
      src/CompileCommand.h
  7. 16
      src/CompileCommands.cc
  8. 4
      src/CompileCommands.h
  9. 14
      src/CompletionString.cc
  10. 4
      src/CompletionString.h
  11. 22
      src/Cursor.cc
  12. 14
      src/Cursor.h
  13. 16
      src/Diagnostic.cc
  14. 2
      src/Diagnostic.h
  15. 2
      src/Index.cc
  16. 2
      src/Index.h
  17. 24
      src/SourceLocation.cc
  18. 22
      src/SourceLocation.h
  19. 18
      src/SourceRange.cc
  20. 16
      src/SourceRange.h
  21. 94
      src/Token.cc
  22. 13
      src/Token.h
  23. 208
      src/Tokens.cc
  24. 18
      src/Tokens.h
  25. 55
      src/TranslationUnit.cc
  26. 25
      src/TranslationUnit.h
  27. 4
      tests/CodeCompleteResults_H_Test.cc
  28. 5
      tests/CompletionString_H_Test.cc
  29. 8
      tests/Cursor_H_Test.cc
  30. 12
      tests/Diagnostics_Test.cc
  31. 28
      tests/SourceLocation_H_Test.cc
  32. 14
      tests/Token_H_Test.cc
  33. 4
      tests/TranslationUnit_Test.cc

14
src/CodeCompleteResults.cc

@ -3,7 +3,7 @@
#include <exception> #include <exception>
clang::CodeCompleteResults:: clang::CodeCompleteResults::
CodeCompleteResults(CXTranslationUnit &tu, CodeCompleteResults(CXTranslationUnit &cx_tu,
const std::string &file_name, const std::string &file_name,
const std::map<std::string, std::string> &buffers, const std::map<std::string, std::string> &buffers,
int line_num, int line_num,
@ -16,24 +16,24 @@ CodeCompleteResults(CXTranslationUnit &tu,
file.Length = buffer.second.size(); file.Length = buffer.second.size();
files.push_back(file); files.push_back(file);
} }
results_ = clang_codeCompleteAt(tu, cx_results = clang_codeCompleteAt(cx_tu,
file_name.c_str(), file_name.c_str(),
line_num, line_num,
column, column,
files.data(), files.data(),
files.size(), files.size(),
clang_defaultCodeCompleteOptions()|CXCodeComplete_IncludeBriefComments); clang_defaultCodeCompleteOptions()|CXCodeComplete_IncludeBriefComments);
clang_sortCodeCompletionResults(results_->Results, results_->NumResults); clang_sortCodeCompletionResults(cx_results->Results, cx_results->NumResults);
} }
clang::CodeCompleteResults::~CodeCompleteResults() { clang::CodeCompleteResults::~CodeCompleteResults() {
delete[] results_->Results; delete[] cx_results->Results;
delete results_; delete cx_results;
} }
int clang::CodeCompleteResults:: int clang::CodeCompleteResults::
size() { size() {
return results_->NumResults; return cx_results->NumResults;
} }
clang::CompletionString clang::CodeCompleteResults:: clang::CompletionString clang::CodeCompleteResults::
@ -41,5 +41,5 @@ get(int i) {
if (i >= size()) { if (i >= size()) {
throw std::invalid_argument("clang::CodeCompleteResults::get(int i): i>=size()"); throw std::invalid_argument("clang::CodeCompleteResults::get(int i): i>=size()");
} }
return CompletionString(results_->Results[i].CompletionString); return CompletionString(cx_results->Results[i].CompletionString);
} }

4
src/CodeCompleteResults.h

@ -7,7 +7,7 @@
namespace clang { namespace clang {
class CodeCompleteResults { class CodeCompleteResults {
public: public:
CodeCompleteResults(CXTranslationUnit &tu, CodeCompleteResults(CXTranslationUnit &cx_tu,
const std::string &file_name, const std::string &file_name,
const std::map<std::string, std::string> &buffers, const std::map<std::string, std::string> &buffers,
int line_num, int line_num,
@ -16,7 +16,7 @@ namespace clang {
CompletionString get(int index); CompletionString get(int index);
int size(); int size();
CXCodeCompleteResults *results_; CXCodeCompleteResults *cx_results;
}; };
} // namespace clang } // namespace clang
#endif // CODECOMPLETERESULTS_H_ #endif // CODECOMPLETERESULTS_H_

4
src/CompilationDatabase.cc

@ -4,7 +4,7 @@
clang::CompilationDatabase:: clang::CompilationDatabase::
CompilationDatabase(const std::string &project_path) { CompilationDatabase(const std::string &project_path) {
CXCompilationDatabase_Error error; CXCompilationDatabase_Error error;
db_ = clang_CompilationDatabase_fromDirectory(project_path.c_str(), &error); cx_db = clang_CompilationDatabase_fromDirectory(project_path.c_str(), &error);
if(error) { if(error) {
//TODO: compile_commands.json is missing, create it? //TODO: compile_commands.json is missing, create it?
} }
@ -12,5 +12,5 @@ CompilationDatabase(const std::string &project_path) {
clang::CompilationDatabase:: clang::CompilationDatabase::
~CompilationDatabase() { ~CompilationDatabase() {
clang_CompilationDatabase_dispose(db_); clang_CompilationDatabase_dispose(cx_db);
} }

2
src/CompilationDatabase.h

@ -12,7 +12,7 @@ namespace clang {
CompilationDatabase(); CompilationDatabase();
~CompilationDatabase(); ~CompilationDatabase();
CXCompilationDatabase db_; CXCompilationDatabase cx_db;
}; };
} }

12
src/CompileCommand.cc

@ -2,26 +2,26 @@
#include "CompileCommands.h" #include "CompileCommands.h"
clang::CompileCommand:: clang::CompileCommand::
CompileCommand(int nth, clang::CompileCommands *commands) { CompileCommand(int nth, clang::CompileCommands &commands) {
command_ = clang_CompileCommands_getCommand(commands->commands_, nth); cx_command = clang_CompileCommands_getCommand(commands.cx_commands, nth);
} }
std::string clang::CompileCommand:: std::string clang::CompileCommand::
get_command() { get_command() {
std::string res; std::string res;
unsigned N = clang_CompileCommand_getNumArgs(command_); unsigned N = clang_CompileCommand_getNumArgs(cx_command);
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
res += clang_getCString(clang_CompileCommand_getArg(command_, i)); res += clang_getCString(clang_CompileCommand_getArg(cx_command, i));
} }
return res; return res;
} }
std::vector<std::string> clang::CompileCommand:: std::vector<std::string> clang::CompileCommand::
get_command_as_args() { get_command_as_args() {
unsigned N = clang_CompileCommand_getNumArgs(command_); unsigned N = clang_CompileCommand_getNumArgs(cx_command);
std::vector<std::string> res(N); std::vector<std::string> res(N);
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
res[i] = clang_getCString(clang_CompileCommand_getArg(command_, i)); res[i] = clang_getCString(clang_CompileCommand_getArg(cx_command, i));
} }
return res; return res;
} }

4
src/CompileCommand.h

@ -6,11 +6,11 @@
namespace clang { namespace clang {
class CompileCommand { class CompileCommand {
public: public:
CompileCommand(int nth, CompileCommands *commands); CompileCommand(int nth, CompileCommands &commands);
std::string get_command(); std::string get_command();
std::vector<std::string> get_command_as_args(); std::vector<std::string> get_command_as_args();
CXCompileCommand command_; CXCompileCommand cx_command;
}; };
} }
#endif // COMPILECOMMAND_H_ #endif // COMPILECOMMAND_H_

16
src/CompileCommands.cc

@ -1,24 +1,24 @@
#include "CompileCommands.h" #include "CompileCommands.h"
clang::CompileCommands:: clang::CompileCommands::
CompileCommands(const std::string &filename, CompilationDatabase *db) { CompileCommands(const std::string &filename, CompilationDatabase &db) {
commands_ = cx_commands =
clang_CompilationDatabase_getCompileCommands(db->db_, filename.c_str()); clang_CompilationDatabase_getCompileCommands(db.cx_db, filename.c_str());
if(clang_CompileCommands_getSize(commands_)==0) if(clang_CompileCommands_getSize(cx_commands)==0)
commands_ = clang_CompilationDatabase_getAllCompileCommands(db->db_); cx_commands = clang_CompilationDatabase_getAllCompileCommands(db.cx_db);
} }
clang::CompileCommands:: clang::CompileCommands::
~CompileCommands() { ~CompileCommands() {
clang_CompileCommands_dispose(commands_); clang_CompileCommands_dispose(cx_commands);
} }
std::vector<clang::CompileCommand> clang::CompileCommands:: std::vector<clang::CompileCommand> clang::CompileCommands::
get_commands() { get_commands() {
unsigned N = clang_CompileCommands_getSize(commands_); unsigned N = clang_CompileCommands_getSize(cx_commands);
std::vector<clang::CompileCommand> res; std::vector<clang::CompileCommand> res;
for (unsigned i = 0; i < N; i++) { for (unsigned i = 0; i < N; i++) {
res.emplace_back(clang::CompileCommand(i, this)); res.emplace_back(clang::CompileCommand(i, *this));
} }
return res; return res;
} }

4
src/CompileCommands.h

@ -9,11 +9,11 @@
namespace clang { namespace clang {
class CompileCommands { class CompileCommands {
public: public:
CompileCommands(const std::string &filename, CompilationDatabase *db); CompileCommands(const std::string &filename, CompilationDatabase &db);
std::vector<CompileCommand> get_commands(); std::vector<CompileCommand> get_commands();
~CompileCommands(); ~CompileCommands();
CXCompileCommands commands_; CXCompileCommands cx_commands;
}; };
} }
#endif // COMPILECOMMANDS_H_ #endif // COMPILECOMMANDS_H_

14
src/CompletionString.cc

@ -1,23 +1,21 @@
#include "CompletionString.h" #include "CompletionString.h"
clang::CompletionString:: clang::CompletionString::
CompletionString(const CXCompletionString &str) { CompletionString(const CXCompletionString &cx_str) : cx_str(cx_str) {}
str_ = str;
}
bool clang::CompletionString::available() { bool clang::CompletionString::available() {
return clang_getCompletionAvailability(str_) == CXAvailability_Available; return clang_getCompletionAvailability(cx_str) == CXAvailability_Available;
} }
int clang::CompletionString::get_num_chunks() { int clang::CompletionString::get_num_chunks() {
return clang_getNumCompletionChunks(str_); return clang_getNumCompletionChunks(cx_str);
} }
std::vector<clang::CompletionChunk> clang::CompletionString::get_chunks() { std::vector<clang::CompletionChunk> clang::CompletionString::get_chunks() {
std::vector<clang::CompletionChunk> res; std::vector<clang::CompletionChunk> res;
for (size_t i = 0; i < get_num_chunks(); i++) { for (size_t i = 0; i < get_num_chunks(); i++) {
auto cxstr=clang_getCompletionChunkText(str_, i); auto cxstr=clang_getCompletionChunkText(cx_str, i);
res.emplace_back(clang_getCString(cxstr), static_cast<CompletionChunkKind> (clang_getCompletionChunkKind(str_, i))); res.emplace_back(clang_getCString(cxstr), static_cast<CompletionChunkKind> (clang_getCompletionChunkKind(cx_str, i)));
clang_disposeString(cxstr); clang_disposeString(cxstr);
} }
return res; return res;
@ -25,7 +23,7 @@ std::vector<clang::CompletionChunk> clang::CompletionString::get_chunks() {
std::string clang::CompletionString::get_brief_comments() { std::string clang::CompletionString::get_brief_comments() {
std::string brief_comments; std::string brief_comments;
auto cxstr=clang_getCompletionBriefComment(str_); auto cxstr=clang_getCompletionBriefComment(cx_str);
if(cxstr.data!=NULL) { if(cxstr.data!=NULL) {
brief_comments=clang_getCString(cxstr); brief_comments=clang_getCString(cxstr);
clang_disposeString(cxstr); clang_disposeString(cxstr);

4
src/CompletionString.h

@ -28,13 +28,13 @@ namespace clang {
class CompletionString { class CompletionString {
public: public:
explicit CompletionString(const CXCompletionString &str); explicit CompletionString(const CXCompletionString &cx_str);
bool available(); bool available();
std::vector<CompletionChunk> get_chunks(); std::vector<CompletionChunk> get_chunks();
std::string get_brief_comments(); std::string get_brief_comments();
int get_num_chunks(); int get_num_chunks();
CXCompletionString str_; CXCompletionString cx_str;
}; };
} // namespace clang } // namespace clang
#endif // COMPLETIONSTRING_H_ #endif // COMPLETIONSTRING_H_

22
src/Cursor.cc

@ -1,10 +1,24 @@
#include "Cursor.h" #include "Cursor.h"
const clang::CursorKind clang::Cursor::kind() { const clang::CursorKind clang::Cursor::get_kind() {
return (CursorKind) clang_getCursorKind(this->cursor_); return (CursorKind) clang_getCursorKind(this->cx_cursor);
} }
clang::Cursor:: clang::Cursor::
Cursor(CXTranslationUnit &tu, clang::SourceLocation *source_location) { Cursor(CXTranslationUnit &cx_tu, clang::SourceLocation &source_location) {
cursor_ = clang_getCursor(tu, source_location->location_); cx_cursor = clang_getCursor(cx_tu, source_location.cx_location);
}
clang::SourceLocation clang::Cursor::get_source_location() const {
return SourceLocation(clang_getCursorLocation(cx_cursor));
}
clang::SourceRange clang::Cursor::get_source_range() const {
return SourceRange(clang_getCursorExtent(cx_cursor));
}
bool clang::Cursor::operator==(const Cursor& rhs) const {
auto lhs_rd=get_source_range().get_range_data();
auto rhs_rd=rhs.get_source_range().get_range_data();
return lhs_rd.path==rhs_rd.path && lhs_rd.start_offset==rhs_rd.start_offset && lhs_rd.end_offset==rhs_rd.end_offset;
} }

14
src/Cursor.h

@ -2,10 +2,9 @@
#define CURSOR_H_ #define CURSOR_H_
#include <clang-c/Index.h> #include <clang-c/Index.h>
#include "SourceLocation.h" #include "SourceLocation.h"
#include "SourceRange.h"
namespace clang { namespace clang {
class SourceLocation;
enum class CursorKind { enum class CursorKind {
UnexposedDecl = 1, UnexposedDecl = 1,
StructDecl = 2, StructDecl = 2,
@ -176,10 +175,13 @@ namespace clang {
class Cursor { class Cursor {
public: public:
Cursor() {} Cursor(CXCursor cx_cursor) : cx_cursor(cx_cursor) {}
Cursor(CXTranslationUnit &tu, SourceLocation *source_location); Cursor(CXTranslationUnit &cx_tu, SourceLocation &source_location);
const CursorKind kind(); const CursorKind get_kind();
CXCursor cursor_; SourceLocation get_source_location() const;
SourceRange get_source_range() const;
bool operator==(const Cursor& rhs) const;
CXCursor cx_cursor;
}; };
} // namespace clang } // namespace clang
#endif // CURSOR_H_ #endif // CURSOR_H_

16
src/Diagnostic.cc

@ -2,19 +2,19 @@
#include "SourceLocation.h" #include "SourceLocation.h"
#include "Tokens.h" #include "Tokens.h"
clang::Diagnostic::Diagnostic(CXTranslationUnit& tu, CXDiagnostic& clang_diagnostic) { clang::Diagnostic::Diagnostic(CXTranslationUnit& cx_tu, CXDiagnostic& cx_diagnostic) {
severity=clang_getDiagnosticSeverity(clang_diagnostic); severity=clang_getDiagnosticSeverity(cx_diagnostic);
severity_spelling=get_severity_spelling(severity); severity_spelling=get_severity_spelling(severity);
spelling=clang_getCString(clang_getDiagnosticSpelling(clang_diagnostic)); spelling=clang_getCString(clang_getDiagnosticSpelling(cx_diagnostic));
clang::SourceLocation location(clang_getDiagnosticLocation(clang_diagnostic)); clang::SourceLocation location(clang_getDiagnosticLocation(cx_diagnostic));
clang::SourceRange range(&location, &location); clang::SourceRange range(location, location);
clang::Tokens tokens(tu, &range); clang::Tokens tokens(cx_tu, range);
if(tokens.size()==1) { if(tokens.size()==1) {
auto& token=tokens[0]; auto& token=tokens[0];
clang::SourceRange range=token.get_source_range(); clang::SourceRange range=token.get_source_range();
auto end_location=clang::SourceLocation(&range, false); auto locations=range.get_source_locations();
this->range=SourceRange::get_range_data(location, end_location); this->range=SourceRange::get_range_data(location, locations.second);
} }
} }

2
src/Diagnostic.h

@ -8,7 +8,7 @@
namespace clang { namespace clang {
class Diagnostic { class Diagnostic {
public: public:
Diagnostic(CXTranslationUnit& tu, CXDiagnostic& clang_diagnostic); Diagnostic(CXTranslationUnit& cx_tu, CXDiagnostic& cx_diagnostic);
static const std::string get_severity_spelling(unsigned severity); static const std::string get_severity_spelling(unsigned severity);

2
src/Index.cc

@ -2,6 +2,6 @@
clang::Index:: clang::Index::
Index(int excludeDeclarationsFromPCH, int displayDiagnostics) { Index(int excludeDeclarationsFromPCH, int displayDiagnostics) {
index_ = clang_createIndex(excludeDeclarationsFromPCH, cx_index = clang_createIndex(excludeDeclarationsFromPCH,
displayDiagnostics); displayDiagnostics);
} }

2
src/Index.h

@ -6,7 +6,7 @@ namespace clang {
class Index { class Index {
public: public:
Index(int excludeDeclarationsFromPCH, int displayDiagnostics); Index(int excludeDeclarationsFromPCH, int displayDiagnostics);
CXIndex index_; CXIndex cx_index;
}; };
} // namespace clang } // namespace clang
#endif // INDEX_H_ #endif // INDEX_H_

24
src/SourceLocation.cc

@ -10,28 +10,10 @@ SourceLocation(CXTranslationUnit &tu,
int line_offset) { int line_offset) {
CXFile file = clang_getFile(tu, CXFile file = clang_getFile(tu,
filename.c_str()); filename.c_str());
location_ = clang_getLocation(tu, cx_location = clang_getLocation(tu,
file, file,
line_number, line_number,
line_offset); line_offset);
}
clang::SourceLocation::
SourceLocation(Cursor *cursor) {
location_ = clang_getCursorLocation(cursor->cursor_);
}
clang::SourceLocation::
SourceLocation(clang::SourceRange *range, bool start) {
location_ = start ? clang_getRangeStart(range->range_) :
clang_getRangeEnd(range->range_);
}
clang::SourceLocation::
SourceLocation(CXTranslationUnit &tu,
Token *token) {
location_ = clang_getTokenLocation(tu,
token->token_);
} }
clang::SourceLocation:: clang::SourceLocation::
@ -40,7 +22,7 @@ SourceLocation(CXTranslationUnit &tu,
int offset) { int offset) {
CXFile file = clang_getFile(tu, CXFile file = clang_getFile(tu,
filepath.c_str()); filepath.c_str());
location_ = clang_getLocationForOffset(tu, cx_location = clang_getLocationForOffset(tu,
file, file,
offset); offset);
} }
@ -51,7 +33,7 @@ get_location_info(std::string* path,
unsigned *column, unsigned *column,
unsigned *offset) { unsigned *offset) {
CXFile file; CXFile file;
clang_getExpansionLocation(location_, &file, line, column, offset); clang_getExpansionLocation(cx_location, &file, line, column, offset);
if (path != NULL && file!=NULL) { if (path != NULL && file!=NULL) {
path->operator=(((clang_getCString((clang_getFileName(file)))))); path->operator=(((clang_getCString((clang_getFileName(file))))));
} }

22
src/SourceLocation.h

@ -1,41 +1,29 @@
#ifndef SOURCELOCATION_H_ #ifndef SOURCELOCATION_H_
#define SOURCELOCATION_H_ #define SOURCELOCATION_H_
#include <clang-c/Index.h> #include <clang-c/Index.h>
#include "Token.h"
#include "Cursor.h"
#include <string> #include <string>
namespace clang { namespace clang {
class Token;
class SourceRange;
class Cursor;
class SourceLocation { class SourceLocation {
public: public:
SourceLocation(CXTranslationUnit &tu, SourceLocation(CXSourceLocation cx_location) : cx_location(cx_location) {}
SourceLocation(CXTranslationUnit &cx_tu,
const std::string &filename, const std::string &filename,
int line_number, int line_number,
int column); int column);
SourceLocation(CXTranslationUnit &tu,
Token *token);
SourceLocation(SourceRange *range, bool start);
SourceLocation(CXTranslationUnit &tu, SourceLocation(CXTranslationUnit &tu,
const std::string &filepath, const std::string &filepath,
int offset); int offset);
SourceLocation(CXSourceLocation location) {location_=location;} void get_location_info(std::string *path,
explicit SourceLocation(Cursor *cursor);
void get_location_info(std::string* path,
unsigned *line, unsigned *line,
unsigned *column, unsigned *column,
unsigned *offset); unsigned *offset);
CXSourceLocation location_; CXSourceLocation cx_location;
}; };
} // namespace clang } // namespace clang

18
src/SourceRange.cc

@ -1,17 +1,12 @@
#include "SourceRange.h" #include "SourceRange.h"
clang::SourceRange:: clang::SourceRange::
SourceRange(clang::Token *token) { SourceRange(clang::SourceLocation &start, clang::SourceLocation &end) {
range_ = clang_getTokenExtent(token->tu, token->token_); cx_range = clang_getRange(start.cx_location, end.cx_location);
} }
clang::SourceRange:: std::pair<clang::SourceLocation, clang::SourceLocation> clang::SourceRange::get_source_locations() {
SourceRange(clang::SourceLocation *start, clang::SourceLocation *end) { return std::pair<SourceLocation, SourceLocation>(clang_getRangeStart(cx_range), clang_getRangeEnd(cx_range));
range_ = clang_getRange(start->location_, end->location_);
}
clang::SourceRange::SourceRange(Cursor *cursor) {
range_ = clang_getCursorExtent(cursor->cursor_);
} }
clang::RangeData clang::SourceRange::get_range_data(clang::SourceLocation &start, clang::SourceLocation &end) { clang::RangeData clang::SourceRange::get_range_data(clang::SourceLocation &start, clang::SourceLocation &end) {
@ -27,7 +22,6 @@ clang::RangeData clang::SourceRange::get_range_data(clang::SourceLocation &start
} }
clang::RangeData clang::SourceRange::get_range_data() { clang::RangeData clang::SourceRange::get_range_data() {
clang::SourceLocation start(this, true); auto locations=get_source_locations();
clang::SourceLocation end(this, false); return get_range_data(locations.first, locations.second);
return get_range_data(start, end);
} }

16
src/SourceRange.h

@ -1,16 +1,10 @@
#ifndef SOURCERANGE_H_ #ifndef SOURCERANGE_H_
#define SOURCERANGE_H_ #define SOURCERANGE_H_
#include <clang-c/Index.h> #include <clang-c/Index.h>
#include "Token.h"
#include "Cursor.h"
#include "SourceLocation.h" #include "SourceLocation.h"
#include <string> #include <string>
namespace clang { namespace clang {
class Token;
class SourceLocation;
class Cursor;
class RangeData { class RangeData {
public: public:
std::string path; std::string path;
@ -19,14 +13,12 @@ namespace clang {
class SourceRange { class SourceRange {
public: public:
SourceRange() {} SourceRange(CXSourceRange cx_range) : cx_range(cx_range) {}
SourceRange(Token *token); SourceRange(SourceLocation &start, SourceLocation &end);
SourceRange(SourceLocation *start, std::pair<SourceLocation, SourceLocation> get_source_locations();
SourceLocation *end);
explicit SourceRange(Cursor *cursor);
static RangeData get_range_data(SourceLocation &start, SourceLocation &end); static RangeData get_range_data(SourceLocation &start, SourceLocation &end);
RangeData get_range_data(); RangeData get_range_data();
CXSourceRange range_; CXSourceRange cx_range;
}; };
} // namespace clang } // namespace clang
#endif // SOURCERANGE_H_ #endif // SOURCERANGE_H_

94
src/Token.cc

@ -4,27 +4,103 @@
// Token // // Token //
// // // // // // // // // //
// clang::Token instansiates an token
clang::Token::Token(CXTranslationUnit &tu, const CXToken &token) :
tu(tu), token_(token) {
}
// returns gets an source location for this token objekt // returns gets an source location for this token objekt
// based on the translationunit given // based on the translationunit given
clang::SourceLocation clang::Token::get_source_location() { clang::SourceLocation clang::Token::get_source_location() {
return SourceLocation(tu, this); return SourceLocation(clang_getTokenLocation(cx_tu, cx_token));
} }
// returns a sourcerange that covers this token // returns a sourcerange that covers this token
clang::SourceRange clang::Token::get_source_range() { clang::SourceRange clang::Token::get_source_range() {
return SourceRange(this); return SourceRange(clang_getTokenExtent(cx_tu, cx_token));
} }
// returns a string description of this tokens kind // returns a string description of this tokens kind
std::string clang::Token::get_token_spelling() { std::string clang::Token::get_token_spelling() {
CXString s = clang_getTokenSpelling(tu, token_); CXString s = clang_getTokenSpelling(cx_tu, cx_token);
return std::string(clang_getCString(s)); return std::string(clang_getCString(s));
} }
const clang::TokenKind clang::Token::kind() { const clang::TokenKind clang::Token::kind() {
return (TokenKind) clang_getTokenKind(token_); return (TokenKind) clang_getTokenKind(cx_token);
}
bool clang::Token::has_type() {
return !clang_Cursor_isNull(clang_getCursorReferenced(cx_cursor));
}
std::string clang::Token::get_type() {
std::string spelling;
auto referenced=clang_getCursorReferenced(cx_cursor);
if(!clang_Cursor_isNull(referenced)) {
auto type=clang_getCursorType(referenced);
auto cxstr=clang_getTypeSpelling(type);
spelling=clang_getCString(cxstr);
clang_disposeString(cxstr);
std::string auto_end="";
//TODO fix const auto
if((spelling.size()>=4 && spelling.substr(0, 4)=="auto")) {
auto_end=spelling.substr(4);
auto type=clang_getCanonicalType(clang_getCursorType(cx_cursor));
auto cxstr=clang_getTypeSpelling(type);
spelling=clang_getCString(cxstr);
clang_disposeString(cxstr);
if(spelling.find(" ")==std::string::npos)
spelling+=auto_end;
}
}
return spelling;
}
std::string clang::Token::get_brief_comments() {
std::string comment_string;
auto referenced=clang_getCursorReferenced(cx_cursor);
auto comment=clang_Cursor_getParsedComment(referenced);
if(clang_Comment_getKind(comment)==CXComment_FullComment) {
size_t para_c=0;
for(unsigned c=0;c<clang_Comment_getNumChildren(comment);c++) {
auto child_comment=clang_Comment_getChild(comment, c);
if(clang_Comment_getKind(child_comment)==CXComment_Paragraph) {
para_c++;
if(para_c>=2)
break;
for(unsigned c=0;c<clang_Comment_getNumChildren(child_comment);c++) {
auto grandchild_comment=clang_Comment_getChild(child_comment, c);
if(clang_Comment_getKind(grandchild_comment)==CXComment_Text) {
auto cxstr=clang_TextComment_getText(grandchild_comment);
comment_string+=clang_getCString(cxstr);
comment_string+="\n";
clang_disposeString(cxstr);
size_t dot_position=comment_string.find(".");
if(dot_position!=std::string::npos)
return comment_string.substr(0, dot_position);
}
if(clang_Comment_getKind(grandchild_comment)==CXComment_InlineCommand) {
auto cxstr=clang_InlineCommandComment_getCommandName(grandchild_comment);
if(comment_string.size()>0)
comment_string.pop_back();
if(clang_InlineCommandComment_getNumArgs(grandchild_comment)==0)
comment_string+=clang_getCString(cxstr);
clang_disposeString(cxstr);
for(unsigned arg_c=0;arg_c<clang_InlineCommandComment_getNumArgs(grandchild_comment);arg_c++) {
auto cxstr=clang_InlineCommandComment_getArgText(grandchild_comment, arg_c);
if(cxstr.data!=NULL) {
if(arg_c>0)
comment_string+=" ";
comment_string+=clang_getCString(cxstr);
clang_disposeString(cxstr);
}
}
}
}
}
/*cout << " " << clang_Comment_getKind(child_comment) << ", children: " << clang_Comment_getNumChildren(child_comment) << endl;
auto cxstr=clang_FullComment_getAsHTML(child_comment);
cout << " " << clang_getCString(cxstr) << endl;
clang_disposeString(cxstr);*/
}
while(comment_string.size()>0 && (comment_string.back()=='\n' || comment_string.back()==' '))
comment_string.pop_back();
}
return comment_string;
} }

13
src/Token.h

@ -3,6 +3,7 @@
#include <clang-c/Index.h> #include <clang-c/Index.h>
#include "SourceLocation.h" #include "SourceLocation.h"
#include "SourceRange.h" #include "SourceRange.h"
#include "Cursor.h"
#include <string> #include <string>
namespace clang { namespace clang {
@ -19,14 +20,18 @@ namespace clang {
class Token { class Token {
public: public:
explicit Token(CXTranslationUnit &tu, const CXToken &token); explicit Token(CXTranslationUnit &cx_tu, CXToken &cx_token, CXCursor &cx_cursor): cx_tu(cx_tu), cx_token(cx_token), cx_cursor(cx_cursor) {};
const TokenKind kind(); const TokenKind kind();
std::string get_token_spelling(); std::string get_token_spelling();
SourceLocation get_source_location(); SourceLocation get_source_location();
SourceRange get_source_range(); SourceRange get_source_range();
std::string type; clang::Cursor get_cursor() {return clang::Cursor(cx_cursor);}
const CXToken& token_; bool has_type();
CXTranslationUnit &tu; std::string get_type();
std::string get_brief_comments();
CXTranslationUnit &cx_tu;
CXToken& cx_token;
CXCursor& cx_cursor;
}; };
} // namespace clang } // namespace clang
#endif // TOKEN_H_ #endif // TOKEN_H_

208
src/Tokens.cc

@ -2,98 +2,34 @@
#include <iostream> #include <iostream>
using namespace std; using namespace std;
clang::Tokens::Tokens(CXTranslationUnit &tu, clang::SourceRange *range): tu(tu) { clang::Tokens::Tokens(CXTranslationUnit &cx_tu, SourceRange &range): cx_tu(cx_tu) {
clang_tokenize(tu,
range->range_, clang_tokenize(cx_tu, range.cx_range, &cx_tokens, &num_tokens);
&tokens_, cx_cursors.clear();
&num_tokens_); cx_cursors.reserve(num_tokens);
for (int i = 0; i < num_tokens_; i++) { clang_annotateTokens(cx_tu, cx_tokens, num_tokens, cx_cursors.data());
emplace_back(tu, tokens_[i]); for (int i = 0; i < num_tokens; i++) {
emplace_back(cx_tu, cx_tokens[i], cx_cursors[i]);
} }
} }
clang::Tokens::~Tokens() { clang::Tokens::~Tokens() {
clang_disposeTokens(tu, tokens_, size()); clang_disposeTokens(cx_tu, cx_tokens, size());
} }
void clang::Tokens::update_types() { /*CXCursor clang::Tokens::find_referenced() {
clang_cursors.clear(); cursors.clear();
clang_cursors.reserve(size()); cursors.reserve(size());
clang_annotateTokens(tu, tokens_, size(), clang_cursors.data()); clang_annotateTokens(tu, tokens.data(), size(), cursors.data());
for(size_t c=0;c<size();c++) { auto kind=clang_getCursorKind(cursors[0]);
auto referenced=clang_getCursorReferenced(clang_cursors[c]);
if(!clang_Cursor_isNull(referenced)) {
auto type=clang_getCursorType(referenced);
auto cxstr=clang_getTypeSpelling(type);
std::string spelling=clang_getCString(cxstr);
clang_disposeString(cxstr);
std::string auto_end="";
//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);
spelling=clang_getCString(cxstr);
clang_disposeString(cxstr);
if(spelling.find(" ")==std::string::npos)
spelling+=auto_end;
}
(*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));
////auto type=clang_getCursorType(referenced);
}
//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;
}
}*/
}
}
CXCursor clang::Tokens::find_referenced() {
clang_cursors.clear();
clang_cursors.reserve(size());
clang_annotateTokens(tu, tokens_, size(), clang_cursors.data());
auto kind=clang_getCursorKind(clang_cursors[0]);
cout << " " << kind << endl; cout << " " << kind << endl;
cout << " Decl: " << clang_isDeclaration(kind) << endl; cout << " Decl: " << clang_isDeclaration(kind) << endl;
cout << " Attr: " << clang_isAttribute(kind) << endl; cout << " Attr: " << clang_isAttribute(kind) << endl;
cout << " Ref: " << clang_isReference(kind) << endl; cout << " Ref: " << clang_isReference(kind) << endl;
cout << " Expr: " << clang_isExpression(kind) << endl; cout << " Expr: " << clang_isExpression(kind) << endl;
auto referenced=clang_getCursorReferenced(clang_cursors[0]); auto referenced=clang_getCursorReferenced(cursors[0]);
kind=clang_getCursorKind(referenced); kind=clang_getCursorKind(referenced);
cout << " " << kind << endl; cout << " " << kind << endl;
@ -109,59 +45,31 @@ CXCursor clang::Tokens::find_referenced() {
cout << " " << clang_getCString(clang_getCursorSpelling(referenced)) << endl; cout << " " << clang_getCString(clang_getCursorSpelling(referenced)) << endl;
return referenced; return referenced;
} }*/
bool clang::Tokens::equalCursors(CXCursor a, CXCursor b) {
clang::Cursor cursor_a;
cursor_a.cursor_=a;
auto range=clang::SourceRange(&cursor_a);
auto location=clang::SourceLocation(&range, true);
std::string path_a;
unsigned offset_start_a, offset_end_a;
location.get_location_info(&path_a, NULL, NULL, &offset_start_a);
location=clang::SourceLocation(&range, false);
location.get_location_info(NULL, NULL, NULL, &offset_end_a);
clang::Cursor cursor_b;
cursor_b.cursor_=b;
range=clang::SourceRange(&cursor_b);
location=clang::SourceLocation(&range, true);
std::string path_b;
unsigned offset_start_b, offset_end_b;
location.get_location_info(&path_b, NULL, NULL, &offset_start_b);
location=clang::SourceLocation(&range, false);
location.get_location_info(NULL, NULL, NULL, &offset_end_b);
return path_a==path_b && offset_start_a==offset_start_b && offset_end_a==offset_end_b;
}
void clang::Tokens::rename(CXCursor& referenced, std::unordered_map<std::string, std::unordered_multimap<unsigned, unsigned> > &ranges) { void clang::Tokens::rename(CXCursor &referenced) {
for(size_t c=0;c<size();c++) { for(size_t c=0;c<size();c++) {
auto a_referenced=clang_getCursorReferenced(clang_cursors[c]); auto a_referenced=clang_getCursorReferenced(cx_cursors[c]);
if(equalCursors(a_referenced, referenced)) { if(Cursor(a_referenced)==Cursor(referenced)) {
std::string path; std::string path;
unsigned line, column, offset; unsigned line, column, offset;
clang::Cursor cursor; clang::Cursor cursor(cx_cursors[c]);
cursor.cursor_=clang_cursors[c]; auto range=cursor.get_source_range();
auto range=clang::SourceRange(&cursor); auto locations=range.get_source_locations();
auto location=clang::SourceLocation(&range, true); locations.first.get_location_info(&path, &line, &column, &offset);
location.get_location_info(&path, &line, &column, &offset);
cout << " start: " << path << ", " << line << ", " << column << endl; cout << " start: " << path << ", " << line << ", " << column << endl;
location=clang::SourceLocation(&range, false); locations.second.get_location_info(&path, &line, &column, &offset);
location.get_location_info(&path, &line, &column, &offset);
cout << " end: " << path << ", " << line << ", " << column << endl; cout << " end: " << path << ", " << line << ", " << column << endl;
clang::Cursor referenced_cursor; clang::Cursor referenced_cursor(a_referenced);
referenced_cursor.cursor_=a_referenced; range=referenced_cursor.get_source_range();
range=clang::SourceRange(&referenced_cursor); locations=range.get_source_locations();
location=clang::SourceLocation(&range, true); locations.first.get_location_info(&path, &line, &column, &offset);
location.get_location_info(&path, &line, &column, &offset);
cout << " start: " << path << ", " << line << ", " << column << endl; cout << " start: " << path << ", " << line << ", " << column << endl;
location=clang::SourceLocation(&range, false); locations.second.get_location_info(&path, &line, &column, &offset);
location.get_location_info(&path, &line, &column, &offset);
cout << " end: " << path << ", " << line << ", " << column << endl; cout << " end: " << path << ", " << line << ", " << column << endl;
auto type=clang_getCursorType(a_referenced); auto type=clang_getCursorType(a_referenced);
@ -180,70 +88,16 @@ void clang::Tokens::rename(CXCursor& referenced, std::unordered_map<std::string,
a_cursor.cursor_=cursor; a_cursor.cursor_=cursor;
auto range=clang::SourceRange(&a_cursor); auto range=clang::SourceRange(&a_cursor);
auto location=clang::SourceLocation(&range, true); auto location=clang::SourceLocation(range, true);
std::string path; std::string path;
unsigned line, column, offset; unsigned line, column, offset;
location.get_location_info(&path, &line, &column, &offset); location.get_location_info(&path, &line, &column, &offset);
cout << " start: " << path << ", " << line << ", " << column << endl; cout << " start: " << path << ", " << line << ", " << column << endl;
location=clang::SourceLocation(&range, false); location=clang::SourceLocation(range, false);
location.get_location_info(&path, &line, &column, &offset); location.get_location_info(&path, &line, &column, &offset);
cout << " end: " << path << ", " << line << ", " << column << endl; cout << " end: " << path << ", " << line << ", " << column << endl;
} }
return CXChildVisit_Recurse; return CXChildVisit_Recurse;
}*/ }*/
std::string clang::Tokens::get_brief_comments(size_t cursor_id) {
std::string comment_string;
auto referenced=clang_getCursorReferenced(clang_cursors[cursor_id]);
auto comment=clang_Cursor_getParsedComment(referenced);
if(clang_Comment_getKind(comment)==CXComment_FullComment) {
size_t para_c=0;
for(unsigned c=0;c<clang_Comment_getNumChildren(comment);c++) {
auto child_comment=clang_Comment_getChild(comment, c);
if(clang_Comment_getKind(child_comment)==CXComment_Paragraph) {
para_c++;
if(para_c>=2)
break;
for(unsigned c=0;c<clang_Comment_getNumChildren(child_comment);c++) {
auto grandchild_comment=clang_Comment_getChild(child_comment, c);
if(clang_Comment_getKind(grandchild_comment)==CXComment_Text) {
auto cxstr=clang_TextComment_getText(grandchild_comment);
comment_string+=clang_getCString(cxstr);
comment_string+="\n";
clang_disposeString(cxstr);
size_t dot_position=comment_string.find(".");
if(dot_position!=std::string::npos)
return comment_string.substr(0, dot_position);
}
if(clang_Comment_getKind(grandchild_comment)==CXComment_InlineCommand) {
auto cxstr=clang_InlineCommandComment_getCommandName(grandchild_comment);
if(comment_string.size()>0)
comment_string.pop_back();
if(clang_InlineCommandComment_getNumArgs(grandchild_comment)==0)
comment_string+=clang_getCString(cxstr);
clang_disposeString(cxstr);
for(unsigned arg_c=0;arg_c<clang_InlineCommandComment_getNumArgs(grandchild_comment);arg_c++) {
auto cxstr=clang_InlineCommandComment_getArgText(grandchild_comment, arg_c);
if(cxstr.data!=NULL) {
if(arg_c>0)
comment_string+=" ";
comment_string+=clang_getCString(cxstr);
clang_disposeString(cxstr);
}
}
}
}
}
/*cout << " " << clang_Comment_getKind(child_comment) << ", children: " << clang_Comment_getNumChildren(child_comment) << endl;
auto cxstr=clang_FullComment_getAsHTML(child_comment);
cout << " " << clang_getCString(cxstr) << endl;
clang_disposeString(cxstr);*/
}
while(comment_string.size()>0 && (comment_string.back()=='\n' || comment_string.back()==' '))
comment_string.pop_back();
}
return comment_string;
}

18
src/Tokens.h

@ -9,19 +9,15 @@
namespace clang { namespace clang {
class Tokens : public std::vector<clang::Token> { class Tokens : public std::vector<clang::Token> {
public: public:
Tokens(CXTranslationUnit &tu, SourceRange *range); Tokens(CXTranslationUnit &cx_tu, SourceRange &range);
~Tokens(); ~Tokens();
void update_types(); void rename(CXCursor &referenced);
std::string get_brief_comments(size_t cursor_id); //std::unordered_map<std::string, std::unordered_multimap<unsigned, unsigned> >
CXCursor find_referenced();
bool equalCursors(CXCursor a, CXCursor b);
void rename(CXCursor &referenced, std::unordered_map<std::string, std::unordered_multimap<unsigned, unsigned> > &ranges);
private: private:
CXToken *tokens_; CXToken *cx_tokens;
unsigned num_tokens_; unsigned num_tokens;
std::vector<CXCursor> clang_cursors; std::vector<CXCursor> cx_cursors;
CXTranslationUnit& tu; CXTranslationUnit& cx_tu;
}; };
} // namespace clang } // namespace clang
#endif // TOKENS_H_ #endif // TOKENS_H_

55
src/TranslationUnit.cc

@ -6,17 +6,11 @@
clang::TranslationUnit:: clang::TranslationUnit::
~TranslationUnit() { ~TranslationUnit() {
clang_disposeTranslationUnit(tu_); clang_disposeTranslationUnit(cx_tu);
}
clang::TranslationUnit& clang::TranslationUnit::
operator=(const clang::TranslationUnit &tu) {
tu_ = tu.tu_;
return *this;
} }
clang::TranslationUnit:: clang::TranslationUnit::
TranslationUnit(Index *index, TranslationUnit(Index &index,
const std::string &filepath, const std::string &filepath,
const std::vector<std::string> &command_line_args) { const std::vector<std::string> &command_line_args) {
std::map<std::string, std::string> buffers; std::map<std::string, std::string> buffers;
@ -28,7 +22,7 @@ TranslationUnit(Index *index,
} }
clang::TranslationUnit:: clang::TranslationUnit::
TranslationUnit(Index *index, TranslationUnit(Index &index,
const std::string &filepath) { const std::string &filepath) {
std::vector<std::string> command_line_args; std::vector<std::string> command_line_args;
std::map<std::string, std::string> buffers; std::map<std::string, std::string> buffers;
@ -40,7 +34,7 @@ TranslationUnit(Index *index,
} }
clang::TranslationUnit:: clang::TranslationUnit::
TranslationUnit(clang::Index *index, TranslationUnit(clang::Index &index,
const std::string &filepath, const std::string &filepath,
const std::vector<std::string> &command_line_args, const std::vector<std::string> &command_line_args,
const std::map<std::string, std::string> &buffers, const std::map<std::string, std::string> &buffers,
@ -48,7 +42,7 @@ TranslationUnit(clang::Index *index,
parse(index, filepath, command_line_args, buffers, flags); parse(index, filepath, command_line_args, buffers, flags);
} }
void clang::TranslationUnit::parse(Index *index, void clang::TranslationUnit::parse(Index &index,
const std::string &filepath, const std::string &filepath,
const std::vector<std::string> &command_line_args, const std::vector<std::string> &command_line_args,
const std::map<std::string, std::string> &buffers, const std::map<std::string, std::string> &buffers,
@ -65,8 +59,8 @@ void clang::TranslationUnit::parse(Index *index,
for(auto &a: command_line_args) { for(auto &a: command_line_args) {
args.push_back(a.c_str()); args.push_back(a.c_str());
} }
tu_ = cx_tu =
clang_parseTranslationUnit(index->index_, clang_parseTranslationUnit(index.cx_index,
filepath.c_str(), filepath.c_str(),
args.data(), args.data(),
args.size(), args.size(),
@ -76,8 +70,7 @@ void clang::TranslationUnit::parse(Index *index,
} }
int clang::TranslationUnit:: int clang::TranslationUnit::
ReparseTranslationUnit(const std::string &file_path, ReparseTranslationUnit(const std::map<std::string, std::string> &buffers,
const std::map<std::string, std::string> &buffers,
unsigned flags) { unsigned flags) {
std::vector<CXUnsavedFile> files; std::vector<CXUnsavedFile> files;
for (auto &buffer : buffers) { for (auto &buffer : buffers) {
@ -87,7 +80,7 @@ ReparseTranslationUnit(const std::string &file_path,
file.Length = buffer.second.size(); file.Length = buffer.second.size();
files.push_back(file); files.push_back(file);
} }
return clang_reparseTranslationUnit(tu_, return clang_reparseTranslationUnit(cx_tu,
files.size(), files.size(),
files.data(), files.data(),
flags); flags);
@ -97,11 +90,31 @@ unsigned clang::TranslationUnit::DefaultFlags() {
return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete | CXTranslationUnit_IncludeBriefCommentsInCodeCompletion; return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete | CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
} }
void clang::TranslationUnit::update_diagnostics() { clang::CodeCompleteResults clang::TranslationUnit::get_code_completions(const std::map<std::string, std::string> &buffers, int line_number, int column) {
diagnostics.clear(); auto cxstr=clang_getTranslationUnitSpelling(cx_tu);
for(unsigned c=0;c<clang_getNumDiagnostics(tu_);c++) { std::string path=clang_getCString(cxstr);
CXDiagnostic clang_diagnostic=clang_getDiagnostic(tu_, c); clang_disposeString(cxstr);
diagnostics.emplace_back(clang::Diagnostic(tu_, clang_diagnostic));
clang::CodeCompleteResults results(cx_tu, path, buffers, line_number, column);
return results;
}
std::vector<clang::Diagnostic> clang::TranslationUnit::get_diagnostics() {
std::vector<clang::Diagnostic> diagnostics;
for(unsigned c=0;c<clang_getNumDiagnostics(cx_tu);c++) {
CXDiagnostic clang_diagnostic=clang_getDiagnostic(cx_tu, c);
diagnostics.emplace_back(clang::Diagnostic(cx_tu, clang_diagnostic));
clang_disposeDiagnostic(clang_diagnostic); clang_disposeDiagnostic(clang_diagnostic);
} }
return diagnostics;
}
std::unique_ptr<clang::Tokens> clang::TranslationUnit::get_tokens(unsigned start_offset, unsigned end_offset) {
auto cxstr=clang_getTranslationUnitSpelling(cx_tu);
std::string path=clang_getCString(cxstr);
clang_disposeString(cxstr);
clang::SourceLocation start_location(cx_tu, path, start_offset);
clang::SourceLocation end_location(cx_tu, path, end_offset);
clang::SourceRange range(start_location, end_location);
return std::unique_ptr<Tokens>(new Tokens(cx_tu, range));
} }

25
src/TranslationUnit.h

@ -7,37 +7,38 @@
#include <memory> #include <memory>
#include "Index.h" #include "Index.h"
#include "Diagnostic.h" #include "Diagnostic.h"
#include "Tokens.h"
#include "CodeCompleteResults.h"
namespace clang { namespace clang {
class TranslationUnit { class TranslationUnit {
public: public:
TranslationUnit(Index *index, TranslationUnit(Index &index,
const std::string &filepath, const std::string &filepath,
const std::vector<std::string> &command_line_args); const std::vector<std::string> &command_line_args);
TranslationUnit(Index *index, TranslationUnit(Index &index,
const std::string &filepath, const std::string &filepath,
const std::vector<std::string> &command_line_args, const std::vector<std::string> &command_line_args,
const std::map<std::string, std::string> &buffers, const std::map<std::string, std::string> &buffers,
unsigned flags=DefaultFlags()); unsigned flags=DefaultFlags());
TranslationUnit(Index *index, TranslationUnit(Index &index,
const std::string &filepath); const std::string &filepath);
~TranslationUnit(); ~TranslationUnit();
TranslationUnit& operator=(const TranslationUnit &tu); int ReparseTranslationUnit(const std::map<std::string, std::string> &buffers,
int ReparseTranslationUnit(const std::string &file_path,
const std::map<std::string, std::string>
&buffers,
unsigned flags=DefaultFlags()); unsigned flags=DefaultFlags());
static unsigned DefaultFlags(); static unsigned DefaultFlags();
void update_diagnostics();
std::vector<clang::Diagnostic> diagnostics; void parse(Index &index,
void parse(Index *index,
const std::string &filepath, const std::string &filepath,
const std::vector<std::string> &command_line_args, const std::vector<std::string> &command_line_args,
const std::map<std::string, std::string> &buffers, const std::map<std::string, std::string> &buffers,
unsigned flags=DefaultFlags()); unsigned flags=DefaultFlags());
CXTranslationUnit tu_;
clang::CodeCompleteResults get_code_completions(const std::map<std::string, std::string> &buffers, int line_number, int column);
std::vector<clang::Diagnostic> get_diagnostics();
std::unique_ptr<Tokens> get_tokens(unsigned start_offset, unsigned end_offset);
CXTranslationUnit cx_tu;
}; };
} // namespace clang } // namespace clang
#endif // TRANSLATIONUNIT_H_ #endif // TRANSLATIONUNIT_H_

4
tests/CodeCompleteResults_H_Test.cc

@ -9,7 +9,7 @@ BOOST_AUTO_TEST_CASE(code_complete_results) {
std::string path("./case/main.cpp"); std::string path("./case/main.cpp");
clang::Index index(0, 0); clang::Index index(0, 0);
clang::TranslationUnit tu(&index, path); clang::TranslationUnit tu(index, path);
// ReparseTranslationUnit takes a map with filepath as key // ReparseTranslationUnit takes a map with filepath as key
// and buffer as value // and buffer as value
@ -28,7 +28,7 @@ BOOST_AUTO_TEST_CASE(code_complete_results) {
// ] // ]
clang::CodeCompleteResults results(tu.tu_, path, buffers, 4, 5); auto results=tu.get_code_completions(buffers, 4, 5);
bool substr_found=false; bool substr_found=false;
for(int c=0;c<results.size();c++) { for(int c=0;c<results.size();c++) {

5
tests/CompletionString_H_Test.cc

@ -16,7 +16,7 @@ BOOST_AUTO_TEST_CASE(completion_string) {
std::string path("./case/main.cpp"); std::string path("./case/main.cpp");
clang::Index index(0, 0); clang::Index index(0, 0);
clang::TranslationUnit tu(&index, path); clang::TranslationUnit tu(index, path);
// ReparseTranslationUnit takes a map with filepath as key // ReparseTranslationUnit takes a map with filepath as key
// and buffer as value // and buffer as value
@ -33,8 +33,7 @@ BOOST_AUTO_TEST_CASE(completion_string) {
buffers[path] = file; buffers[path] = file;
clang::CodeCompleteResults results(tu.tu_, path, buffers, 4, 5); auto results=tu.get_code_completions(buffers, 4, 5);
// ] // ]
clang::CompletionString str = results.get(0); clang::CompletionString str = results.get(0);

8
tests/Cursor_H_Test.cc

@ -8,12 +8,12 @@ BOOST_AUTO_TEST_CASE(cursor) {
std::string path("./case/main.cpp"); std::string path("./case/main.cpp");
clang::Index index(0, 0); clang::Index index(0, 0);
clang::TranslationUnit tu(&index, path); clang::TranslationUnit tu(index, path);
// ] // ]
clang::SourceLocation location(tu.tu_, path, 6, 4); clang::SourceLocation location(tu.cx_tu, path, 6, 4);
clang::Cursor cursor(tu.tu_, &location); clang::Cursor cursor(tu.cx_tu, location);
BOOST_CHECK(cursor.kind() == clang::CursorKind::ReturnStmt); BOOST_CHECK(cursor.get_kind() == clang::CursorKind::ReturnStmt);
} }

12
tests/Diagnostics_Test.cc

@ -18,11 +18,11 @@ BOOST_AUTO_TEST_CASE(diagnostics_test) {
map_buffers["./case/main_error.cpp"]=ss.str(); map_buffers["./case/main_error.cpp"]=ss.str();
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);
tu.update_diagnostics(); auto diagnostics=tu.get_diagnostics();
BOOST_CHECK(tu.diagnostics.size()==1); BOOST_CHECK(diagnostics.size()==1);
BOOST_CHECK(tu.diagnostics[0].spelling=="use of undeclared identifier 'undeclared_variable'"); BOOST_CHECK(diagnostics[0].spelling=="use of undeclared identifier 'undeclared_variable'");
BOOST_CHECK(tu.diagnostics[0].range.path=="./case/main_error.cpp"); BOOST_CHECK(diagnostics[0].range.path=="./case/main_error.cpp");
BOOST_CHECK(tu.diagnostics[0].severity==3); BOOST_CHECK(diagnostics[0].severity==3);
} }

28
tests/SourceLocation_H_Test.cc

@ -7,30 +7,26 @@ BOOST_AUTO_TEST_CASE(source_location) {
clang::Index index(0, 0); clang::Index index(0, 0);
clang::TranslationUnit tu(&index, path); clang::TranslationUnit tu(index, path);
clang::SourceLocation start(tu.tu_, path, 0); auto tokens=tu.get_tokens(0, 113);
clang::SourceLocation end(tu.tu_, path, 7, 1);
clang::SourceRange range(&start, &end);
clang::Tokens tokens(tu.tu_, &range);
clang::SourceRange token_range = tokens[28].get_source_range(); clang::SourceRange token_range = (*tokens)[28].get_source_range();
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;
std::string token_start_path, token_end_path; std::string token_start_path, token_end_path;
clang::SourceLocation token_start(&token_range, true); auto locations=token_range.get_source_locations();
clang::SourceLocation token_end(&token_range, false);
token_start.get_location_info(&token_start_path, locations.first.get_location_info(&token_start_path,
&token_start_line, &token_start_line,
&token_start_column, &token_start_column,
&token_start_offset); &token_start_offset);
token_end.get_location_info(&token_end_path, locations.second.get_location_info(&token_end_path,
&token_end_line, &token_end_line,
&token_end_column, &token_end_column,
&token_end_offset); &token_end_offset);
BOOST_CHECK(token_start_path == path); BOOST_CHECK(token_start_path == path);
BOOST_CHECK(token_start_line == 6); BOOST_CHECK(token_start_line == 6);

14
tests/Token_H_Test.cc

@ -7,17 +7,13 @@ BOOST_AUTO_TEST_CASE(token) {
clang::Index index(0, 0); clang::Index index(0, 0);
clang::TranslationUnit tu(&index, path); clang::TranslationUnit tu(index, path);
clang::SourceLocation start(tu.tu_, path, 0);
clang::SourceLocation end(tu.tu_, path, 7, 1);
clang::SourceRange range(&start, &end); auto tokens=tu.get_tokens(0, 113);
clang::Tokens tokens(tu.tu_, &range); BOOST_CHECK(tokens->size() == 32);
BOOST_CHECK((*tokens)[1].kind() == clang::TokenKind::Token_Identifier);
BOOST_CHECK(tokens.size() == 32); std::string str = (*tokens)[28].get_token_spelling();
BOOST_CHECK(tokens[1].kind() == clang::TokenKind::Token_Identifier);
std::string str = tokens[28].get_token_spelling();
BOOST_CHECK(str == "return"); BOOST_CHECK(str == "return");
} }

4
tests/TranslationUnit_Test.cc

@ -7,7 +7,7 @@ BOOST_AUTO_TEST_CASE(translation_unit) {
std::string path("./case/main.cpp"); std::string path("./case/main.cpp");
clang::Index index(0, 0); clang::Index index(0, 0);
clang::TranslationUnit tu(&index, path); clang::TranslationUnit tu(index, path);
// ReparseTranslationUnit takes a map with filepath as key // ReparseTranslationUnit takes a map with filepath as key
// and buffer as value // and buffer as value
@ -20,5 +20,5 @@ BOOST_AUTO_TEST_CASE(translation_unit) {
file.append("}"); file.append("}");
buffers[path] = file; buffers[path] = file;
BOOST_CHECK(tu.ReparseTranslationUnit(path, buffers) == 0); BOOST_CHECK(tu.ReparseTranslationUnit(buffers) == 0);
} }

Loading…
Cancel
Save