mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-06 04:08:40 +00:00
move syntax error to parser
This commit is contained in:
parent
61992dc1cd
commit
882c47f187
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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::*;
|
||||||
|
Loading…
Reference in New Issue
Block a user