This commit is contained in:
Aleksey Kladov 2019-02-23 16:07:29 +03:00
parent e5fb33a946
commit 0c1cb98182
4 changed files with 19 additions and 23 deletions

View file

@ -2,17 +2,13 @@
//! incremental reparsing.
mod lexer;
mod input;
mod builder;
mod text_token_source;
mod text_tree_sink;
mod reparsing;
use crate::{
SyntaxError,
syntax_node::GreenNode,
parsing::{
builder::TreeBuilder,
input::ParserInput,
},
};
pub use self::lexer::{tokenize, Token};
@ -21,8 +17,8 @@ pub(crate) use self::reparsing::incremental_reparse;
pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) {
let tokens = tokenize(&text);
let token_source = ParserInput::new(text, &tokens);
let mut tree_sink = TreeBuilder::new(text, &tokens);
let token_source = text_token_source::TextTokenSource::new(text, &tokens);
let mut tree_sink = text_tree_sink::TextTreeSink::new(text, &tokens);
ra_parser::parse(&token_source, &mut tree_sink);
tree_sink.finish()
}

View file

@ -14,8 +14,8 @@ use crate::{
algo,
syntax_node::{GreenNode, SyntaxNode},
parsing::{
input::ParserInput,
builder::TreeBuilder,
text_token_source::TextTokenSource,
text_tree_sink::TextTreeSink,
lexer::{tokenize, Token},
}
};
@ -68,8 +68,8 @@ fn reparse_block<'node>(
if !is_balanced(&tokens) {
return None;
}
let token_source = ParserInput::new(&text, &tokens);
let mut tree_sink = TreeBuilder::new(&text, &tokens);
let token_source = TextTokenSource::new(&text, &tokens);
let mut tree_sink = TextTreeSink::new(&text, &tokens);
reparser.parse(&token_source, &mut tree_sink);
let (green, new_errors) = tree_sink.finish();
Some((node, green, new_errors))

View file

@ -5,7 +5,7 @@ use crate::{
parsing::lexer::Token,
};
pub(crate) struct ParserInput<'t> {
pub(crate) struct TextTokenSource<'t> {
text: &'t str,
/// start position of each token(expect whitespace and comment)
/// ```non-rust
@ -25,7 +25,7 @@ pub(crate) struct ParserInput<'t> {
tokens: Vec<Token>,
}
impl<'t> TokenSource for ParserInput<'t> {
impl<'t> TokenSource for TextTokenSource<'t> {
fn token_kind(&self, pos: usize) -> SyntaxKind {
if !(pos < self.tokens.len()) {
return EOF;
@ -48,9 +48,9 @@ impl<'t> TokenSource for ParserInput<'t> {
}
}
impl<'t> ParserInput<'t> {
impl<'t> TextTokenSource<'t> {
/// Generate input from tokens(expect comment and whitespace).
pub fn new(text: &'t str, raw_tokens: &'t [Token]) -> ParserInput<'t> {
pub fn new(text: &'t str, raw_tokens: &'t [Token]) -> TextTokenSource<'t> {
let mut tokens = Vec::new();
let mut start_offsets = Vec::new();
let mut len = 0.into();
@ -62,6 +62,6 @@ impl<'t> ParserInput<'t> {
len += token.len;
}
ParserInput { text, start_offsets, tokens }
TextTokenSource { text, start_offsets, tokens }
}
}

View file

@ -12,8 +12,8 @@ use crate::{
/// Bridges the parser with our specific syntax tree representation.
///
/// `TreeBuilder` also handles attachment of trivia (whitespace) to nodes.
pub(crate) struct TreeBuilder<'a> {
/// `TextTreeSink` also handles attachment of trivia (whitespace) to nodes.
pub(crate) struct TextTreeSink<'a> {
text: &'a str,
tokens: &'a [Token],
text_pos: TextUnit,
@ -29,7 +29,7 @@ enum State {
PendingFinish,
}
impl<'a> TreeSink for TreeBuilder<'a> {
impl<'a> TreeSink for TextTreeSink<'a> {
fn leaf(&mut self, kind: SyntaxKind, n_tokens: u8) {
match mem::replace(&mut self.state, State::Normal) {
State::PendingStart => unreachable!(),
@ -91,9 +91,9 @@ impl<'a> TreeSink for TreeBuilder<'a> {
}
}
impl<'a> TreeBuilder<'a> {
pub(super) fn new(text: &'a str, tokens: &'a [Token]) -> TreeBuilder<'a> {
TreeBuilder {
impl<'a> TextTreeSink<'a> {
pub(super) fn new(text: &'a str, tokens: &'a [Token]) -> TextTreeSink<'a> {
TextTreeSink {
text,
tokens,
text_pos: 0.into(),