@ -26,9 +26,10 @@ Glib::RefPtr<Gsv::Language> Source::guess_language(const boost::filesystem::path
auto language = language_manager - > guess_language ( file_path . string ( ) , content_type ) ;
if ( ! language ) {
auto filename = file_path . filename ( ) . string ( ) ;
auto extension = file_path . extension ( ) ;
if ( filename = = " CMakeLists.txt " )
language = language_manager - > get_language ( " cmake " ) ;
else if ( filename = = " Makefile " )
language = language_manager - > get_language ( " makefile " ) ;
}
return language ;
}
@ -39,7 +40,8 @@ Glib::RefPtr<Gsv::Language> Source::guess_language(const boost::filesystem::path
Source : : View : : View ( const boost : : filesystem : : path & file_path ) : file_path ( file_path ) {
set_smart_home_end ( Gsv : : SMART_HOME_END_BEFORE ) ;
get_source_buffer ( ) - > begin_not_undoable_action ( ) ;
juci : : filesystem : : read ( file_path , get_buffer ( ) ) ;
if ( ! juci : : filesystem : : read ( file_path , get_buffer ( ) ) )
Singleton : : terminal ( ) - > print ( " Error: " + file_path . string ( ) + " is not a valid UTF-8 file. \n " ) ;
get_source_buffer ( ) - > end_not_undoable_action ( ) ;
get_buffer ( ) - > place_cursor ( get_buffer ( ) - > get_iter_at_offset ( 0 ) ) ;
search_settings = gtk_source_search_settings_new ( ) ;
@ -56,18 +58,23 @@ Source::View::View(const boost::filesystem::path &file_path): file_path(file_pat
//TODO: (gtkmm's Gtk::Object has connect_property_changed, so subclassing this might be an idea)
g_signal_connect ( search_context , " notify::occurrences-count " , G_CALLBACK ( search_occurrences_updated ) , this ) ;
// style
//TODO: Move this to notebook? Might take up too much memory doing this for every tab.
auto style_scheme_manager = Gsv : : StyleSchemeManager : : get_default ( ) ;
style_scheme_manager - > prepend_search_path ( Singleton : : style_dir ( ) ) ;
auto scheme = style_scheme_manager - > get_scheme ( Singleton : : Config : : theme ( ) - > theme ) ;
if ( Singleton : : Config : : source ( ) - > style . size ( ) > 0 ) {
auto scheme = style_scheme_manager - > get_scheme ( Singleton : : Config : : source ( ) - > style ) ;
if ( scheme ) {
if ( scheme )
get_source_buffer ( ) - > set_style_scheme ( scheme ) ;
else
Singleton : : terminal ( ) - > print ( " Error: Could not find gtksourceview style: " + Singleton : : Config : : source ( ) - > style + ' \n ' ) ;
}
property_highlight_current_line ( ) = Singleton : : Config : : source ( ) - > gsv [ " highlight_current_line " ] = = " true " ;
property_show_line_numbers ( ) = Singleton : : Config : : source ( ) - > gsv [ " show_line_numbers " ] = = " true " ;
property_highlight_current_line ( ) = Singleton : : Config : : source ( ) - > highlight_current_line ;
property_show_line_numbers ( ) = Singleton : : Config : : source ( ) - > show_line_numbers ;
if ( Singleton : : Config : : source ( ) - > font . size ( ) > 0 )
override_font ( Pango : : FontDescription ( Singleton : : Config : : source ( ) - > font ) ) ;
}
void Source : : View : : search_occurrences_updated ( GtkWidget * widget , GParamSpec * property , gpointer data ) {
@ -148,7 +155,7 @@ void Source::View::paste() {
auto line = get_line_before_insert ( ) ;
std : : smatch sm ;
std : : string prefix_tabs ;
if ( std : : regex_match ( line , sm , spaces_regex ) & & sm [ 2 ] . str ( ) . size ( ) = = 0 ) {
if ( ! get_buffer ( ) - > get_has_selection ( ) & & std : : regex_match ( line , sm , spaces_regex ) & & sm [ 2 ] . str ( ) . size ( ) = = 0 ) {
prefix_tabs = sm [ 1 ] . str ( ) ;
Glib : : ustring : : size_type start_line = 0 ;
@ -388,12 +395,14 @@ clang::Index Source::ClangViewParse::clang_index(0, 0);
Source : : ClangViewParse : : ClangViewParse ( const boost : : filesystem : : path & file_path , const boost : : filesystem : : path & project_path ) :
Source : : View ( file_path ) , project_path ( project_path ) {
for ( auto & item : Singleton : : Config : : source ( ) - > tags ) {
auto scheme = get_source_buffer ( ) - > get_style_scheme ( ) ;
auto tag_table = get_buffer ( ) - > get_tag_table ( ) ;
for ( auto & item : Singleton : : Config : : source ( ) - > clang_types ) {
if ( ! tag_table - > lookup ( item . second ) ) {
auto style = scheme - > get_style ( item . second ) ;
auto tag = get_source_buffer ( ) - > create_tag ( item . second ) ;
if ( style ) {
DEBUG ( " Style " + item . second + " found in style " + scheme - > get_name ( ) ) ;
auto tag = get_source_buffer ( ) - > create_tag ( item . first ) ;
if ( style - > property_foreground_set ( ) )
tag - > property_foreground ( ) = style - > property_foreground ( ) ;
if ( style - > property_background_set ( ) )
@ -404,34 +413,64 @@ Source::View(file_path), project_path(project_path) {
// // if (style->property_italic_set()) tag->property_italic() = style->property_italic();
// // if (style->property_line_background_set()) tag->property_line_background() = style->property_line_background();
// // if (style->property_underline_set()) tag->property_underline() = style->property_underline();
} else {
} else
DEBUG ( " Style " + item . second + " not found in " + scheme - > get_name ( ) ) ;
get_source_buffer ( ) - > create_tag ( item . first ) - > property_foreground ( ) = item . second ;
}
}
INFO ( " Tagtable filled " ) ;
//Create underline color tags for diagnostic warnings and errors:
auto diagnostic_tag = get_buffer ( ) - > get_tag_table ( ) - > lookup ( " diagnostic_warning " ) ;
auto diagnostic_tag_underline = Gtk : : TextTag : : create ( " diagnostic_warning_underline " ) ;
get_buffer ( ) - > get_tag_table ( ) - > add ( diagnostic_tag_underline ) ;
//Create tags for diagnostic warnings and errors:
auto style = scheme - > get_style ( " def:warning " ) ;
auto diagnostic_tag = get_source_buffer ( ) - > create_tag ( " def:warning " ) ;
auto diagnostic_tag_underline = get_source_buffer ( ) - > create_tag ( " def:warning_underline " ) ;
if ( style & & ( style - > property_foreground_set ( ) | | style - > property_background_set ( ) ) ) {
Glib : : ustring warning_property ;
if ( style - > property_foreground_set ( ) ) {
warning_property = style - > property_foreground ( ) . get_value ( ) ;
diagnostic_tag - > property_foreground ( ) = warning_property ;
}
else if ( style - > property_background_set ( ) )
warning_property = style - > property_background ( ) . get_value ( ) ;
diagnostic_tag_underline - > property_underline ( ) = Pango : : Underline : : UNDERLINE_ERROR ;
auto tag_class = G_OBJECT_GET_CLASS ( diagnostic_tag_underline - > gobj ( ) ) ; //For older GTK+ 3 versions:
auto param_spec = g_object_class_find_property ( tag_class , " underline-rgba " ) ;
if ( param_spec ! = NULL ) {
diagnostic_tag_underline - > set_property ( " underline-rgba " , diagnostic_tag - > property_foreground_rgba ( ) . get_value ( ) ) ;
diagnostic_tag_underline - > set_property ( " underline-rgba " , Gdk : : RGBA ( warning_property ) ) ;
}
}
diagnostic_tag = get_buffer ( ) - > get_tag_table ( ) - > lookup ( " diagnostic_error " ) ;
diagnostic_tag_underline = Gtk : : TextTag : : create ( " diagnostic_error_underline " ) ;
get_buffer ( ) - > get_tag_table ( ) - > add ( diagnostic_tag_underline ) ;
style = scheme - > get_style ( " def:error " ) ;
diagnostic_tag = get_source_buffer ( ) - > create_tag ( " def:error " ) ;
diagnostic_tag_underline = get_source_buffer ( ) - > create_tag ( " def:error_underline " ) ;
if ( style & & ( style - > property_foreground_set ( ) | | style - > property_background_set ( ) ) ) {
Glib : : ustring error_property ;
if ( style - > property_foreground_set ( ) ) {
error_property = style - > property_foreground ( ) . get_value ( ) ;
diagnostic_tag - > property_foreground ( ) = error_property ;
}
else if ( style - > property_background_set ( ) )
error_property = style - > property_background ( ) . get_value ( ) ;
diagnostic_tag_underline - > property_underline ( ) = Pango : : Underline : : UNDERLINE_ERROR ;
tag_class = G_OBJECT_GET_CLASS ( diagnostic_tag_underline - > gobj ( ) ) ; //For older GTK+ 3 versions:
param_spec = g_object_class_find_property ( tag_class , " underline-rgba " ) ;
auto tag_class = G_OBJECT_GET_CLASS ( diagnostic_tag_underline - > gobj ( ) ) ; //For older GTK+ 3 versions:
auto param_spec = g_object_class_find_property ( tag_class , " underline-rgba " ) ;
if ( param_spec ! = NULL ) {
diagnostic_tag_underline - > set_property ( " underline-rgba " , diagnostic_tag - > property_foreground_rgba ( ) . get_value ( ) ) ;
diagnostic_tag_underline - > set_property ( " underline-rgba " , Gdk : : RGBA ( error_property ) ) ;
}
}
//TODO: clear tag_class and param_spec?
//Add tooltip foreground and background
style = scheme - > get_style ( " def:note " ) ;
auto note_tag = get_source_buffer ( ) - > create_tag ( " def:note_background " ) ;
if ( style - > property_background_set ( ) ) {
note_tag - > property_background ( ) = style - > property_background ( ) ;
}
note_tag = get_source_buffer ( ) - > create_tag ( " def:note " ) ;
if ( style - > property_foreground_set ( ) ) {
note_tag - > property_foreground ( ) = style - > property_foreground ( ) ;
}
parsing_in_progress = Singleton : : terminal ( ) - > print_in_progress ( " Parsing " + file_path . string ( ) ) ;
//GTK-calls must happen in main thread, so the parse_thread
//sends signals to the main thread that it is to call the following functions:
@ -482,8 +521,6 @@ void Source::ClangViewParse::init_parse() {
parse_thread_stop = false ;
int start_offset = get_source_buffer ( ) - > begin ( ) . get_offset ( ) ;
int end_offset = get_source_buffer ( ) - > end ( ) . get_offset ( ) ;
auto buffer_map = get_buffer_map ( ) ;
//Remove includes for first parse for initial syntax highlighting
auto & str = buffer_map [ file_path . string ( ) ] ;
@ -498,9 +535,7 @@ void Source::ClangViewParse::init_parse() {
}
pos + + ;
}
init_syntax_highlighting ( buffer_map ,
start_offset ,
end_offset ) ;
init_syntax_highlighting ( buffer_map ) ;
update_syntax ( ) ;
set_status ( " parsing... " ) ;
@ -527,11 +562,7 @@ void Source::ClangViewParse::init_parse() {
} ) ;
}
void Source : : ClangViewParse : :
init_syntax_highlighting ( const std : : map < std : : string , std : : string >
& buffers ,
int start_offset ,
int end_offset ) {
void Source : : ClangViewParse : : init_syntax_highlighting ( const std : : map < std : : string , std : : string > & buffers ) {
std : : vector < string > arguments = get_compilation_commands ( ) ;
clang_tu = std : : unique_ptr < clang : : TranslationUnit > ( new clang : : TranslationUnit ( clang_index ,
file_path . string ( ) ,
@ -542,7 +573,7 @@ init_syntax_highlighting(const std::map<std::string, std::string>
std : : map < std : : string , std : : string > Source : : ClangViewParse : : get_buffer_map ( ) const {
std : : map < std : : string , std : : string > buffer_map ;
buffer_map [ file_path . string ( ) ] = get_source_buffer ( ) - > get_text ( ) . raw ( ) ;
buffer_map [ file_path . string ( ) ] = get_source_buffer ( ) - > get_text ( ) ;
return buffer_map ;
}
@ -583,16 +614,20 @@ std::vector<std::string> Source::ClangViewParse::get_compilation_commands() {
void Source : : ClangViewParse : : update_syntax ( ) {
std : : vector < Source : : Range > ranges ;
for ( auto & token : * clang_tokens ) {
if ( token . get_kind ( ) = = 0 ) // PunctuationToken
ranges . emplace_back ( token . offsets . first , token . offsets . second , ( int ) token . get_cursor ( ) . get_kind ( ) ) ;
else if ( token . get_kind ( ) = = 1 ) // KeywordToken
ranges . emplace_back ( token . offsets . first , token . offsets . second , 702 ) ;
else if ( token . get_kind ( ) = = 2 ) // IdentifierToken
ranges . emplace_back ( token . offsets . first , token . offsets . second , ( int ) token . get_cursor ( ) . get_kind ( ) ) ;
//if(token.get_kind()==0) // PunctuationToken
//ranges.emplace_back(token.offsets, (int) token.get_cursor().get_kind());
if ( token . get_kind ( ) = = 1 ) // KeywordToken
ranges . emplace_back ( token . offsets , 702 ) ;
else if ( token . get_kind ( ) = = 2 ) { // IdentifierToken
auto kind = ( int ) token . get_cursor ( ) . get_kind ( ) ;
if ( kind = = 101 | | kind = = 102 )
kind = ( int ) token . get_cursor ( ) . get_referenced ( ) . get_kind ( ) ;
ranges . emplace_back ( token . offsets , kind ) ; //TODO: Need to get type of referenced token if any
}
else if ( token . get_kind ( ) = = 3 ) // LiteralToken
ranges . emplace_back ( token . offsets . first , token . offsets . second , 109 ) ;
ranges . emplace_back ( token . offsets , 109 ) ;
else if ( token . get_kind ( ) = = 4 ) // CommentToken
ranges . emplace_back ( token . offsets . first , token . offsets . second , 705 ) ;
ranges . emplace_back ( token . offsets , 705 ) ;
}
if ( ranges . empty ( ) | | ranges . size ( ) = = 0 ) {
return ;
@ -604,40 +639,39 @@ void Source::ClangViewParse::update_syntax() {
for ( auto & range : ranges ) {
auto type = boost : : lexical_cast < std : : string > ( range . kind ) ;
try {
last_syntax_tags . emplace ( Singleton : : Config : : source ( ) - > types . at ( type ) ) ;
last_syntax_tags . emplace ( Singleton : : Config : : source ( ) - > clang_ types. at ( type ) ) ;
} catch ( std : : exception ) {
//cout << range.kind << ": " << range.offsets.first.line << ", " << range.offsets.first.index << endl; //TODO: remove
continue ;
}
Gtk : : TextIter begin_iter = buffer - > get_iter_at_offset ( range . start_offset ) ;
Gtk : : TextIter end_iter = buffer - > get_iter_at_offset ( range . end_offset ) ;
buffer - > apply_tag_by_name ( Singleton : : Config : : source ( ) - > types . at ( type ) ,
begin_iter , end_iter ) ;
Gtk : : TextIter begin_iter = buffer - > get_iter_at_line_index ( range . offsets . first . line - 1 , range . offsets . first . index - 1 ) ;
Gtk : : TextIter end_iter = buffer - > get_iter_at_line_index ( range . offsets . second . line - 1 , range . offsets . second . index - 1 ) ;
buffer - > apply_tag_by_name ( Singleton : : Config : : source ( ) - > clang_types . at ( type ) , begin_iter , end_iter ) ;
}
}
void Source : : ClangViewParse : : update_diagnostics ( ) {
diagnostic_tooltips . clear ( ) ;
get_buffer ( ) - > remove_tag_by_name ( " diagnostic_ warning_underline " , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag_by_name ( " diagnostic_ error_underline " , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag_by_name ( " def: warning_underline " , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag_by_name ( " def: error_underline " , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
auto diagnostics = clang_tu - > get_diagnostics ( ) ;
for ( auto & diagnostic : diagnostics ) {
if ( diagnostic . path = = file_path . string ( ) ) {
auto start = get_buffer ( ) - > get_iter_at_offset ( diagnostic . offsets . first ) ;
auto end = get_buffer ( ) - > get_iter_at_offset ( diagnostic . offsets . second ) ;
auto start = get_buffer ( ) - > get_iter_at_line_index ( diagnostic . offsets . first . line - 1 , diagnostic . offsets . first . index - 1 ) ;
auto end = get_buffer ( ) - > get_iter_at_line_index ( diagnostic . offsets . second . line - 1 , diagnostic . offsets . second . index - 1 ) ;
std : : string diagnostic_tag_name ;
if ( diagnostic . severity < = CXDiagnostic_Warning )
diagnostic_tag_name = " diagnostic_ warning " ;
diagnostic_tag_name = " def: warning " ;
else
diagnostic_tag_name = " diagnostic_ error " ;
diagnostic_tag_name = " def: error " ;
auto spelling = diagnostic . spelling ;
auto severity_spelling = diagnostic . severity_spelling ;
auto create_tooltip_buffer = [ this , spelling , severity_spelling , diagnostic_tag_name ] ( ) {
auto tooltip_buffer = Gtk : : TextBuffer : : create ( get_buffer ( ) - > get_tag_table ( ) ) ;
tooltip_buffer - > insert_with_tag ( tooltip_buffer - > get_insert ( ) - > get_iter ( ) , severity_spelling , diagnostic_tag_name ) ;
tooltip_buffer - > insert_at_cursor ( " : \n " + spelling ) ;
tooltip_buffer - > insert_with_tag ( tooltip_buffer - > get_insert ( ) - > get_iter ( ) , " : \n " + spelling , " def:note " ) ;
//TODO: Insert newlines to clang_tu->diagnostics[c].spelling (use 80 chars, then newline?)
return tooltip_buffer ;
} ;
@ -652,14 +686,14 @@ void Source::ClangViewParse::update_types() {
type_tooltips . clear ( ) ;
for ( auto & token : * clang_tokens ) {
if ( token . get_kind ( ) = = clang : : Token_Identifier & & token . has_type ( ) ) {
auto start = get_buffer ( ) - > get_iter_at_offset ( token . offsets . first ) ;
auto end = get_buffer ( ) - > get_iter_at_offset ( token . offsets . second ) ;
auto start = get_buffer ( ) - > get_iter_at_line_index ( token . offsets . first . line - 1 , token . offsets . first . index - 1 ) ;
auto end = get_buffer ( ) - > get_iter_at_line_index ( token . offsets . second . line - 1 , token . offsets . second . index - 1 ) ;
auto create_tooltip_buffer = [ this , & token ] ( ) {
auto tooltip_buffer = Gtk : : TextBuffer : : create ( get_buffer ( ) - > get_tag_table ( ) ) ;
tooltip_buffer - > insert_at_cursor ( " Type: " + token . get_type ( ) ) ;
tooltip_buffer - > insert_with_tag ( tooltip_buffer - > get_insert ( ) - > get_iter ( ) , " Type: " + token . get_type ( ) , " def:note " ) ;
auto brief_comment = token . get_brief_comments ( ) ;
if ( brief_comment ! = " " )
tooltip_buffer - > insert_at_cursor ( " \n \n " + brief_comment ) ;
tooltip_buffer - > insert_with_tag ( tooltip_buffer - > get_insert ( ) - > get_iter ( ) , " \n \n " + brief_comment , " def:note " ) ;
return tooltip_buffer ;
} ;
@ -1069,10 +1103,12 @@ Source::ClangViewAutocomplete(file_path, project_path) {
get_token = [ this ] ( ) - > std : : string {
if ( clang_readable ) {
auto iter = get_buffer ( ) - > get_insert ( ) - > get_iter ( ) ;
auto line = ( unsigned ) iter . get_line ( ) ;
auto index = ( unsigned ) iter . get_line_index ( ) ;
for ( auto & token : * clang_tokens ) {
if ( token . get_kind ( ) = = clang : : Token_Identifier & & token . has_type ( ) ) {
auto insert_offset = ( unsigned ) get_buffer ( ) - > get_insert ( ) - > get_iter ( ) . get_offset ( ) ;
if ( insert_offset > = token . offsets . first & & insert_offset < = token . offsets . second ) {
if ( line = = token . offsets . first . line - 1 & & index > = token . offsets . first . index - 1 & & index < = token . offsets . second . index - 1 ) {
auto referenced = token . get_cursor ( ) . get_referenced ( ) ;
if ( referenced )
return referenced . get_usr ( ) ;
@ -1085,10 +1121,12 @@ Source::ClangViewAutocomplete(file_path, project_path) {
get_token_name = [ this ] ( ) - > std : : string {
if ( clang_readable ) {
auto iter = get_buffer ( ) - > get_insert ( ) - > get_iter ( ) ;
auto line = ( unsigned ) iter . get_line ( ) ;
auto index = ( unsigned ) iter . get_line_index ( ) ;
for ( auto & token : * clang_tokens ) {
if ( token . get_kind ( ) = = clang : : Token_Identifier & & token . has_type ( ) ) {
auto insert_offset = ( unsigned ) get_buffer ( ) - > get_insert ( ) - > get_iter ( ) . get_offset ( ) ;
if ( insert_offset > = token . offsets . first & & insert_offset < = token . offsets . second ) {
if ( line = = token . offsets . first . line - 1 & & index > = token . offsets . first . index - 1 & & index < = token . offsets . second . index - 1 ) {
return token . get_spelling ( ) ;
}
}
@ -1103,7 +1141,7 @@ Source::ClangViewAutocomplete(file_path, project_path) {
get_buffer ( ) - > remove_tag ( similar_tokens_tag , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
auto offsets = clang_tokens - > get_similar_token_offsets ( usr ) ;
for ( auto & offset : offsets ) {
get_buffer ( ) - > apply_tag ( similar_tokens_tag , get_buffer ( ) - > get_iter_at_offset ( offset . first ) , get_buffer ( ) - > get_iter_at_offset ( offset . second ) ) ;
get_buffer ( ) - > apply_tag ( similar_tokens_tag , get_buffer ( ) - > get_iter_at_line_index ( offset . first . line - 1 , offset . first . index - 1 ) , get_buffer ( ) - > get_iter_at_line_index ( offset . second . line - 1 , offset . second . index - 1 ) ) ;
}
last_similar_tokens_tagged = usr ;
}
@ -1120,7 +1158,7 @@ Source::ClangViewAutocomplete(file_path, project_path) {
auto offsets = clang_tokens - > get_similar_token_offsets ( usr ) ;
std : : vector < std : : pair < Glib : : RefPtr < Gtk : : TextMark > , Glib : : RefPtr < Gtk : : TextMark > > > marks ;
for ( auto & offset : offsets ) {
marks . emplace_back ( get_buffer ( ) - > create_mark ( get_buffer ( ) - > get_iter_at_offset ( offset . first ) ) , get_buffer ( ) - > create_mark ( get_buffer ( ) - > get_iter_at_offset ( offset . second ) ) ) ;
marks . emplace_back ( get_buffer ( ) - > create_mark ( get_buffer ( ) - > get_iter_at_line_index ( offset . first . line - 1 , offset . first . index - 1 ) ) , get_buffer ( ) - > create_mark ( get_buffer ( ) - > get_iter_at_line_index ( offset . second . line - 1 , offset . second . index - 1 ) ) ) ;
number + + ;
}
get_source_buffer ( ) - > begin_user_action ( ) ;
@ -1145,12 +1183,14 @@ Source::ClangViewAutocomplete(file_path, project_path) {
} ) ;
get_declaration_location = [ this ] ( ) {
std : : pair < std : : string , unsigned > location ;
std : : pair < std : : string , clang : : Offset > location ;
if ( clang_readable ) {
auto iter = get_buffer ( ) - > get_insert ( ) - > get_iter ( ) ;
auto line = ( unsigned ) iter . get_line ( ) ;
auto index = ( unsigned ) iter . get_line_index ( ) ;
for ( auto & token : * clang_tokens ) {
if ( token . get_kind ( ) = = clang : : Token_Identifier & & token . has_type ( ) ) {
auto insert_offset = ( unsigned ) get_buffer ( ) - > get_insert ( ) - > get_iter ( ) . get_offset ( ) ;
if ( insert_offset > = token . offsets . first & & insert_offset < = token . offsets . second ) {
if ( line = = token . offsets . first . line - 1 & & index > = token . offsets . first . index - 1 & & index < = token . offsets . second . index - 1 ) {
auto referenced = token . get_cursor ( ) . get_referenced ( ) ;
if ( referenced ) {
location . first = referenced . get_source_location ( ) . get_path ( ) ;
@ -1167,7 +1207,7 @@ Source::ClangViewAutocomplete(file_path, project_path) {
goto_method = [ this ] ( ) {
if ( clang_readable ) {
selection_dialog = std : : unique_ptr < SelectionDialog > ( new SelectionDialog ( * this , get_buffer ( ) - > create_mark ( get_buffer ( ) - > get_insert ( ) - > get_iter ( ) ) ) ) ;
auto rows = std : : make_shared < std : : unordered_map < std : : string , unsigned > > ( ) ;
auto rows = std : : make_shared < std : : unordered_map < std : : string , clang : : Offset > > ( ) ;
auto methods = clang_tokens - > get_cxx_methods ( ) ;
if ( methods . size ( ) = = 0 )
return ;
@ -1178,7 +1218,7 @@ Source::ClangViewAutocomplete(file_path, project_path) {
//TODO see if rows gets destroyed when selection_dialog gets destroyed.
selection_dialog - > on_select = [ this , rows ] ( const std : : string & selected , bool hide_window ) {
auto offset = rows - > at ( selected ) ;
get_buffer ( ) - > place_cursor ( get_buffer ( ) - > get_iter_at_offset ( offset ) ) ;
get_buffer ( ) - > place_cursor ( get_buffer ( ) - > get_iter_at_line_index ( offset . line - 1 , offset . index - 1 ) ) ;
scroll_to ( get_buffer ( ) - > get_insert ( ) , 0.0 , 1.0 , 0.5 ) ;
delayed_tooltips_connection . disconnect ( ) ;
} ;