Add --edit flag to parse command

This commit is contained in:
Max Brunsfeld 2019-04-08 09:21:03 -07:00
parent 2bd14a8463
commit 701d63dab7
7 changed files with 136 additions and 55 deletions

View file

@ -1,9 +1,10 @@
use super::helpers::allocations;
use super::helpers::edits::{get_random_edit, invert_edit, perform_edit};
use super::helpers::edits::{get_random_edit, invert_edit};
use super::helpers::fixtures::{fixtures_dir, get_language, get_test_language};
use super::helpers::random::Rand;
use super::helpers::scope_sequence::ScopeSequence;
use crate::generate;
use crate::parse::perform_edit;
use crate::test::{parse_tests, print_diff, print_diff_key, strip_sexp_fields, TestEntry};
use crate::util;
use lazy_static::lazy_static;

View file

@ -1,13 +1,7 @@
use super::random::Rand;
use crate::parse::Edit;
use std::ops::Range;
use std::str;
use tree_sitter::{InputEdit, Point, Tree};
pub struct Edit {
pub position: usize,
pub deleted_length: usize,
pub inserted_text: Vec<u8>,
}
#[derive(Debug)]
pub struct ReadRecorder<'a> {
@ -56,26 +50,6 @@ impl<'a> ReadRecorder<'a> {
}
}
pub fn perform_edit(tree: &mut Tree, input: &mut Vec<u8>, edit: &Edit) -> InputEdit {
let start_byte = edit.position;
let old_end_byte = edit.position + edit.deleted_length;
let new_end_byte = edit.position + edit.inserted_text.len();
let start_position = position_for_offset(input, start_byte);
let old_end_position = position_for_offset(input, old_end_byte);
input.splice(start_byte..old_end_byte, edit.inserted_text.iter().cloned());
let new_end_position = position_for_offset(input, new_end_byte);
let edit = InputEdit {
start_byte,
old_end_byte,
new_end_byte,
start_position,
old_end_position,
new_end_position,
};
tree.edit(&edit);
edit
}
pub fn invert_edit(input: &Vec<u8>, edit: &Edit) -> Edit {
let position = edit.position;
let removed_content = &input[position..(position + edit.deleted_length)];
@ -130,16 +104,3 @@ pub fn get_random_edit(rand: &mut Rand, input: &Vec<u8>) -> Edit {
}
}
}
fn position_for_offset(input: &Vec<u8>, offset: usize) -> Point {
let mut result = Point { row: 0, column: 0 };
for c in &input[0..offset] {
if *c as char == '\n' {
result.row += 1;
result.column = 0;
} else {
result.column += 1;
}
}
result
}

View file

@ -1,7 +1,8 @@
use super::helpers::edits::{get_random_edit, perform_edit};
use super::helpers::edits::get_random_edit;
use super::helpers::fixtures::{get_language, get_test_language};
use super::helpers::random::Rand;
use crate::generate::generate_parser_for_grammar;
use crate::parse::perform_edit;
use tree_sitter::{Node, Parser, Point, Tree};
const JSON_EXAMPLE: &'static str = r#"

View file

@ -1,6 +1,7 @@
use super::helpers::edits::{perform_edit, Edit, ReadRecorder};
use super::helpers::edits::ReadRecorder;
use super::helpers::fixtures::{get_language, get_test_language};
use crate::generate::generate_parser_for_grammar;
use crate::parse::{perform_edit, Edit};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::{thread, time};
use tree_sitter::{InputEdit, LogType, Parser, Point, Range};

View file

@ -1,5 +1,6 @@
use super::helpers::edits::{invert_edit, perform_edit, Edit};
use super::helpers::edits::invert_edit;
use super::helpers::fixtures::get_language;
use crate::parse::{perform_edit, Edit};
use std::str;
use tree_sitter::{InputEdit, Parser, Point, Range, Tree};