diff --git a/libclangmm b/libclangmm index ca2021d..a627c6d 160000 --- a/libclangmm +++ b/libclangmm @@ -1 +1 @@ -Subproject commit ca2021d93599de931ba5219efd36b0ecb930e3b5 +Subproject commit a627c6da5d807862741d7affeca09678cdee5f54 diff --git a/src/source_clang.cc b/src/source_clang.cc index 810dd51..95d9571 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -1064,12 +1064,13 @@ Source::ClangViewRefactor::ClangViewRefactor(const boost::filesystem::path &file if(token.get_kind()==clang::Token::Kind::Identifier && cursor.has_type_description()) { if(line==token.offsets.first.line-1 && index>=token.offsets.first.index-1 && index <=token.offsets.second.index-1) { auto kind=cursor.get_kind(); - if(kind==clang::Cursor::Kind::CXXMethod || kind==clang::Cursor::Kind::Constructor || kind==clang::Cursor::Kind::Destructor) { + if(kind==clang::Cursor::Kind::FunctionDecl || kind==clang::Cursor::Kind::CXXMethod || + kind==clang::Cursor::Kind::Constructor || kind==clang::Cursor::Kind::Destructor) { auto referenced=cursor.get_referenced(); if(referenced && referenced==cursor) { std::string result; std::string specifier; - if(kind==clang::Cursor::Kind::CXXMethod) { + if(kind==clang::Cursor::Kind::FunctionDecl || kind==clang::Cursor::Kind::CXXMethod) { result=cursor.get_type().get_result().get_spelling(); if(!result.empty() && result.back()!='*' && result.back()!='&') @@ -1120,38 +1121,63 @@ Source::ClangViewRefactor::ClangViewRefactor(const boost::filesystem::path &file Info::get().print("Buffer is parsing"); return methods; } - auto cxx_methods=clang_tokens->get_cxx_methods(); - for(auto &method: cxx_methods) { - std::string row=std::to_string(method.second.line)+": "+Glib::Markup::escape_text(method.first); - //Add bold method token - size_t token_end_pos=row.find('('); - if(token_end_pos==0 || token_end_pos==std::string::npos) - continue; - if(token_end_pos>8 && row.substr(token_end_pos-4, 4)==">") { - token_end_pos-=8; - size_t angle_bracket_count=1; - do { - if(row.substr(token_end_pos-4, 4)==">") { - angle_bracket_count++; - token_end_pos-=4; + for(auto &token: *clang_tokens) { + auto cursor=token.get_cursor(); + if(token.get_kind()==clang::Token::Kind::Identifier && cursor.has_type_description()) { + auto kind=cursor.get_kind(); + if(kind==clang::Cursor::Kind::FunctionDecl || kind==clang::Cursor::Kind::CXXMethod || + kind==clang::Cursor::Kind::Constructor || kind==clang::Cursor::Kind::Destructor) { + auto offset=cursor.get_source_location().get_offset(); + std::string method; + if(kind==clang::Cursor::Kind::FunctionDecl || kind==clang::Cursor::Kind::CXXMethod) { + method+=cursor.get_type().get_result().get_spelling(); + auto pos=method.find(" "); + if(pos!=std::string::npos) + method.erase(pos, 1); + method+=" "; } - else if(row.substr(token_end_pos-4, 4)=="<") { - angle_bracket_count--; - token_end_pos-=4; + + std::string parent_str; + auto parent=cursor.get_semantic_parent(); + while(parent && parent.get_kind()!=clang::Cursor::Kind::TranslationUnit) { + parent_str.insert(0, parent.get_display_name()+"::"); + parent=parent.get_semantic_parent(); } - else - token_end_pos--; - } while(angle_bracket_count>0 && token_end_pos>4); + + method+=parent_str+cursor.get_display_name(); + + std::string row=std::to_string(offset.line)+": "+Glib::Markup::escape_text(method); + //Add bold method token + size_t token_end_pos=row.find('('); + if(token_end_pos==0 || token_end_pos==std::string::npos) + continue; + if(token_end_pos>8 && row.substr(token_end_pos-4, 4)==">") { + token_end_pos-=8; + size_t angle_bracket_count=1; + do { + if(row.substr(token_end_pos-4, 4)==">") { + angle_bracket_count++; + token_end_pos-=4; + } + else if(row.substr(token_end_pos-4, 4)=="<") { + angle_bracket_count--; + token_end_pos-=4; + } + else + token_end_pos--; + } while(angle_bracket_count>0 && token_end_pos>4); + } + auto pos=token_end_pos; + do { + pos--; + } while(((row[pos]>='a' && row[pos]<='z') || + (row[pos]>='A' && row[pos]<='Z') || + (row[pos]>='0' && row[pos]<='9') || row[pos]=='_' || row[pos]=='~') && pos>0); + row.insert(token_end_pos, ""); + row.insert(pos+1, ""); + methods.emplace_back(Offset(offset.line-1, offset.index-1), row); + } } - auto pos=token_end_pos; - do { - pos--; - } while(((row[pos]>='a' && row[pos]<='z') || - (row[pos]>='A' && row[pos]<='Z') || - (row[pos]>='0' && row[pos]<='9') || row[pos]=='_' || row[pos]=='~') && pos>0); - row.insert(token_end_pos, ""); - row.insert(pos+1, ""); - methods.emplace_back(Offset(method.second.line-1, method.second.index-1), row); } return methods; };