(&mut self)
| 3363 | } |
| 3364 | |
| 3365 | fn parse_fstring_replacement_field(&mut self) -> Result<Expression, ParsingError> { |
| 3366 | let node = self.start_node(); |
| 3367 | self.bump(Kind::LeftBracket); |
| 3368 | |
| 3369 | let expr = if self.at(Kind::Yield) { |
| 3370 | self.parse_yield_expression()? |
| 3371 | } else { |
| 3372 | self.parse_expressions()? |
| 3373 | }; |
| 3374 | |
| 3375 | let mut conversion = -1; |
| 3376 | if self.eat(Kind::Assign) { |
| 3377 | conversion = 114; |
| 3378 | } |
| 3379 | if self.eat(Kind::Exclamation) { |
| 3380 | conversion = match self.cur_token.as_str(self.source) { |
| 3381 | "s" => 115, |
| 3382 | "r" => 114, |
| 3383 | "a" => 97, |
| 3384 | _ => panic!("should not happen"), |
| 3385 | }; |
| 3386 | self.bump_any(); |
| 3387 | } |
| 3388 | let format_spec_node = self.start_node(); |
| 3389 | let format_spec = if self.eat(Kind::Colon) { |
| 3390 | let mut specs = vec![]; |
| 3391 | while matches!(self.cur_kind(), Kind::FStringMiddle | Kind::LeftBracket) { |
| 3392 | specs.push(self.parse_fstring_middle()?); |
| 3393 | } |
| 3394 | Some(Expression::JoinedStr(Box::new(JoinedStr { |
| 3395 | node: self.finish_node(format_spec_node), |
| 3396 | values: specs, |
| 3397 | }))) |
| 3398 | } else { |
| 3399 | None |
| 3400 | }; |
| 3401 | |
| 3402 | self.expect(Kind::RightBracket)?; |
| 3403 | Ok(Expression::FormattedValue(Box::new(FormattedValue { |
| 3404 | node: self.finish_node(node), |
| 3405 | value: expr, |
| 3406 | conversion, |
| 3407 | format_spec, |
| 3408 | }))) |
| 3409 | } |
| 3410 | |
| 3411 | fn parse_fstring_middle(&mut self) -> Result<Expression, ParsingError> { |
| 3412 | let node = self.start_node(); |
no test coverage detected