@@ -1075,7 +1075,7 @@ fn check_stream_eq(text: &str, meta: &[AlignMeta]) -> bool {
10751075 return `pub struct Edit { pub start: usize, pub end: usize, pub text: String }
10761076#[derive(Clone)]
10771077struct AlignMeta { kind: &'static str, off: usize, end: usize, nl: bool, fd: i64, pd: i64, lc: bool, lb: bool, hd: bool, td: i64 }
1078- struct Align { old_n: usize, new_n: usize, prefix: usize, suffix: usize, relexed: usize, stream_eq: bool }
1078+ struct Align { old_n: usize, new_n: usize, prefix: usize, suffix: usize, relexed: usize, stream_eq: Option< bool> }
10791079${ toMetaFn }
10801080fn compute_align_core(old_text: &str, old_toks: &[AlignMeta], new_text: &str, new_toks: &[AlignMeta]) -> (usize, usize, usize, usize) {
10811081 let old_n = old_toks.len();
@@ -1104,18 +1104,19 @@ fn compute_align_core(old_text: &str, old_toks: &[AlignMeta], new_text: &str, ne
11041104fn toks_from_meta<'a>(text: &'a str, meta: &[AlignMeta]) -> Vec<Tok<'a>> {
11051105 meta.iter().map(|m| Tok { kind: m.kind, text: &text[m.off..m.end], off: m.off, end: m.end, nl: m.nl }).collect()
11061106}
1107- ${ checkStreamEqFn } ${ windowHelpers } pub struct Doc { text: String, toks: Vec<AlignMeta>, align: Option<Align> }
1107+ ${ checkStreamEqFn } ${ windowHelpers } pub struct Doc { text: String, toks: Vec<AlignMeta>, align: Option<Align>, validate: bool }
11081108impl Doc {
1109- pub fn new(text: String) -> Doc { Doc { text: text.clone(), toks: ${ initToks } , align: None } }
1109+ pub fn new(text: String) -> Doc { Doc { text: text.clone(), toks: ${ initToks } , align: None, validate: false } }
1110+ pub fn set_validate(&mut self, v: bool) { self.validate = v; }
11101111 pub fn text(&self) -> &str { &self.text }
11111112 pub fn alignment(&self) -> Option<&Align> { self.align.as_ref() }
11121113 pub fn edit(&mut self, edits: &[Edit]) {
11131114 let old_text = self.text.clone();
11141115 let old_toks = self.toks.clone();
11151116 let mut relexed = 0usize;
11161117${ editBody }
1117- let stream_eq = check_stream_eq(&self.text, &self.toks);
11181118 let (old_n, new_n, prefix, suffix) = compute_align_core(&old_text, &old_toks, &self.text, &self.toks);
1119+ let stream_eq = if self.validate { Some(check_stream_eq(&self.text, &self.toks)) } else { None };
11191120 self.align = Some(Align { old_n, new_n, prefix, suffix, relexed, stream_eq });
11201121 }
11211122 pub fn parse(&self) -> Option<(Parser<'_>, i32)> {
@@ -1382,15 +1383,19 @@ fn main() {
13821383 let mut src = String::new();
13831384 std::io::stdin().read_to_string(&mut src).unwrap();
13841385 let args: Vec<String> = std::env::args().collect();
1385- if args.len() > 1 && args[1] == "edit-session" {
1386+ if args.len() > 1 && ( args[1] == "edit-session" || args[1] == "edit-session-fast") {
13861387 let (init, batches) = parse_edit_session(&src).unwrap();
13871388 let mut doc = Doc::new(init);
1389+ if args[1] == "edit-session" { doc.set_validate(true); }
13881390 for batch in &batches {
13891391 let edits: Vec<Edit> = batch.iter().map(|&(s, e, ref t)| Edit { start: s, end: e, text: t.clone() }).collect();
13901392 doc.edit(&edits);
13911393 }
13921394 if let Some(a) = doc.alignment() {
1393- eprintln!("{{\\"oldN\\":{},\\"newN\\":{},\\"prefix\\":{},\\"suffix\\":{},\\"relexed\\":{},\\"streamEq\\":{}}}", a.old_n, a.new_n, a.prefix, a.suffix, a.relexed, a.stream_eq);
1395+ match a.stream_eq {
1396+ Some(eq) => eprintln!("{{\\"oldN\\":{},\\"newN\\":{},\\"prefix\\":{},\\"suffix\\":{},\\"relexed\\":{},\\"streamEq\\":{}}}", a.old_n, a.new_n, a.prefix, a.suffix, a.relexed, eq),
1397+ None => eprintln!("{{\\"oldN\\":{},\\"newN\\":{},\\"prefix\\":{},\\"suffix\\":{},\\"relexed\\":{}}}", a.old_n, a.new_n, a.prefix, a.suffix, a.relexed),
1398+ }
13941399 }
13951400 match doc.parse() {
13961401 Some((p, root)) => {
0 commit comments