ast: adopt Kinds in more places

This commit is contained in:
Peter Ammon
2025-04-26 21:57:37 -07:00
parent 01bd854f25
commit bf78309f79

View File

@@ -303,13 +303,6 @@ fn as_keyword(&self) -> Option<&dyn Keyword> {
fn as_token(&self) -> Option<&dyn Token> { fn as_token(&self) -> Option<&dyn Token> {
None None
} }
fn as_mut_keyword(&mut self) -> Option<&mut dyn Keyword> {
None
}
fn as_mut_token(&mut self) -> Option<&mut dyn Token> {
None
}
} }
// Support casting to this type. // Support casting to this type.
@@ -880,9 +873,6 @@ fn as_leaf(&self) -> Option<&dyn Leaf> {
fn as_keyword(&self) -> Option<&dyn Keyword> { fn as_keyword(&self) -> Option<&dyn Keyword> {
Some(self) Some(self)
} }
fn as_mut_keyword(&mut self) -> Option<&mut dyn Keyword> {
Some(self)
}
} }
impl Node for $name { impl Node for $name {
fn typ(&self) -> Type { fn typ(&self) -> Type {
@@ -933,9 +923,6 @@ fn as_leaf(&self) -> Option<&dyn Leaf> {
fn as_token(&self) -> Option<&dyn Token> { fn as_token(&self) -> Option<&dyn Token> {
Some(self) Some(self)
} }
fn as_mut_token(&mut self) -> Option<&mut dyn Token> {
Some(self)
}
} }
impl Token for $name { impl Token for $name {
fn token_type(&self) -> ParseTokenType { fn token_type(&self) -> ParseTokenType {
@@ -2641,74 +2628,54 @@ struct Populator<'a> {
impl<'s> NodeVisitorMut for Populator<'s> { impl<'s> NodeVisitorMut for Populator<'s> {
fn visit_mut(&mut self, node: &mut dyn NodeMut) -> VisitResult { fn visit_mut(&mut self, node: &mut dyn NodeMut) -> VisitResult {
match node.typ() { use KindMut as KM;
Type::argument => { match node.kind_mut() {
self.visit_argument(node.as_mut_argument().unwrap()); // Leaves
return VisitResult::Continue(()); KM::Argument(node) => self.visit_argument(node),
} KM::VariableAssignment(node) => self.visit_variable_assignment(node),
Type::variable_assignment => { KM::JobContinuation(node) => self.visit_job_continuation(node),
self.visit_variable_assignment(node.as_mut_variable_assignment().unwrap()); KM::Token(node) => self.visit_token(node),
return VisitResult::Continue(()); KM::Keyword(node) => {
} return self.visit_keyword(node);
Type::job_continuation => {
self.visit_job_continuation(node.as_mut_job_continuation().unwrap());
return VisitResult::Continue(());
}
Type::token_base => {
self.visit_token(node.as_mut_token().unwrap());
return VisitResult::Continue(());
}
Type::keyword_base => {
return self.visit_keyword(node.as_mut_keyword().unwrap());
}
Type::maybe_newlines => {
self.visit_maybe_newlines(node.as_mut_maybe_newlines().unwrap());
return VisitResult::Continue(());
} }
KM::MaybeNewlines(node) => self.visit_maybe_newlines(node),
_ => (), // Branches
} KM::Redirection(node) => node.accept_mut(self),
KM::ArgumentOrRedirection(node) => node.accept_mut(self),
KM::Statement(node) => node.accept_mut(self),
KM::JobPipeline(node) => node.accept_mut(self),
KM::JobConjunction(node) => node.accept_mut(self),
KM::ForHeader(node) => node.accept_mut(self),
KM::WhileHeader(node) => node.accept_mut(self),
KM::FunctionHeader(node) => node.accept_mut(self),
KM::BeginHeader(node) => node.accept_mut(self),
KM::BlockStatement(node) => node.accept_mut(self),
KM::BraceStatement(node) => node.accept_mut(self),
KM::IfClause(node) => node.accept_mut(self),
KM::ElseifClause(node) => node.accept_mut(self),
KM::ElseClause(node) => node.accept_mut(self),
KM::IfStatement(node) => node.accept_mut(self),
KM::CaseItem(node) => node.accept_mut(self),
KM::SwitchStatement(node) => node.accept_mut(self),
KM::DecoratedStatement(node) => node.accept_mut(self),
KM::NotStatement(node) => node.accept_mut(self),
KM::JobConjunctionContinuation(node) => node.accept_mut(self),
KM::AndorJob(node) => node.accept_mut(self),
match node.category() { // Lists
Category::leaf => {} KM::VariableAssignmentList(node) => self.populate_list(node, false),
// Visit branch nodes by just calling accept() to visit their fields. KM::ArgumentOrRedirectionList(node) => self.populate_list(node, false),
Category::branch => { KM::ElseifClauseList(node) => self.populate_list(node, false),
// This field is a direct embedding of an AST value. KM::JobContinuationList(node) => self.populate_list(node, false),
node.accept_mut(self); KM::AndorJobList(node) => self.populate_list(node, false),
return VisitResult::Continue(()); KM::JobConjunctionContinuationList(node) => self.populate_list(node, false),
} KM::CaseItemList(node) => self.populate_list(node, false),
Category::list => { KM::ArgumentList(node) => self.populate_list(node, false),
// This field is an embedding of an array of (pointers to) ContentsNode. KM::JobList(node) => self.populate_list(node, false),
// Parse as many as we can.
match node.typ() { // Weird top-level case, not actually a list.
Type::andor_job_list => { KM::FreestandingArgumentList(node) => node.accept_mut(self),
self.populate_list(node.as_mut_andor_job_list().unwrap(), false)
}
Type::argument_list => {
self.populate_list(node.as_mut_argument_list().unwrap(), false)
}
Type::argument_or_redirection_list => self
.populate_list(node.as_mut_argument_or_redirection_list().unwrap(), false),
Type::case_item_list => {
self.populate_list(node.as_mut_case_item_list().unwrap(), false)
}
Type::elseif_clause_list => {
self.populate_list(node.as_mut_elseif_clause_list().unwrap(), false)
}
Type::job_conjunction_continuation_list => self.populate_list(
node.as_mut_job_conjunction_continuation_list().unwrap(),
false,
),
Type::job_continuation_list => {
self.populate_list(node.as_mut_job_continuation_list().unwrap(), false)
}
Type::job_list => self.populate_list(node.as_mut_job_list().unwrap(), false),
Type::variable_assignment_list => {
self.populate_list(node.as_mut_variable_assignment_list().unwrap(), false)
}
_ => (),
}
}
} }
VisitResult::Continue(()) VisitResult::Continue(())
} }