void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result> &locations, String new_text) { // If the file is already open, I assume the editor will reload it. // If there are unsaved changes, the user will be asked on focus, // however that means either losing changes or losing replaces. FileAccess *f = FileAccess::open(fpath, FileAccess::READ); ERR_FAIL_COND(f == NULL); String buffer; int current_line = 1; ConservativeGetLine conservative; String line = conservative.get_line(f); String search_text = _finder->get_search_text(); int offset = 0; for (int i = 0; i < locations.size(); ++i) { int repl_line_number = locations[i].line_number; while (current_line < repl_line_number) { buffer += line; line = conservative.get_line(f); ++current_line; offset = 0; } int repl_begin = locations[i].begin + offset; int repl_end = locations[i].end + offset; int _; if (!find_next(line, search_text, repl_begin, _finder->is_match_case(), _finder->is_whole_words(), _, _)) { // Make sure the replace is still valid in case the file was tampered with. print_verbose(String("Occurrence no longer matches, replace will be ignored in {0}: line {1}, col {2}").format(varray(fpath, repl_line_number, repl_begin))); continue; } line = line.left(repl_begin) + new_text + line.right(repl_end); // keep an offset in case there are successive replaces in the same line offset += new_text.length() - (repl_end - repl_begin); } buffer += line; while (!f->eof_reached()) { buffer += conservative.get_line(f); } // Now the modified contents are in the buffer, rewrite the file with our changes Error err = f->reopen(fpath, FileAccess::WRITE); ERR_FAIL_COND(err != OK); f->store_string(buffer); f->close(); }
void FindInFilesPanel::apply_replaces_in_file(String fpath, PoolIntArray locations, String text) { ERR_FAIL_COND(locations.size() % 3 != 0); //print_line(String("Replacing {0} occurrences in {1}").format(varray(fpath, locations.size() / 3))); // If the file is already open, I assume the editor will reload it. // If there are unsaved changes, the user will be asked on focus, // however that means either loosing changes or loosing replaces. FileAccess *f = FileAccess::open(fpath, FileAccess::READ); ERR_FAIL_COND(f == NULL); String buffer; int current_line = 1; ConservativeGetLine conservative; String line = conservative.get_line(f); PoolIntArray::Read locations_read = locations.read(); for (int i = 0; i < locations.size(); i += 3) { int repl_line_number = locations_read[i]; int repl_begin = locations_read[i + 1]; int repl_end = locations_read[i + 2]; while (current_line < repl_line_number) { buffer += line; line = conservative.get_line(f); ++current_line; } line = line.left(repl_begin) + text + line.right(repl_end); } buffer += line; while (!f->eof_reached()) { buffer += conservative.get_line(f); } // Now the modified contents are in the buffer, rewrite the file with our changes Error err = f->reopen(fpath, FileAccess::WRITE); ERR_FAIL_COND(err != OK); f->store_string(buffer); f->close(); }