move syntax error to parser

This commit is contained in:
Aleksey Kladov 2019-02-20 23:17:07 +03:00
parent 61992dc1cd
commit 882c47f187
6 changed files with 24 additions and 25 deletions

View File

@ -9,7 +9,7 @@ mod grammar;
mod reparsing; mod reparsing;
use crate::{ use crate::{
SyntaxError, SyntaxKind, SmolStr, SyntaxKind, SmolStr, SyntaxError,
parsing::{ parsing::{
builder::GreenBuilder, builder::GreenBuilder,
input::ParserInput, input::ParserInput,
@ -21,11 +21,14 @@ use crate::{
pub use self::lexer::{tokenize, Token}; pub use self::lexer::{tokenize, Token};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ParseError(pub String);
pub(crate) use self::reparsing::incremental_reparse; pub(crate) use self::reparsing::incremental_reparse;
pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) { pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) {
let tokens = tokenize(&text); let tokens = tokenize(&text);
parse_with(GreenBuilder::new(), text, &tokens, grammar::root) parse_with(GreenBuilder::default(), text, &tokens, grammar::root)
} }
fn parse_with<S: TreeSink>( fn parse_with<S: TreeSink>(
@ -57,7 +60,7 @@ trait TreeSink {
/// branch as current. /// branch as current.
fn finish_branch(&mut self); fn finish_branch(&mut self);
fn error(&mut self, error: SyntaxError); fn error(&mut self, error: ParseError);
/// Complete tree building. Make sure that /// Complete tree building. Make sure that
/// `start_branch` and `finish_branch` calls /// `start_branch` and `finish_branch` calls

View File

@ -1,19 +1,24 @@
use crate::{ use crate::{
parsing::TreeSink, SmolStr, SyntaxKind, SyntaxError, SyntaxErrorKind, TextUnit,
parsing::{TreeSink, ParseError},
syntax_node::{GreenNode, RaTypes}, syntax_node::{GreenNode, RaTypes},
SmolStr, SyntaxKind, SyntaxError,
}; };
use rowan::GreenNodeBuilder; use rowan::GreenNodeBuilder;
pub(crate) struct GreenBuilder { pub(crate) struct GreenBuilder {
text_pos: TextUnit,
errors: Vec<SyntaxError>, errors: Vec<SyntaxError>,
inner: GreenNodeBuilder<RaTypes>, inner: GreenNodeBuilder<RaTypes>,
} }
impl GreenBuilder { impl Default for GreenBuilder {
pub(crate) fn new() -> GreenBuilder { fn default() -> GreenBuilder {
GreenBuilder { errors: Vec::new(), inner: GreenNodeBuilder::new() } GreenBuilder {
text_pos: TextUnit::default(),
errors: Vec::new(),
inner: GreenNodeBuilder::new(),
}
} }
} }
@ -21,6 +26,7 @@ impl TreeSink for GreenBuilder {
type Tree = (GreenNode, Vec<SyntaxError>); type Tree = (GreenNode, Vec<SyntaxError>);
fn leaf(&mut self, kind: SyntaxKind, text: SmolStr) { fn leaf(&mut self, kind: SyntaxKind, text: SmolStr) {
self.text_pos += TextUnit::of_str(text.as_str());
self.inner.leaf(kind, text); self.inner.leaf(kind, text);
} }
@ -32,7 +38,8 @@ impl TreeSink for GreenBuilder {
self.inner.finish_internal(); self.inner.finish_internal();
} }
fn error(&mut self, error: SyntaxError) { fn error(&mut self, error: ParseError) {
let error = SyntaxError::new(SyntaxErrorKind::ParseError(error), self.text_pos);
self.errors.push(error) self.errors.push(error)
} }

View File

@ -13,14 +13,9 @@ use crate::{
SmolStr, SmolStr,
SyntaxKind::{self, *}, SyntaxKind::{self, *},
TextRange, TextUnit, TextRange, TextUnit,
syntax_error::{
ParseError,
SyntaxError,
SyntaxErrorKind,
},
parsing::{ parsing::{
ParseError, TreeSink,
lexer::Token, lexer::Token,
TreeSink,
}, },
}; };
@ -159,9 +154,7 @@ impl<'a, S: TreeSink> EventProcessor<'a, S> {
.sum::<TextUnit>(); .sum::<TextUnit>();
self.leaf(kind, len, n_raw_tokens); self.leaf(kind, len, n_raw_tokens);
} }
Event::Error { msg } => self Event::Error { msg } => self.sink.error(msg),
.sink
.error(SyntaxError::new(SyntaxErrorKind::ParseError(msg), self.text_pos)),
} }
} }
self.sink self.sink

View File

@ -3,10 +3,9 @@ use std::cell::Cell;
use drop_bomb::DropBomb; use drop_bomb::DropBomb;
use crate::{ use crate::{
syntax_error::ParseError,
SyntaxKind::{self, ERROR, EOF, TOMBSTONE}, SyntaxKind::{self, ERROR, EOF, TOMBSTONE},
parsing::{ parsing::{
TokenSource, TokenSource, ParseError,
token_set::TokenSet, token_set::TokenSet,
event::Event, event::Event,
}, },

View File

@ -61,7 +61,7 @@ fn reparse_block<'node>(
if !is_balanced(&tokens) { if !is_balanced(&tokens) {
return None; return None;
} }
let (green, new_errors) = parse_with(GreenBuilder::new(), &text, &tokens, reparser); let (green, new_errors) = parse_with(GreenBuilder::default(), &text, &tokens, reparser);
Some((node, green, new_errors)) Some((node, green, new_errors))
} }

View File

@ -1,6 +1,6 @@
use std::fmt; use std::fmt;
use crate::{TextRange, TextUnit}; use crate::{TextRange, TextUnit, parsing::ParseError};
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct SyntaxError { pub struct SyntaxError {
@ -95,9 +95,6 @@ pub enum SyntaxErrorKind {
InvalidMatchInnerAttr, InvalidMatchInnerAttr,
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ParseError(pub String);
impl fmt::Display for SyntaxErrorKind { impl fmt::Display for SyntaxErrorKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::SyntaxErrorKind::*; use self::SyntaxErrorKind::*;