1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use crate::syntax::*;
use crate::*;

#[derive(Clone)]
pub struct ModuleCell {
    pub tree: Arc<Tree>,
    pub source: Arc<Source>,
    pub diagnostics: Vec<Diagnostic>,
}

impl ModuleCell {
    pub fn new(source: Arc<Source>) -> ModuleCell {
        let (tree, diagnostics) = Parser::new(source.clone()).parse();
        ModuleCell {
            tree,
            source,
            diagnostics,
        }
    }

    pub fn edit(&mut self, mut edits: Vec<(Span, String)>) {
        edits.sort_by(|(a, _), (b, _)| a.start.offset.cmp(&b.start.offset));

        let mut current_code = self.source.code.encode_utf16().collect::<Vec<_>>();
        let original_len = current_code.len();
        let mut new_code = vec![];

        for (span, code) in edits {
            let number_of_chars_to_append = span.start.offset - (original_len - current_code.len());
            let number_of_chars_to_skip = span.end.offset - span.start.offset;

            for _ in 0..number_of_chars_to_append {
                new_code.push(current_code.remove(0));
            }

            for _ in 0..number_of_chars_to_skip {
                current_code.remove(0);
            }

            new_code.extend(code.encode_utf16());
        }

        new_code.extend(current_code);

        let new_code = characters_to_string(new_code.into_iter());

        let new_source = Source::new(self.source.kind.clone(), self.source.uri.clone(), new_code);
        let (tree, diagnostics) = Parser::new(new_source.clone()).parse();

        self.source = new_source;
        self.tree = tree;
        self.diagnostics = diagnostics;
    }

    pub fn ends_with_error(&self) -> bool {
        for d in self.diagnostics.iter() {
            if d.span().end.offset == self.source.code.len() {
                return true;
            }
        }
        false
    }
}