From 876bca27e89bb602d74b45ee7cb9be49fbba83f8 Mon Sep 17 00:00:00 2001 From: Shuhei Takahashi Date: Tue, 4 Feb 2025 23:30:11 +0900 Subject: [PATCH] Introduce ErrorStatement --- src/analyze/mod.rs | 5 ++--- src/analyze/shallow.rs | 2 +- src/analyze/tests.rs | 2 +- src/ast/mod.rs | 36 ++++++++++++++++++++++++++++++------ src/ast/parser.rs | 28 +++++++++++++++++----------- 5 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/analyze/mod.rs b/src/analyze/mod.rs index fea692f..4cb44e5 100644 --- a/src/analyze/mod.rs +++ b/src/analyze/mod.rs @@ -197,8 +197,7 @@ fn collect_symbols(node: &dyn Node, line_index: &LineIndex) -> Vec {} - Statement::UnmatchedBrace(_) => {} + Statement::Error(_) => {} } } else { for child in node.children() { @@ -544,7 +543,7 @@ impl Analyzer { events.push(AnalyzedEvent::Conditions(condition_blocks)); Ok(events) } - Statement::Unknown(_) | Statement::UnmatchedBrace(_) => Ok(Vec::new()), + Statement::Error(_) => Ok(Vec::new()), } }) .collect::>>()? diff --git a/src/analyze/shallow.rs b/src/analyze/shallow.rs index 3e263e1..a33d64f 100644 --- a/src/analyze/shallow.rs +++ b/src/analyze/shallow.rs @@ -303,7 +303,7 @@ impl ShallowAnalyzer { } } } - Statement::Unknown(_) | Statement::UnmatchedBrace(_) => {} + Statement::Error(_) => {} } } diff --git a/src/analyze/tests.rs b/src/analyze/tests.rs index ad608c5..aafdebe 100644 --- a/src/analyze/tests.rs +++ b/src/analyze/tests.rs @@ -32,7 +32,7 @@ fn test_analyze_smoke() { .ast_root .statements .iter() - .all(|s| !matches!(s, Statement::Unknown(_) | Statement::UnmatchedBrace(_)))); + .all(|s| !matches!(s, Statement::Error(_)))); // Inspect the top-level scope. let scope = file.scope_at(0); diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 6bfa570..493a30b 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -62,6 +62,7 @@ impl<'i, 'n> Iterator for Walk<'i, 'n> { Some(node) } } + pub struct FilterWalk<'i, 'n, T> { #[allow(clippy::type_complexity)] inner: std::iter::FilterMap, fn(&'n dyn Node<'i>) -> Option<&'n T>>, @@ -88,8 +89,7 @@ pub enum Statement<'i> { Assignment(Box>), Call(Box>), Condition(Box>), - Unknown(Box>), - UnmatchedBrace(Box>), + Error(Box>), } impl<'i> Node<'i> for Statement<'i> { @@ -102,8 +102,7 @@ impl<'i> Node<'i> for Statement<'i> { Statement::Assignment(assignment) => vec![assignment.as_node()], Statement::Call(call) => vec![call.as_node()], Statement::Condition(condition) => vec![condition.as_node()], - Statement::Unknown(unknown_statement) => vec![unknown_statement.as_node()], - Statement::UnmatchedBrace(unmatched_brace) => vec![unmatched_brace.as_node()], + Statement::Error(error) => vec![error.as_node()], } } @@ -112,8 +111,7 @@ impl<'i> Node<'i> for Statement<'i> { Statement::Assignment(assignment) => assignment.span, Statement::Call(call) => call.span, Statement::Condition(condition) => condition.span, - Statement::Unknown(unknown_statement) => unknown_statement.span, - Statement::UnmatchedBrace(unmatched_brace) => unmatched_brace.span, + Statement::Error(error) => error.span(), } } @@ -585,6 +583,32 @@ impl<'i> Node<'i> for ListLiteral<'i> { } } +#[derive(Clone, Debug, Eq, PartialEq, Hash)] +pub enum ErrorStatement<'i> { + UnknownStatement(Box>), + UnmatchedBrace(Box>), +} + +impl<'i> Node<'i> for ErrorStatement<'i> { + fn as_node(&self) -> &dyn Node<'i> { + self + } + + fn children(&self) -> Vec<&dyn Node<'i>> { + match self { + ErrorStatement::UnknownStatement(unknown) => vec![unknown.as_node()], + ErrorStatement::UnmatchedBrace(unmatched_brace) => vec![unmatched_brace.as_node()], + } + } + + fn span(&self) -> Span<'i> { + match self { + ErrorStatement::UnknownStatement(unknown) => unknown.span, + ErrorStatement::UnmatchedBrace(unmatched_brace) => unmatched_brace.span, + } + } +} + #[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct UnknownStatement<'i> { pub text: &'i str, diff --git a/src/ast/parser.rs b/src/ast/parser.rs index a51b1c3..2255563 100644 --- a/src/ast/parser.rs +++ b/src/ast/parser.rs @@ -129,10 +129,12 @@ fn convert_block(pair: Pair) -> Block { .into_inner() .filter_map(|pair| match pair.as_rule() { Rule::statement => Some(convert_statement(pair, std::mem::take(&mut comments))), - Rule::error => Some(Statement::Unknown(Box::new(UnknownStatement { - text: pair.as_str(), - span: pair.as_span(), - }))), + Rule::error => Some(Statement::Error(Box::new( + ErrorStatement::UnknownStatement(Box::new(UnknownStatement { + text: pair.as_str(), + span: pair.as_span(), + })), + ))), Rule::comment => { comments .lines @@ -319,13 +321,17 @@ fn convert_file(pair: Pair) -> Block { .into_inner() .filter_map(|pair| match pair.as_rule() { Rule::statement => Some(convert_statement(pair, std::mem::take(&mut comments))), - Rule::error => Some(Statement::Unknown(Box::new(UnknownStatement { - text: pair.as_str(), - span: pair.as_span(), - }))), - Rule::unmatched_brace => Some(Statement::UnmatchedBrace(Box::new(UnmatchedBrace { - span: pair.as_span(), - }))), + Rule::error => Some(Statement::Error(Box::new( + ErrorStatement::UnknownStatement(Box::new(UnknownStatement { + text: pair.as_str(), + span: pair.as_span(), + })), + ))), + Rule::unmatched_brace => Some(Statement::Error(Box::new( + ErrorStatement::UnmatchedBrace(Box::new(UnmatchedBrace { + span: pair.as_span(), + })), + ))), Rule::comment => { comments .lines