Implement all ast node iteration.
This commit is contained in:
		
							parent
							
								
									875a50ae46
								
							
						
					
					
						commit
						8784da5179
					
				
							
								
								
									
										102
									
								
								src/iter/all_ast_node_iter.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								src/iter/all_ast_node_iter.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | ||||
| use std::collections::VecDeque; | ||||
| 
 | ||||
| use super::ast_node::AstNode; | ||||
| use super::ast_node_iter::AstNodeIter; | ||||
| 
 | ||||
| pub struct AllAstNodeIter<'r, 's> { | ||||
|     root: Option<AstNode<'r, 's>>, | ||||
|     queue: VecDeque<AstNodeIter<'r, 's>>, | ||||
| } | ||||
| 
 | ||||
| impl<'r, 's> Iterator for AllAstNodeIter<'r, 's> { | ||||
|     type Item = AstNode<'r, 's>; | ||||
| 
 | ||||
|     fn next(&mut self) -> Option<Self::Item> { | ||||
|         if let Some(root) = self.root.take() { | ||||
|             self.queue.push_back(AstNodeIter::from_ast_node(&root)); | ||||
|             return Some(root); | ||||
|         } | ||||
|         while let Some(child) = self.queue.front_mut() { | ||||
|             let next_elem_this_iter = match child { | ||||
|                 AstNodeIter::Document(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Heading(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Section(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Paragraph(ref mut i) => i.next(), | ||||
|                 AstNodeIter::PlainList(ref mut i) => i.next(), | ||||
|                 AstNodeIter::PlainListItem(ref mut i) => i.next(), | ||||
|                 AstNodeIter::GreaterBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::DynamicBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::FootnoteDefinition(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Comment(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Drawer(ref mut i) => i.next(), | ||||
|                 AstNodeIter::PropertyDrawer(ref mut i) => i.next(), | ||||
|                 AstNodeIter::NodeProperty(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Table(ref mut i) => i.next(), | ||||
|                 AstNodeIter::TableRow(ref mut i) => i.next(), | ||||
|                 AstNodeIter::VerseBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::CommentBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::ExampleBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::ExportBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::SrcBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Clock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::DiarySexp(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Planning(ref mut i) => i.next(), | ||||
|                 AstNodeIter::FixedWidthArea(ref mut i) => i.next(), | ||||
|                 AstNodeIter::HorizontalRule(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Keyword(ref mut i) => i.next(), | ||||
|                 AstNodeIter::BabelCall(ref mut i) => i.next(), | ||||
|                 AstNodeIter::LatexEnvironment(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Bold(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Italic(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Underline(ref mut i) => i.next(), | ||||
|                 AstNodeIter::StrikeThrough(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Code(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Verbatim(ref mut i) => i.next(), | ||||
|                 AstNodeIter::PlainText(ref mut i) => i.next(), | ||||
|                 AstNodeIter::RegularLink(ref mut i) => i.next(), | ||||
|                 AstNodeIter::RadioLink(ref mut i) => i.next(), | ||||
|                 AstNodeIter::RadioTarget(ref mut i) => i.next(), | ||||
|                 AstNodeIter::PlainLink(ref mut i) => i.next(), | ||||
|                 AstNodeIter::AngleLink(ref mut i) => i.next(), | ||||
|                 AstNodeIter::OrgMacro(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Entity(ref mut i) => i.next(), | ||||
|                 AstNodeIter::LatexFragment(ref mut i) => i.next(), | ||||
|                 AstNodeIter::ExportSnippet(ref mut i) => i.next(), | ||||
|                 AstNodeIter::FootnoteReference(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Citation(ref mut i) => i.next(), | ||||
|                 AstNodeIter::CitationReference(ref mut i) => i.next(), | ||||
|                 AstNodeIter::InlineBabelCall(ref mut i) => i.next(), | ||||
|                 AstNodeIter::InlineSourceBlock(ref mut i) => i.next(), | ||||
|                 AstNodeIter::LineBreak(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Target(ref mut i) => i.next(), | ||||
|                 AstNodeIter::StatisticsCookie(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Subscript(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Superscript(ref mut i) => i.next(), | ||||
|                 AstNodeIter::TableCell(ref mut i) => i.next(), | ||||
|                 AstNodeIter::Timestamp(ref mut i) => i.next(), | ||||
|             }; | ||||
|             if let Some(next_elem_this_iter) = next_elem_this_iter { | ||||
|                 self.queue | ||||
|                     .push_back(AstNodeIter::from_ast_node(&next_elem_this_iter)); | ||||
|                 return Some(next_elem_this_iter); | ||||
|             } else { | ||||
|                 self.queue.pop_front(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         None | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'r, 's> IntoIterator for AstNode<'r, 's> { | ||||
|     type Item = AstNode<'r, 's>; | ||||
| 
 | ||||
|     type IntoIter = AllAstNodeIter<'r, 's>; | ||||
| 
 | ||||
|     fn into_iter(self) -> Self::IntoIter { | ||||
|         AllAstNodeIter { | ||||
|             root: Some(self), | ||||
|             queue: VecDeque::new(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -131,6 +131,71 @@ pub enum AstNodeIter<'r, 's> { | ||||
|     Timestamp(TimestampIter<'r, 's>), | ||||
| } | ||||
| 
 | ||||
| impl<'r, 's> AstNodeIter<'r, 's> { | ||||
|     pub fn from_ast_node(node: &AstNode<'r, 's>) -> AstNodeIter<'r, 's> { | ||||
|         match node { | ||||
|             AstNode::Document(inner) => AstNodeIter::Document(inner.into_iter()), | ||||
|             AstNode::Heading(inner) => AstNodeIter::Heading(inner.into_iter()), | ||||
|             AstNode::Section(inner) => AstNodeIter::Section(inner.into_iter()), | ||||
|             AstNode::Paragraph(inner) => AstNodeIter::Paragraph(inner.into_iter()), | ||||
|             AstNode::PlainList(inner) => AstNodeIter::PlainList(inner.into_iter()), | ||||
|             AstNode::PlainListItem(inner) => AstNodeIter::PlainListItem(inner.into_iter()), | ||||
|             AstNode::GreaterBlock(inner) => AstNodeIter::GreaterBlock(inner.into_iter()), | ||||
|             AstNode::DynamicBlock(inner) => AstNodeIter::DynamicBlock(inner.into_iter()), | ||||
|             AstNode::FootnoteDefinition(inner) => { | ||||
|                 AstNodeIter::FootnoteDefinition(inner.into_iter()) | ||||
|             } | ||||
|             AstNode::Comment(inner) => AstNodeIter::Comment(inner.into_iter()), | ||||
|             AstNode::Drawer(inner) => AstNodeIter::Drawer(inner.into_iter()), | ||||
|             AstNode::PropertyDrawer(inner) => AstNodeIter::PropertyDrawer(inner.into_iter()), | ||||
|             AstNode::NodeProperty(inner) => AstNodeIter::NodeProperty(inner.into_iter()), | ||||
|             AstNode::Table(inner) => AstNodeIter::Table(inner.into_iter()), | ||||
|             AstNode::TableRow(inner) => AstNodeIter::TableRow(inner.into_iter()), | ||||
|             AstNode::VerseBlock(inner) => AstNodeIter::VerseBlock(inner.into_iter()), | ||||
|             AstNode::CommentBlock(inner) => AstNodeIter::CommentBlock(inner.into_iter()), | ||||
|             AstNode::ExampleBlock(inner) => AstNodeIter::ExampleBlock(inner.into_iter()), | ||||
|             AstNode::ExportBlock(inner) => AstNodeIter::ExportBlock(inner.into_iter()), | ||||
|             AstNode::SrcBlock(inner) => AstNodeIter::SrcBlock(inner.into_iter()), | ||||
|             AstNode::Clock(inner) => AstNodeIter::Clock(inner.into_iter()), | ||||
|             AstNode::DiarySexp(inner) => AstNodeIter::DiarySexp(inner.into_iter()), | ||||
|             AstNode::Planning(inner) => AstNodeIter::Planning(inner.into_iter()), | ||||
|             AstNode::FixedWidthArea(inner) => AstNodeIter::FixedWidthArea(inner.into_iter()), | ||||
|             AstNode::HorizontalRule(inner) => AstNodeIter::HorizontalRule(inner.into_iter()), | ||||
|             AstNode::Keyword(inner) => AstNodeIter::Keyword(inner.into_iter()), | ||||
|             AstNode::BabelCall(inner) => AstNodeIter::BabelCall(inner.into_iter()), | ||||
|             AstNode::LatexEnvironment(inner) => AstNodeIter::LatexEnvironment(inner.into_iter()), | ||||
|             AstNode::Bold(inner) => AstNodeIter::Bold(inner.into_iter()), | ||||
|             AstNode::Italic(inner) => AstNodeIter::Italic(inner.into_iter()), | ||||
|             AstNode::Underline(inner) => AstNodeIter::Underline(inner.into_iter()), | ||||
|             AstNode::StrikeThrough(inner) => AstNodeIter::StrikeThrough(inner.into_iter()), | ||||
|             AstNode::Code(inner) => AstNodeIter::Code(inner.into_iter()), | ||||
|             AstNode::Verbatim(inner) => AstNodeIter::Verbatim(inner.into_iter()), | ||||
|             AstNode::PlainText(inner) => AstNodeIter::PlainText(inner.into_iter()), | ||||
|             AstNode::RegularLink(inner) => AstNodeIter::RegularLink(inner.into_iter()), | ||||
|             AstNode::RadioLink(inner) => AstNodeIter::RadioLink(inner.into_iter()), | ||||
|             AstNode::RadioTarget(inner) => AstNodeIter::RadioTarget(inner.into_iter()), | ||||
|             AstNode::PlainLink(inner) => AstNodeIter::PlainLink(inner.into_iter()), | ||||
|             AstNode::AngleLink(inner) => AstNodeIter::AngleLink(inner.into_iter()), | ||||
|             AstNode::OrgMacro(inner) => AstNodeIter::OrgMacro(inner.into_iter()), | ||||
|             AstNode::Entity(inner) => AstNodeIter::Entity(inner.into_iter()), | ||||
|             AstNode::LatexFragment(inner) => AstNodeIter::LatexFragment(inner.into_iter()), | ||||
|             AstNode::ExportSnippet(inner) => AstNodeIter::ExportSnippet(inner.into_iter()), | ||||
|             AstNode::FootnoteReference(inner) => AstNodeIter::FootnoteReference(inner.into_iter()), | ||||
|             AstNode::Citation(inner) => AstNodeIter::Citation(inner.into_iter()), | ||||
|             AstNode::CitationReference(inner) => AstNodeIter::CitationReference(inner.into_iter()), | ||||
|             AstNode::InlineBabelCall(inner) => AstNodeIter::InlineBabelCall(inner.into_iter()), | ||||
|             AstNode::InlineSourceBlock(inner) => AstNodeIter::InlineSourceBlock(inner.into_iter()), | ||||
|             AstNode::LineBreak(inner) => AstNodeIter::LineBreak(inner.into_iter()), | ||||
|             AstNode::Target(inner) => AstNodeIter::Target(inner.into_iter()), | ||||
|             AstNode::StatisticsCookie(inner) => AstNodeIter::StatisticsCookie(inner.into_iter()), | ||||
|             AstNode::Subscript(inner) => AstNodeIter::Subscript(inner.into_iter()), | ||||
|             AstNode::Superscript(inner) => AstNodeIter::Superscript(inner.into_iter()), | ||||
|             AstNode::TableCell(inner) => AstNodeIter::TableCell(inner.into_iter()), | ||||
|             AstNode::Timestamp(inner) => AstNodeIter::Timestamp(inner.into_iter()), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| multi_field_iter!( | ||||
|     Document<'s>, | ||||
|     DocumentIter, | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| mod all_ast_node_iter; | ||||
| mod ast_node; | ||||
| mod ast_node_iter; | ||||
| mod macros; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander