Browse Source

Simplified Tokens::get_similar_token_offsets, and improved Cursor::get_usr_extended so that constructor, destructor, and class cursors with equal token spelling are now considered similar.

merge-requests/37/head
eidheim 8 years ago
parent
commit
be11079396
  1. 23
      src/Cursor.cc
  2. 4
      src/Tokens.cc
  3. 2
      src/Tokens.h

23
src/Cursor.cc

@ -46,16 +46,31 @@ std::string clangmm::Cursor::get_usr_extended() const {
if(!is_valid_kind()) if(!is_valid_kind())
return std::string(); return std::string();
const auto token_spelling=[](const std::string &spelling) -> std::string { const auto token_spelling=[](const std::string &spelling_) -> std::string {
std::string spelling;
if(!spelling_.empty() && spelling_[0]=='~')
spelling=spelling_.substr(1);
else
spelling=spelling_;
for(size_t i=0;i<spelling.size();++i) { for(size_t i=0;i<spelling.size();++i) {
if(spelling[i]=='<' || spelling[i]=='(') if(spelling[i]=='<' || spelling[i]=='(')
return spelling.substr(0, i); return spelling.substr(0, i);
} }
return spelling; return spelling;
}; };
std::string usr=token_spelling(get_spelling());
auto cursor=get_semantic_parent(); auto cursor=*this;
Kind kind; auto kind=cursor.get_kind();
// If constructor, destructor or function template, and the token spelling is equal, set cursor to parent
if(kind==clangmm::Cursor::Kind::Constructor || kind==clangmm::Cursor::Kind::Destructor ||
kind==clangmm::Cursor::Kind::FunctionTemplate) {
auto parent=cursor.get_semantic_parent();
if(token_spelling(cursor.get_spelling())==token_spelling(parent.get_spelling()))
cursor=parent;
}
std::string usr=token_spelling(cursor.get_spelling());
cursor=cursor.get_semantic_parent();
while((kind=cursor.get_kind())!=Kind::TranslationUnit && cursor.is_valid_kind()) { while((kind=cursor.get_kind())!=Kind::TranslationUnit && cursor.is_valid_kind()) {
if(kind==Kind::CXXMethod || kind==Kind::FunctionDecl || kind==Kind::FunctionTemplate || if(kind==Kind::CXXMethod || kind==Kind::FunctionDecl || kind==Kind::FunctionTemplate ||
kind==Kind::Constructor || kind==Kind::Destructor) { kind==Kind::Constructor || kind==Kind::Destructor) {

4
src/Tokens.cc

@ -52,13 +52,13 @@ clangmm::Tokens::~Tokens() {
} }
//This works across TranslationUnits. Similar tokens defined as tokens with equal canonical cursors. //This works across TranslationUnits. Similar tokens defined as tokens with equal canonical cursors.
std::vector<std::pair<clangmm::Offset, clangmm::Offset> > clangmm::Tokens::get_similar_token_offsets(Cursor::Kind kind, const std::string &spelling, std::vector<std::pair<clangmm::Offset, clangmm::Offset> > clangmm::Tokens::get_similar_token_offsets(const std::string &spelling,
const std::unordered_set<std::string> &usrs) { const std::unordered_set<std::string> &usrs) {
std::vector<std::pair<Offset, Offset> > offsets; std::vector<std::pair<Offset, Offset> > offsets;
for(auto &token: *this) { for(auto &token: *this) {
if(token.is_identifier()) { if(token.is_identifier()) {
auto referenced=token.get_cursor().get_referenced(); auto referenced=token.get_cursor().get_referenced();
if(referenced && (kind!=Cursor::Kind::CXXMethod || kind==referenced.get_kind()) && spelling==token.get_spelling()) { if(referenced && spelling==token.get_spelling()) {
auto referenced_usrs=referenced.get_all_usr_extended(); auto referenced_usrs=referenced.get_all_usr_extended();
for(auto &usr: referenced_usrs) { for(auto &usr: referenced_usrs) {
if(usrs.count(usr)) { if(usrs.count(usr)) {

2
src/Tokens.h

@ -13,7 +13,7 @@ namespace clangmm {
Tokens(CXTranslationUnit &cx_tu, const SourceRange &range); Tokens(CXTranslationUnit &cx_tu, const SourceRange &range);
public: public:
~Tokens(); ~Tokens();
std::vector<std::pair<clangmm::Offset, clangmm::Offset> > get_similar_token_offsets(Cursor::Kind kind, const std::string &spelling, std::vector<std::pair<clangmm::Offset, clangmm::Offset> > get_similar_token_offsets(const std::string &spelling,
const std::unordered_set<std::string> &usrs); const std::unordered_set<std::string> &usrs);
private: private:
CXToken *cx_tokens; CXToken *cx_tokens;

Loading…
Cancel
Save