Simplify and rename 'hard starts' stuff for indentation
This commit is contained in:
parent
797fb42749
commit
e274bb9120
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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{
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue