feat: pull comment tokens out of the Iter before parsing
This commit is contained in:
		
							parent
							
								
									f10c78d800
								
							
						
					
					
						commit
						00e5f99304
					
				|  | @ -7,7 +7,7 @@ pub mod lexer; | ||||||
| pub mod token; | pub mod token; | ||||||
| 
 | 
 | ||||||
| use crate::{ | use crate::{ | ||||||
|     ast::{self, BinOp, Span, TodoKind, CAPTURE_VARIABLE}, |     ast::{self, BinOp, Span, TodoKind, UntypedDefinition, CAPTURE_VARIABLE}, | ||||||
|     expr, |     expr, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -15,15 +15,6 @@ use error::ParseError; | ||||||
| use extra::ModuleExtra; | use extra::ModuleExtra; | ||||||
| use token::Token; | use token::Token; | ||||||
| 
 | 
 | ||||||
| #[allow(dead_code)] |  | ||||||
| enum DefinitionOrExtra { |  | ||||||
|     Definition(Box<ast::UntypedDefinition>), |  | ||||||
|     ModuleComment(Span), |  | ||||||
|     DocComment(Span), |  | ||||||
|     Comment(Span), |  | ||||||
|     EmptyLine(usize), |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pub fn module( | pub fn module( | ||||||
|     src: &str, |     src: &str, | ||||||
|     kind: ast::ModuleKind, |     kind: ast::ModuleKind, | ||||||
|  | @ -37,21 +28,33 @@ pub fn module( | ||||||
|         src.chars().enumerate().map(|(i, c)| (c, span(i))), |         src.chars().enumerate().map(|(i, c)| (c, span(i))), | ||||||
|     ))?; |     ))?; | ||||||
| 
 | 
 | ||||||
|     let module_data = |  | ||||||
|         module_parser().parse(chumsky::Stream::from_iter(span(len), tokens.into_iter()))?; |  | ||||||
| 
 |  | ||||||
|     let mut definitions = Vec::new(); |  | ||||||
|     let mut extra = ModuleExtra::new(); |     let mut extra = ModuleExtra::new(); | ||||||
| 
 | 
 | ||||||
|     for data in module_data { |     let tokens = tokens.into_iter().filter(|(token, span)| match token { | ||||||
|         match data { |         Token::ModuleComment => { | ||||||
|             DefinitionOrExtra::Definition(def) => definitions.push(*def), |             extra.module_comments.push(*span); | ||||||
|             DefinitionOrExtra::ModuleComment(c) => extra.module_comments.push(c), | 
 | ||||||
|             DefinitionOrExtra::DocComment(c) => extra.doc_comments.push(c), |             false | ||||||
|             DefinitionOrExtra::Comment(c) => extra.comments.push(c), |  | ||||||
|             DefinitionOrExtra::EmptyLine(e) => extra.empty_lines.push(e), |  | ||||||
|         } |         } | ||||||
|  |         Token::DocComment => { | ||||||
|  |             extra.doc_comments.push(*span); | ||||||
|  | 
 | ||||||
|  |             false | ||||||
|         } |         } | ||||||
|  |         Token::Comment => { | ||||||
|  |             extra.comments.push(*span); | ||||||
|  | 
 | ||||||
|  |             false | ||||||
|  |         } | ||||||
|  |         Token::EmptyLine => { | ||||||
|  |             extra.empty_lines.push(span.end); | ||||||
|  | 
 | ||||||
|  |             false | ||||||
|  |         } | ||||||
|  |         _ => true, | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     let definitions = module_parser().parse(chumsky::Stream::from_iter(span(len), tokens))?; | ||||||
| 
 | 
 | ||||||
|     let module = ast::UntypedModule { |     let module = ast::UntypedModule { | ||||||
|         kind, |         kind, | ||||||
|  | @ -64,18 +67,12 @@ pub fn module( | ||||||
|     Ok((module, extra)) |     Ok((module, extra)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn module_parser() -> impl Parser<Token, Vec<DefinitionOrExtra>, Error = ParseError> { | fn module_parser() -> impl Parser<Token, Vec<UntypedDefinition>, Error = ParseError> { | ||||||
|     choice(( |     choice(( | ||||||
|         import_parser() |         import_parser(), | ||||||
|             .map(Box::new) |         data_parser(), | ||||||
|             .map(DefinitionOrExtra::Definition), |         type_alias_parser(), | ||||||
|         data_parser() |         fn_parser(), | ||||||
|             .map(Box::new) |  | ||||||
|             .map(DefinitionOrExtra::Definition), |  | ||||||
|         type_alias_parser() |  | ||||||
|             .map(Box::new) |  | ||||||
|             .map(DefinitionOrExtra::Definition), |  | ||||||
|         fn_parser().map(Box::new).map(DefinitionOrExtra::Definition), |  | ||||||
|     )) |     )) | ||||||
|     .repeated() |     .repeated() | ||||||
|     .then_ignore(end()) |     .then_ignore(end()) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 rvcas
						rvcas