fixed bug with whitespace batch editing and token fixup

master
Allen Webster 2016-05-17 15:47:26 -04:00
parent e07ec779cb
commit 562bd0601a
2 changed files with 143 additions and 111 deletions

View File

@ -752,6 +752,8 @@ COMMAND_DECL(delete_range){
view_cursor_move(view, next_cursor_pos);
view->file_data.mark = range.start;
}
general_memory_check(&models->mem.general);
}
COMMAND_DECL(undo){

View File

@ -1789,6 +1789,7 @@ file_do_white_batch_edit(System_Functions *system, Models *models, Editing_File
Cpp_Token_Stack tokens = file->state.token_stack;
Cpp_Token *token = tokens.tokens;
Cpp_Token *end_token = tokens.tokens + tokens.count;
Cpp_Token original = {(Cpp_Token_Type)0};
Buffer_Edit *edit = batch;
Buffer_Edit *end_edit = batch + batch_size;
@ -1796,21 +1797,50 @@ file_do_white_batch_edit(System_Functions *system, Models *models, Editing_File
i32 shift_amount = 0;
i32 local_shift = 0;
for (; token < end_token && edit < end_edit; ++edit){
for (; token < end_token; ++token){
original = *token;
for (; edit < end_edit && edit->start <= original.start; ++edit){
local_shift = (edit->len - (edit->end - edit->start));
for (; token->start < edit->start && edit->start < token->start + token->size &&
token < end_token; ++token){
token->size += local_shift;
token->start += shift_amount;
}
for (; token->start < edit->start && token < end_token; ++token){
token->start += shift_amount;
}
shift_amount += local_shift;
}
token->start += shift_amount;
local_shift = 0;
for (; edit < end_edit && edit->start < original.start + original.size; ++edit){
local_shift += (edit->len - (edit->end - edit->start));
}
token->size += local_shift;
shift_amount += local_shift;
}
#if 0
for (; token < end_token && edit < end_edit;){
local_shift = (edit->len - (edit->end - edit->start));
for (; token->start + token->size < edit->start && token < end_token; ++token){
token->start += shift_amount;
}
if (token->start <= edit->start){
original = *token;
if (original.start == edit->start){
shift_amount += local_shift;
token->start += shift_amount;
++edit;
}
for (; edit->start < original.start + original.size && edit < end_edit; ++edit){
local_shift = (edit->len - (edit->end - edit->start));
token->size += local_shift;
shift_amount += local_shift;
}
++token;
}
else{
shift_amount += local_shift;
++edit;
}
}
for (; token < end_token; ++token){
token->start += shift_amount;
}
#endif
}
}
@ -2303,7 +2333,7 @@ compute_this_indent(Buffer *buffer, Indent_Parse_State indent,
next_line_start = buffer_size(buffer);
}
if (prev_token.type == CPP_TOKEN_COMMENT &&
if ((prev_token.type == CPP_TOKEN_COMMENT || prev_token.type == CPP_TOKEN_STRING_CONSTANT) &&
prev_token.start <= this_line_start && prev_token.start + prev_token.size > this_line_start){
this_indent = previous_indent;
}