(&mut self, meta: &mut ParserMetadata)
| 60 | } |
| 61 | |
| 62 | fn parse(&mut self, meta: &mut ParserMetadata) -> SyntaxResult { |
| 63 | syntax(meta, &mut self.modifier)?; |
| 64 | self.modifier.use_modifiers(meta, |_this, meta| { |
| 65 | // Get the function name and store token for error reporting |
| 66 | let tok = meta.get_current_token(); |
| 67 | if let Some(ref tok) = tok { |
| 68 | (self.line, self.col) = tok.pos; |
| 69 | } |
| 70 | self.name = variable(meta, variable_name_extensions())?; |
| 71 | self.name_tok = tok.clone(); |
| 72 | self.failure_handler.set_function_name(self.name.clone()); |
| 73 | |
| 74 | // Parse arguments syntax |
| 75 | token(meta, "(")?; |
| 76 | loop { |
| 77 | // Skip comments and newlines |
| 78 | if token_by(meta, |token| { |
| 79 | token.starts_with("//") || token.starts_with('\n') |
| 80 | }) |
| 81 | .is_ok() |
| 82 | { |
| 83 | continue; |
| 84 | } |
| 85 | if token(meta, ")").is_ok() { |
| 86 | break; |
| 87 | } |
| 88 | let mut arg = Expr::new(); |
| 89 | syntax(meta, &mut arg)?; |
| 90 | self.args.push(arg); |
| 91 | match token(meta, ")") { |
| 92 | Ok(_) => break, |
| 93 | Err(_) => token(meta, ",")?, |
| 94 | }; |
| 95 | } |
| 96 | |
| 97 | // Store position for later error reporting |
| 98 | self.failure_handler |
| 99 | .set_position(PositionInfo::from_between_tokens( |
| 100 | meta, |
| 101 | tok.clone(), |
| 102 | meta.get_current_token(), |
| 103 | )); |
| 104 | |
| 105 | // Try to parse the failed block if present (optional in parse phase) |
| 106 | if let Err(Failure::Loud(msg)) = syntax(meta, &mut self.failure_handler) { |
| 107 | return Err(Failure::Loud(msg)); |
| 108 | } |
| 109 | |
| 110 | Ok(()) |
| 111 | }) |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | impl TypeCheckModule for FunctionInvocation { |
nothing calls this directly
no test coverage detected