|
|
|
@ -5,6 +5,7 @@ |
|
|
|
#ifdef JUCI_ENABLE_DEBUG |
|
|
|
#ifdef JUCI_ENABLE_DEBUG |
|
|
|
#include "debug_clang.h" |
|
|
|
#include "debug_clang.h" |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#include "info.h" |
|
|
|
|
|
|
|
|
|
|
|
namespace sigc { |
|
|
|
namespace sigc { |
|
|
|
#ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE |
|
|
|
#ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE |
|
|
|
@ -222,9 +223,9 @@ void Source::ClangViewParse::update_syntax() { |
|
|
|
if(token.get_kind()==1) // KeywordToken
|
|
|
|
if(token.get_kind()==1) // KeywordToken
|
|
|
|
ranges.emplace_back(token.offsets, 702); |
|
|
|
ranges.emplace_back(token.offsets, 702); |
|
|
|
else if(token.get_kind()==2) {// IdentifierToken
|
|
|
|
else if(token.get_kind()==2) {// IdentifierToken
|
|
|
|
auto kind=(int)token.get_cursor().get_kind(); |
|
|
|
auto kind=static_cast<int>(token.get_cursor().get_kind()); |
|
|
|
if(kind==101 || kind==102) |
|
|
|
if(kind==101 || kind==102) |
|
|
|
kind=(int)token.get_cursor().get_referenced().get_kind(); |
|
|
|
kind=static_cast<int>(token.get_cursor().get_referenced().get_kind()); |
|
|
|
if(kind!=500) |
|
|
|
if(kind!=500) |
|
|
|
ranges.emplace_back(token.offsets, kind); |
|
|
|
ranges.emplace_back(token.offsets, kind); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -859,10 +860,13 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
get_token=[this]() -> Token { |
|
|
|
get_token=[this]() -> Token { |
|
|
|
if(parsed) { |
|
|
|
if(!parsed) { |
|
|
|
|
|
|
|
Info::get().print("Buffer is parsing"); |
|
|
|
|
|
|
|
return Token(); |
|
|
|
|
|
|
|
} |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto line=(unsigned)iter.get_line(); |
|
|
|
auto line=static_cast<unsigned>(iter.get_line()); |
|
|
|
auto index=(unsigned)iter.get_line_index(); |
|
|
|
auto index=static_cast<unsigned>(iter.get_line_index()); |
|
|
|
for(auto &token: *clang_tokens) { |
|
|
|
for(auto &token: *clang_tokens) { |
|
|
|
auto cursor=token.get_cursor(); |
|
|
|
auto cursor=token.get_cursor(); |
|
|
|
if(token.get_kind()==clang::Token_Identifier && cursor.has_type()) { |
|
|
|
if(token.get_kind()==clang::Token_Identifier && cursor.has_type()) { |
|
|
|
@ -875,7 +879,6 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return Token(); |
|
|
|
return Token(); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@ -907,7 +910,9 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
if(mark->get_name()=="insert") { |
|
|
|
if(mark->get_name()=="insert") { |
|
|
|
delayed_tag_similar_tokens_connection.disconnect(); |
|
|
|
delayed_tag_similar_tokens_connection.disconnect(); |
|
|
|
delayed_tag_similar_tokens_connection=Glib::signal_timeout().connect([this]() { |
|
|
|
delayed_tag_similar_tokens_connection=Glib::signal_timeout().connect([this]() { |
|
|
|
|
|
|
|
Info::get().enabled=false; |
|
|
|
auto token=get_token(); |
|
|
|
auto token=get_token(); |
|
|
|
|
|
|
|
Info::get().enabled=true; |
|
|
|
tag_similar_tokens(token); |
|
|
|
tag_similar_tokens(token); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
}, 100); |
|
|
|
}, 100); |
|
|
|
@ -916,10 +921,13 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
|
|
|
|
|
|
|
|
get_declaration_location=[this](){ |
|
|
|
get_declaration_location=[this](){ |
|
|
|
Offset location; |
|
|
|
Offset location; |
|
|
|
if(parsed) { |
|
|
|
if(!parsed) { |
|
|
|
|
|
|
|
Info::get().print("Buffer is parsing"); |
|
|
|
|
|
|
|
return location; |
|
|
|
|
|
|
|
} |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto line=(unsigned)iter.get_line(); |
|
|
|
auto line=static_cast<unsigned>(iter.get_line()); |
|
|
|
auto index=(unsigned)iter.get_line_index(); |
|
|
|
auto index=static_cast<unsigned>(iter.get_line_index()); |
|
|
|
for(auto &token: *clang_tokens) { |
|
|
|
for(auto &token: *clang_tokens) { |
|
|
|
auto cursor=token.get_cursor(); |
|
|
|
auto cursor=token.get_cursor(); |
|
|
|
if(token.get_kind()==clang::Token_Identifier && cursor.has_type()) { |
|
|
|
if(token.get_kind()==clang::Token_Identifier && cursor.has_type()) { |
|
|
|
@ -935,7 +943,6 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return location; |
|
|
|
return location; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@ -965,7 +972,6 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
|
|
|
|
|
|
|
|
get_usages=[this](const Token &token) { |
|
|
|
get_usages=[this](const Token &token) { |
|
|
|
std::vector<std::pair<Offset, std::string> > usages; |
|
|
|
std::vector<std::pair<Offset, std::string> > usages; |
|
|
|
|
|
|
|
|
|
|
|
if(parsed && token.language && |
|
|
|
if(parsed && token.language && |
|
|
|
(token.language->get_id()=="chdr" || token.language->get_id()=="cpphdr" || token.language->get_id()=="c" || token.language->get_id()=="cpp" || token.language->get_id()=="objc")) { |
|
|
|
(token.language->get_id()=="chdr" || token.language->get_id()=="cpphdr" || token.language->get_id()=="c" || token.language->get_id()=="cpp" || token.language->get_id()=="objc")) { |
|
|
|
auto offsets=clang_tokens->get_similar_token_offsets(static_cast<clang::CursorKind>(token.type), token.spelling, token.usr); |
|
|
|
auto offsets=clang_tokens->get_similar_token_offsets(static_cast<clang::CursorKind>(token.type), token.spelling, token.usr); |
|
|
|
@ -1007,7 +1013,10 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
goto_method=[this](){ |
|
|
|
goto_method=[this](){ |
|
|
|
if(parsed) { |
|
|
|
if(!parsed) { |
|
|
|
|
|
|
|
Info::get().print("Buffer is parsing"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
auto iter=get_iter_for_dialog(); |
|
|
|
auto iter=get_iter_for_dialog(); |
|
|
|
selection_dialog=std::unique_ptr<SelectionDialog>(new SelectionDialog(*this, get_buffer()->create_mark(iter), true, true)); |
|
|
|
selection_dialog=std::unique_ptr<SelectionDialog>(new SelectionDialog(*this, get_buffer()->create_mark(iter), true, true)); |
|
|
|
auto rows=std::make_shared<std::unordered_map<std::string, clang::Offset> >(); |
|
|
|
auto rows=std::make_shared<std::unordered_map<std::string, clang::Offset> >(); |
|
|
|
@ -1054,7 +1063,6 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
delayed_tooltips_connection.disconnect(); |
|
|
|
delayed_tooltips_connection.disconnect(); |
|
|
|
}; |
|
|
|
}; |
|
|
|
selection_dialog->show(); |
|
|
|
selection_dialog->show(); |
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
get_token_data=[this]() { |
|
|
|
get_token_data=[this]() { |
|
|
|
@ -1070,10 +1078,13 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> data; |
|
|
|
std::vector<std::string> data; |
|
|
|
if(parsed) { |
|
|
|
if(!parsed) { |
|
|
|
|
|
|
|
Info::get().print("Buffer is parsing"); |
|
|
|
|
|
|
|
return data; |
|
|
|
|
|
|
|
} |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto line=(unsigned)iter.get_line(); |
|
|
|
auto line=static_cast<unsigned>(iter.get_line()); |
|
|
|
auto index=(unsigned)iter.get_line_index(); |
|
|
|
auto index=static_cast<unsigned>(iter.get_line_index()); |
|
|
|
for(auto &token: *clang_tokens) { |
|
|
|
for(auto &token: *clang_tokens) { |
|
|
|
auto cursor=token.get_cursor(); |
|
|
|
auto cursor=token.get_cursor(); |
|
|
|
if(token.get_kind()==clang::Token_Identifier && cursor.has_type()) { |
|
|
|
if(token.get_kind()==clang::Token_Identifier && cursor.has_type()) { |
|
|
|
@ -1152,12 +1163,14 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return data; |
|
|
|
return data; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
goto_next_diagnostic=[this]() { |
|
|
|
goto_next_diagnostic=[this]() { |
|
|
|
if(parsed) { |
|
|
|
if(!parsed) { |
|
|
|
|
|
|
|
Info::get().print("Buffer is parsing"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
auto insert_offset=get_buffer()->get_insert()->get_iter().get_offset(); |
|
|
|
auto insert_offset=get_buffer()->get_insert()->get_iter().get_offset(); |
|
|
|
for(auto offset: diagnostic_offsets) { |
|
|
|
for(auto offset: diagnostic_offsets) { |
|
|
|
if(offset>insert_offset) { |
|
|
|
if(offset>insert_offset) { |
|
|
|
@ -1171,12 +1184,14 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
get_buffer()->place_cursor(iter); |
|
|
|
get_buffer()->place_cursor(iter); |
|
|
|
scroll_to(get_buffer()->get_insert(), 0.0, 1.0, 0.5); |
|
|
|
scroll_to(get_buffer()->get_insert(), 0.0, 1.0, 0.5); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
apply_fix_its=[this]() { |
|
|
|
apply_fix_its=[this]() { |
|
|
|
|
|
|
|
if(!parsed) { |
|
|
|
|
|
|
|
Info::get().print("Buffer is parsing"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
std::vector<std::pair<Glib::RefPtr<Gtk::TextMark>, Glib::RefPtr<Gtk::TextMark> > > fix_it_marks; |
|
|
|
std::vector<std::pair<Glib::RefPtr<Gtk::TextMark>, Glib::RefPtr<Gtk::TextMark> > > fix_it_marks; |
|
|
|
if(parsed) { |
|
|
|
|
|
|
|
for(auto &fix_it: fix_its) { |
|
|
|
for(auto &fix_it: fix_its) { |
|
|
|
auto start_iter=get_buffer()->get_iter_at_line_index(fix_it.offsets.first.line-1, fix_it.offsets.first.index-1); |
|
|
|
auto start_iter=get_buffer()->get_iter_at_line_index(fix_it.offsets.first.line-1, fix_it.offsets.first.index-1); |
|
|
|
auto end_iter=get_buffer()->get_iter_at_line_index(fix_it.offsets.second.line-1, fix_it.offsets.second.index-1); |
|
|
|
auto end_iter=get_buffer()->get_iter_at_line_index(fix_it.offsets.second.line-1, fix_it.offsets.second.index-1); |
|
|
|
@ -1202,7 +1217,6 @@ Source::ClangViewAutocomplete(file_path, language) { |
|
|
|
get_buffer()->delete_mark(mark_pair.second); |
|
|
|
get_buffer()->delete_mark(mark_pair.second); |
|
|
|
} |
|
|
|
} |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|