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.

master
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. 16
      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() {
clang_cursors.clear();
clang_cursors.reserve(size());
clang_annotateTokens(tu, tokens_, size(), clang_cursors.data());
for(size_t c=0;c<size();c++) {
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() { /*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());
auto kind=clang_getCursorKind(clang_cursors[0]); auto kind=clang_getCursorKind(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);
} }

16
tests/SourceLocation_H_Test.cc

@ -7,27 +7,23 @@ 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);

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