rust/src/lib.rs

50 lines
1.4 KiB
Rust
Raw Normal View History

2017-12-29 21:33:04 +01:00
extern crate unicode_xid;
2017-12-28 22:56:36 +01:00
mod text;
mod tree;
mod lexer;
2017-12-31 21:34:29 +01:00
mod parser;
2017-12-28 22:56:36 +01:00
2018-01-28 00:31:23 +01:00
#[cfg_attr(rustfmt, rustfmt_skip)]
2017-12-28 22:56:36 +01:00
pub mod syntax_kinds;
2018-01-28 00:31:23 +01:00
pub use text::{TextRange, TextUnit};
pub use tree::{File, FileBuilder, Node, Sink, SyntaxKind, Token};
2017-12-31 15:54:33 +01:00
pub use lexer::{next_token, tokenize};
2017-12-31 21:34:29 +01:00
pub use parser::parse;
pub mod utils {
use std::fmt::Write;
use {File, Node};
pub fn dump_tree(file: &File) -> String {
let mut result = String::new();
go(file.root(), &mut result, 0);
return result;
fn go(node: Node, buff: &mut String, level: usize) {
buff.push_str(&String::from(" ").repeat(level));
write!(buff, "{:?}\n", node).unwrap();
let my_errors = node.errors().filter(|e| e.after_child().is_none());
2018-01-28 00:31:23 +01:00
let parent_errors = node.parent()
.into_iter()
.flat_map(|n| n.errors())
.filter(|e| e.after_child() == Some(node));
for err in my_errors {
buff.push_str(&String::from(" ").repeat(level));
write!(buff, "err: `{}`\n", err.message()).unwrap();
}
for child in node.children() {
go(child, buff, level + 1)
}
for err in parent_errors {
buff.push_str(&String::from(" ").repeat(level));
write!(buff, "err: `{}`\n", err.message()).unwrap();
}
}
}
}