1 use {File, FileBuilder, Sink, SyntaxKind, Token};
7 use self::event_parser::Event;
9 pub fn parse(text: String, tokens: &[Token]) -> File {
10 let events = event_parser::parse(&text, tokens);
11 from_events_to_file(text, tokens, events)
14 fn from_events_to_file(text: String, tokens: &[Token], events: Vec<Event>) -> File {
15 let mut builder = FileBuilder::new(text);
18 let mut holes = Vec::new();
19 let mut forward_parents = Vec::new();
21 for (i, event) in events.iter().enumerate() {
22 if holes.last() == Some(&i) {
32 &Event::Start { .. } => {
33 forward_parents.clear();
36 let (kind, fwd) = match events[idx] {
40 } => (kind, forward_parent),
43 forward_parents.push((idx, kind));
44 if let Some(fwd) = fwd {
50 for &(idx, kind) in forward_parents.iter().into_iter().rev() {
51 builder.start_internal(kind);
57 while idx < tokens.len() {
58 let token = tokens[idx];
59 if is_insignificant(token.kind) {
61 builder.leaf(token.kind, token.len);
66 builder.finish_internal()
72 let token = tokens[idx];
73 if !is_insignificant(token.kind) {
77 builder.leaf(token.kind, token.len);
78 if n_raw_tokens == 0 {
82 &Event::Error { ref message } => builder.error().message(message.clone()).emit(),
88 fn is_insignificant(kind: SyntaxKind) -> bool {
90 WHITESPACE | COMMENT => true,