()
| 2813 | Ok(Pattern::Variant { |
| 2814 | enum_name, |
| 2815 | variant: name, |
| 2816 | bindings, |
| 2817 | }) |
| 2818 | } |
| 2819 | |
| 2820 | // Parse a leading int/char literal pattern (optional `-`), else None so the |
| 2821 | // caller falls through to identifier-led patterns. Char reuses ascii-byte form. |
| 2822 | fn try_parse_literal_pattern(&mut self) -> Result<Option<Literal>, ParserError> { |
| 2823 | match self.peek() { |
| 2824 | Some(Token::Integer(_)) => Ok(Some(Literal::Integer(self.expect_integer()?))), |
| 2825 | Some(Token::HexInteger(_)) => Ok(Some(Literal::HexInteger(self.expect_hex_integer()?))), |
| 2826 | Some(Token::BinInteger(_)) => Ok(Some(Literal::BinInteger(self.expect_bin_integer()?))), |
| 2827 | Some(Token::Char(value)) => { |
| 2828 | let v = *value as i64; |
| 2829 | self.advance(); |
| 2830 | Ok(Some(Literal::Integer(v))) |
| 2831 | } |
| 2832 | Some(Token::Minus) => { |
| 2833 | self.advance(); |
| 2834 | match self.peek() { |
| 2835 | Some(Token::Integer(_)) => Ok(Some(Literal::Integer(-self.expect_integer()?))), |
| 2836 | Some(Token::HexInteger(_)) => { |
| 2837 | Ok(Some(Literal::HexInteger(-self.expect_hex_integer()?))) |
| 2838 | } |
| 2839 | Some(Token::BinInteger(_)) => { |
| 2840 | Ok(Some(Literal::BinInteger(-self.expect_bin_integer()?))) |
| 2841 | } |
| 2842 | _ => Err(self.error("expected integer literal after `-` in match pattern")), |
| 2843 | } |
| 2844 | } |
| 2845 | _ => Ok(None), |
| 2846 | } |
| 2847 | } |
| 2848 | |
| 2849 | // Canonical field init is `.name = expr` so `:` always introduces a type. A |
| 2850 | // trailing `..` zero-fills the fields the literal leaves unnamed. |
| 2851 | fn parse_struct_literal_fields(&mut self) -> Result<(Vec<FieldInit>, bool), ParserError> { |
| 2852 | self.expect_lbrace()?; |
| 2853 | let mut fields = Vec::new(); |
nothing calls this directly
no test coverage detected