Simplify and rename 'hard starts' stuff for indentation

This commit is contained in:
Allen Webster 2019-06-14 15:57:22 -07:00
parent 797fb42749
commit e274bb9120
8 changed files with 86 additions and 83 deletions

View File

@ -436,11 +436,22 @@ mark_enclosures(Application_Links *app, Managed_Scope render_scope, Buffer_Summa
}
}
struct Hard_Start_Result{
i32 char_pos;
i32 indent_pos;
i32 all_whitespace;
i32 all_space;
};
static Hard_Start_Result
buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, i32 line_start, i32 tab_width){
Hard_Start_Result result = {};
if (buffer != 0){
buffer_find_hard_start(app, buffer->buffer_id, line_start, tab_width);
Indent_Info info = get_indent_info_line_start(app, buffer->buffer_id, line_start, tab_width);
result.char_pos = info.first_char_pos;
result.indent_pos = info.indent_pos;
result.all_whitespace = info.is_blank;
result.all_space = info.all_space;
}
return(result);
}
@ -667,7 +678,7 @@ execute_standard_build(Application_Links *app, View_Summary *view, Buffer_ID act
static b32
post_buffer_range_to_clipboard(Application_Links *app, i32 clipboard_index, Buffer_Summary *buffer, i32 first, i32 one_past_last){
return(post_buffer_range_to_clipboard(app, clipboard_index, buffer==0?0:buffer->buffer_id, first, one_past_last));
return(post_buffer_range_to_clipboard(app, clipboard_index, buffer==0?0:buffer->buffer_id, first, one_past_last));
}
static void

View File

@ -4,51 +4,6 @@
// TOP
internal Hard_Start_Result
buffer_find_hard_start(Application_Links *app, Buffer_ID buffer, i32 line_start, i32 tab_width){
i32 tab_additional_width = tab_width - 1;
Hard_Start_Result result = {};
result.all_space = true;
result.indent_pos = 0;
result.char_pos = line_start;
char data_chunk[1024];
Stream_Chunk stream = {};
stream.add_null = true;
if (init_stream_chunk(&stream, app, buffer, line_start, data_chunk, sizeof(data_chunk))){
b32 still_looping = true;
do{
for (; result.char_pos < stream.end; ++result.char_pos){
char c = stream.data[result.char_pos];
if (c == '\n' || c == 0){
result.all_whitespace = 1;
goto double_break;
}
if (c >= '!' && c <= '~'){
goto double_break;
}
if (c == '\t'){
result.indent_pos += tab_additional_width;
}
if (c != ' '){
result.all_space = false;
}
result.indent_pos += 1;
}
still_looping = forward_stream_chunk(&stream);
}while(still_looping);
}
double_break:;
return(result);
}
internal Buffer_Batch_Edit
make_batch_from_indent_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
i32 first_line, i32 one_past_last_line, i32 *indent_marks,
@ -65,10 +20,10 @@ make_batch_from_indent_marks(Application_Links *app, Arena *arena, Buffer_ID buf
line_number < one_past_last_line;
++line_number){
i32 line_start_pos = get_line_start_pos(app, buffer, line_number);
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, line_start_pos, opts.tab_width);
Indent_Info hard_start = get_indent_info_line_start(app, buffer, line_start_pos, opts.tab_width);
i32 correct_indentation = shifted_indent_marks[line_number];
if (hard_start.all_whitespace && opts.empty_blank_lines){
if (hard_start.is_blank && opts.empty_blank_lines){
correct_indentation = 0;
}
if (correct_indentation == -1){
@ -85,7 +40,7 @@ make_batch_from_indent_marks(Application_Links *app, Arena *arena, Buffer_ID buf
str_size = tab_count + space_count;
str = push_array(arena, char, str_size);
block_fill_u8(str, tab_count, '\t');
block_fill_u8(str + tab_count, space_count, ' ');
block_fill_u8(str + tab_count, space_count, ' ');
}
else{
str_size = correct_indentation;
@ -99,7 +54,7 @@ make_batch_from_indent_marks(Application_Links *app, Arena *arena, Buffer_ID buf
edits[edit_count].str_start = (i32)str_position;
edits[edit_count].len = (i32)str_size;
edits[edit_count].start = line_start_pos;
edits[edit_count].end = hard_start.char_pos;
edits[edit_count].end = hard_start.first_char_pos;
edit_count += 1;
}
@ -302,17 +257,17 @@ get_indentation_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
// NOTE(allen): Check for multi-line tokens
if (prev_token.start <= this_line_start && prev_token.start + prev_token.size > this_line_start){
if (prev_token.type == CPP_TOKEN_COMMENT || prev_token.type == CPP_TOKEN_STRING_CONSTANT){
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, this_line_start, tab_width);
Indent_Info hard_start = get_indent_info_line_start(app, buffer, this_line_start, tab_width);
if (exact_align){
this_indent = indent.previous_comment_indent;
}
else{
if (hard_start.all_whitespace){
if (hard_start.is_blank){
this_indent = previous_indent;
}
else{
i32 line_pos = hard_start.char_pos - this_line_start;
i32 line_pos = hard_start.first_char_pos - this_line_start;
this_indent = line_pos + indent.comment_shift;
if (this_indent < 0){
this_indent = 0;
@ -320,7 +275,7 @@ get_indentation_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
}
}
if (!hard_start.all_whitespace){
if (!hard_start.is_blank){
if (line_number >= first_line){
indent.previous_comment_indent = this_indent;
}
@ -400,7 +355,7 @@ get_indentation_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
this_indent += tab_width;
}
}
}
}
}
}
if (this_indent < 0){
@ -450,7 +405,7 @@ get_indentation_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
{
i32 line = get_line_number_from_pos(app, buffer, token.start);
i32 start = get_line_start_pos(app, buffer, line);
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, start, tab_width);
Indent_Info hard_start = get_indent_info_line_start(app, buffer, start, tab_width);
i32 old_dist_to_token = (token.start - start);
i32 old_indent = hard_start.indent_pos;
@ -469,9 +424,9 @@ get_indentation_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
i32 start = get_line_start_pos(app, buffer, line);
i32 char_pos = token.start - start;
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, start, tab_width);
Indent_Info hard_start = get_indent_info_line_start(app, buffer, start, tab_width);
i32 line_pos = hard_start.char_pos - start;
i32 line_pos = hard_start.first_char_pos - start;
indent.paren_anchor_indent[indent.paren_nesting] = char_pos - line_pos + indent.previous_line_indent + 1;
}
@ -483,7 +438,7 @@ get_indentation_marks(Application_Links *app, Arena *arena, Buffer_ID buffer,
{
if (!(token.flags & CPP_TFLAG_PP_BODY)){
if (indent.paren_nesting > 0){
--indent.paren_nesting;
--indent.paren_nesting;
}
}
}break;

View File

@ -7,13 +7,6 @@
#if !defined(FCODER_AUTO_INDENT_H)
#define FCODER_AUTO_INDENT_H
struct Hard_Start_Result{
i32 char_pos;
i32 indent_pos;
i32 all_whitespace;
i32 all_space;
};
struct Indent_Options{
b32 empty_blank_lines;
b32 use_tabs;

View File

@ -113,11 +113,9 @@ static i32
get_start_of_line_at_cursor(Application_Links *app, View_ID view, Buffer_ID buffer){
i32 pos = 0;
view_get_cursor_pos(app, view, &pos);
Full_Cursor cursor = {};
view_compute_cursor(app, view, seek_pos(pos), &cursor);
view_compute_cursor(app, view, seek_line_char(cursor.line, 1), &cursor);
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, cursor.pos, DEF_TAB_WIDTH);
return(hard_start.char_pos);
i32 line = get_line_number_from_pos(app, buffer, pos);
pos = get_line_side_pos(app, buffer, line, Side_Min);
return(pos);
}
static b32

View File

@ -394,10 +394,10 @@ static Command_Metadata fcoder_metacmd_table[234] = {
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 28, 885 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 28, 919 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 28, 1004 },
{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 606 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 619 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 633 },
{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 646 },
{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 561 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 574 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 588 },
{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 601 },
{ PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\4coder_search.cpp", 29, 705 },
{ PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "w:\\4ed\\code\\4coder_search.cpp", 29, 712 },
{ PROC_LINKS(list_all_locations_case_insensitive, 0), "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "w:\\4ed\\code\\4coder_search.cpp", 29, 719 },
@ -471,10 +471,10 @@ static Command_Metadata fcoder_metacmd_table[234] = {
{ PROC_LINKS(write_note, 0), "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 94 },
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 100 },
{ PROC_LINKS(write_zero_struct, 0), "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 106 },
{ PROC_LINKS(comment_line, 0), "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 135 },
{ PROC_LINKS(uncomment_line, 0), "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 149 },
{ PROC_LINKS(comment_line_toggle, 0), "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 163 },
{ PROC_LINKS(snippet_lister, 0), "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 252 },
{ PROC_LINKS(comment_line, 0), "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 133 },
{ PROC_LINKS(uncomment_line, 0), "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 147 },
{ PROC_LINKS(comment_line_toggle, 0), "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 161 },
{ PROC_LINKS(snippet_lister, 0), "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 250 },
{ PROC_LINKS(set_bindings_choose, 0), "set_bindings_choose", 19, "Remap keybindings using the 'choose' mapping rule.", 50, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 39 },
{ PROC_LINKS(set_bindings_default, 0), "set_bindings_default", 20, "Remap keybindings using the 'default' mapping rule.", 51, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 49 },
{ PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 64 },

View File

@ -638,9 +638,9 @@ scan(Application_Links *app, Boundary_Function_List funcs, Buffer_ID buffer, Sca
}
else{
result = -1;
for (Boundary_Function_Node *node = funcs.first;
node != 0;
node = node->next){
for (Boundary_Function_Node *node = funcs.first;
node != 0;
node = node->next){
i32 pos = scan(app, node->func, buffer, direction, start_pos);
result = Max(result, pos);
}
@ -1272,6 +1272,43 @@ get_pos_of_blank_line_grouped(Application_Links *app, Buffer_ID buffer, Scan_Dir
return(pos);
}
internal Indent_Info
get_indent_info_range(Application_Links *app, Buffer_ID buffer, Range range, i32 tab_width){
Scratch_Block scratch(app);
String_Const_u8 s = push_buffer_range(app, scratch, buffer, range);
i32 tab_additional_width = tab_width - 1;
Indent_Info info = {};
info.first_char_pos = range.end;
info.is_blank = true;
info.all_space = true;
for (umem i = 0; i < s.size; i += 1){
u8 c = s.str[i];
if (!character_is_whitespace(c)){
info.is_blank = false;
info.all_space = false;
info.first_char_pos = range.start + (i32)i;
break;
}
if (c != ' '){
info.all_space = false;
}
if (c == '\t'){
info.indent_pos += tab_additional_width;
}
info.indent_pos += 1;
}
return(info);
}
internal Indent_Info
get_indent_info_line_start(Application_Links *app, Buffer_ID buffer, i32 line_start, i32 tab_width){
i32 end = get_line_side_pos_from_pos(app, buffer, line_start, Side_Max);
return(get_indent_info_range(app, buffer, make_range(line_start, end), tab_width));
}
////////////////////////////////
static History_Group

View File

@ -126,6 +126,13 @@ struct Boundary_Function_List{
typedef Range Enclose_Function(Application_Links *app, Buffer_ID buffer, Range range);
struct Indent_Info{
i32 first_char_pos;
i32 indent_pos;
i32 is_blank;
i32 all_space;
};
////////////////////////////////
struct Stream_Chunk{

View File

@ -28,3 +28,5 @@ view_boundary_seek_set_pos
view_buffer_boundary_range
view_buffer_snipe_range
Hard_Start_Result -> Line_Indent_Info
buffer_find_hard_start -> get_line_indent_info