From f1c394ba76dd08f1601bd227ef136e7546fc8a7b Mon Sep 17 00:00:00 2001 From: 11happy Date: Mon, 1 Dec 2025 09:06:53 +0000 Subject: [PATCH 1/7] double star as pow Signed-off-by: 11happy --- .../src/parser/expression.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/crates/ruff_python_parser/src/parser/expression.rs b/crates/ruff_python_parser/src/parser/expression.rs index 2ae786ce77..4cf051d961 100644 --- a/crates/ruff_python_parser/src/parser/expression.rs +++ b/crates/ruff_python_parser/src/parser/expression.rs @@ -363,6 +363,24 @@ impl<'src> Parser<'src> { } match self.current_token_kind() { + TokenKind::DoubleStar => { + self.bump(TokenKind::DoubleStar); + let right = + self.parse_binary_expression_or_higher(OperatorPrecedence::Exponent, context); + return Expr::BinOp(ast::ExprBinOp { + left: Box::new(Expr::Name(ast::ExprName { + range: self.missing_node_range(), + id: Name::empty(), + ctx: ExprContext::Invalid, + node_index: AtomicNodeIndex::NONE, + })), + op: Operator::Pow, + right: Box::new(right.expr), + range: self.node_range(start), + node_index: AtomicNodeIndex::NONE, + }) + .into(); + } TokenKind::Star => { let starred_expr = self.parse_starred_expression(context); From f7bd94bd27eac49db9efa7fbd0b598a3c0cde806 Mon Sep 17 00:00:00 2001 From: 11happy Date: Tue, 2 Dec 2025 07:10:39 +0000 Subject: [PATCH 2/7] test: add parser test Signed-off-by: 11happy --- ...dict_double_star_missing_left_operand.snap | 108 ++++++++++++++++++ ...arser__parser__tests__function_kwargs.snap | 56 +++++++++ crates/ruff_python_parser/src/parser/tests.rs | 18 +++ 3 files changed, 182 insertions(+) create mode 100644 crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap create mode 100644 crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap diff --git a/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap b/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap new file mode 100644 index 0000000000..b2761a29a9 --- /dev/null +++ b/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap @@ -0,0 +1,108 @@ +--- +source: crates/ruff_python_parser/src/parser/tests.rs +expression: result +--- +Parsed { + syntax: ModExpression { + node_index: NodeIndex(None), + range: 0..25, + body: DictComp( + ExprDictComp { + node_index: NodeIndex(None), + range: 0..25, + key: Name( + ExprName { + node_index: NodeIndex(None), + range: 1..2, + id: Name("x"), + ctx: Load, + }, + ), + value: BinOp( + ExprBinOp { + node_index: NodeIndex(None), + range: 4..7, + left: Name( + ExprName { + node_index: NodeIndex(None), + range: 7..7, + id: Name(""), + ctx: Invalid, + }, + ), + op: Pow, + right: Name( + ExprName { + node_index: NodeIndex(None), + range: 6..7, + id: Name("y"), + ctx: Load, + }, + ), + }, + ), + generators: [ + Comprehension { + range: 8..24, + node_index: NodeIndex(None), + target: Tuple( + ExprTuple { + node_index: NodeIndex(None), + range: 12..16, + elts: [ + Name( + ExprName { + node_index: NodeIndex(None), + range: 12..13, + id: Name("x"), + ctx: Store, + }, + ), + Name( + ExprName { + node_index: NodeIndex(None), + range: 15..16, + id: Name("y"), + ctx: Store, + }, + ), + ], + ctx: Store, + parenthesized: false, + }, + ), + iter: Name( + ExprName { + node_index: NodeIndex(None), + range: 20..24, + id: Name("data"), + ctx: Load, + }, + ), + ifs: [], + is_async: false, + }, + ], + }, + ), + }, + tokens: Tokens { + raw: [ + Lbrace 0..1, + Name 1..2, + Colon 2..3, + DoubleStar 4..6, + Name 6..7, + For 8..11, + Name 12..13, + Comma 13..14, + Name 15..16, + In 17..19, + Name 20..24, + Rbrace 24..25, + Newline 25..25, + ], + }, + errors: [], + unsupported_syntax_errors: [], +} diff --git a/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap b/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap new file mode 100644 index 0000000000..4221c61a77 --- /dev/null +++ b/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap @@ -0,0 +1,56 @@ +--- +source: crates/ruff_python_parser/src/parser/tests.rs +expression: result +--- +Parsed { + syntax: ModExpression { + node_index: NodeIndex(None), + range: 0..13, + body: Call( + ExprCall { + node_index: NodeIndex(None), + range: 0..13, + func: Name( + ExprName { + node_index: NodeIndex(None), + range: 0..3, + id: Name("foo"), + ctx: Load, + }, + ), + arguments: Arguments { + range: 3..13, + node_index: NodeIndex(None), + args: [], + keywords: [ + Keyword { + range: 4..12, + node_index: NodeIndex(None), + arg: None, + value: Name( + ExprName { + node_index: NodeIndex(None), + range: 6..12, + id: Name("kwargs"), + ctx: Load, + }, + ), + }, + ], + }, + }, + ), + }, + tokens: Tokens { + raw: [ + Name 0..3, + Lpar 3..4, + DoubleStar 4..6, + Name 6..12, + Rpar 12..13, + Newline 13..13, + ], + }, + errors: [], + unsupported_syntax_errors: [], +} diff --git a/crates/ruff_python_parser/src/parser/tests.rs b/crates/ruff_python_parser/src/parser/tests.rs index dcb9ac16a0..05227b1bf4 100644 --- a/crates/ruff_python_parser/src/parser/tests.rs +++ b/crates/ruff_python_parser/src/parser/tests.rs @@ -157,3 +157,21 @@ t"i}'"#; insta::assert_debug_snapshot!(error); } + +#[test] +fn test_dict_double_star_missing_left_operand() { + let source = r#"{x: **y for x, y in data}"#; + let parsed = parse_expression(source); + assert!(parsed.is_ok()); + let result = parsed.unwrap(); + insta::assert_debug_snapshot!(result); +} + +#[test] +fn test_function_kwargs() { + let source = r#"foo(**kwargs)"#; + let parsed = parse_expression(source); + assert!(parsed.is_ok()); + let result = parsed.unwrap(); + insta::assert_debug_snapshot!(result); +} From a5c8582170a2c2ac72f2d5449edf464c9590f01f Mon Sep 17 00:00:00 2001 From: 11happy Date: Mon, 8 Dec 2025 12:55:29 +0000 Subject: [PATCH 3/7] update tests Signed-off-by: 11happy --- .../resources/inline/ok/missing_power_lhs.py | 3 + .../src/parser/expression.rs | 7 +- crates/ruff_python_parser/src/parser/tests.rs | 18 --- .../valid_syntax@missing_power_lhs.py.snap | 141 ++++++++++++++++++ 4 files changed, 150 insertions(+), 19 deletions(-) create mode 100644 crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py create mode 100644 crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap diff --git a/crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py b/crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py new file mode 100644 index 0000000000..152d079082 --- /dev/null +++ b/crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py @@ -0,0 +1,3 @@ +# parse_options: {"target-version": "3.8"} +{x: **y for x, y in z} +foo(**kwargs) diff --git a/crates/ruff_python_parser/src/parser/expression.rs b/crates/ruff_python_parser/src/parser/expression.rs index 4cf051d961..ece64e40a1 100644 --- a/crates/ruff_python_parser/src/parser/expression.rs +++ b/crates/ruff_python_parser/src/parser/expression.rs @@ -364,12 +364,17 @@ impl<'src> Parser<'src> { match self.current_token_kind() { TokenKind::DoubleStar => { + let current_start = self.node_start(); self.bump(TokenKind::DoubleStar); let right = self.parse_binary_expression_or_higher(OperatorPrecedence::Exponent, context); + // test_ok missing_power_lhs + // # parse_options: {"target-version": "3.8"} + // {x: **y for x, y in z} + // foo(**kwargs) return Expr::BinOp(ast::ExprBinOp { left: Box::new(Expr::Name(ast::ExprName { - range: self.missing_node_range(), + range: TextRange::empty(current_start), id: Name::empty(), ctx: ExprContext::Invalid, node_index: AtomicNodeIndex::NONE, diff --git a/crates/ruff_python_parser/src/parser/tests.rs b/crates/ruff_python_parser/src/parser/tests.rs index 05227b1bf4..dcb9ac16a0 100644 --- a/crates/ruff_python_parser/src/parser/tests.rs +++ b/crates/ruff_python_parser/src/parser/tests.rs @@ -157,21 +157,3 @@ t"i}'"#; insta::assert_debug_snapshot!(error); } - -#[test] -fn test_dict_double_star_missing_left_operand() { - let source = r#"{x: **y for x, y in data}"#; - let parsed = parse_expression(source); - assert!(parsed.is_ok()); - let result = parsed.unwrap(); - insta::assert_debug_snapshot!(result); -} - -#[test] -fn test_function_kwargs() { - let source = r#"foo(**kwargs)"#; - let parsed = parse_expression(source); - assert!(parsed.is_ok()); - let result = parsed.unwrap(); - insta::assert_debug_snapshot!(result); -} diff --git a/crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap b/crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap new file mode 100644 index 0000000000..8e8a54aa5d --- /dev/null +++ b/crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap @@ -0,0 +1,141 @@ +--- +source: crates/ruff_python_parser/tests/fixtures.rs +input_file: crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py +--- +## AST + +``` +Module( + ModModule { + node_index: NodeIndex(None), + range: 0..80, + body: [ + Expr( + StmtExpr { + node_index: NodeIndex(None), + range: 43..65, + value: DictComp( + ExprDictComp { + node_index: NodeIndex(None), + range: 43..65, + key: Name( + ExprName { + node_index: NodeIndex(None), + range: 44..45, + id: Name("x"), + ctx: Load, + }, + ), + value: BinOp( + ExprBinOp { + node_index: NodeIndex(None), + range: 47..50, + left: Name( + ExprName { + node_index: NodeIndex(None), + range: 47..47, + id: Name(""), + ctx: Invalid, + }, + ), + op: Pow, + right: Name( + ExprName { + node_index: NodeIndex(None), + range: 49..50, + id: Name("y"), + ctx: Load, + }, + ), + }, + ), + generators: [ + Comprehension { + range: 51..64, + node_index: NodeIndex(None), + target: Tuple( + ExprTuple { + node_index: NodeIndex(None), + range: 55..59, + elts: [ + Name( + ExprName { + node_index: NodeIndex(None), + range: 55..56, + id: Name("x"), + ctx: Store, + }, + ), + Name( + ExprName { + node_index: NodeIndex(None), + range: 58..59, + id: Name("y"), + ctx: Store, + }, + ), + ], + ctx: Store, + parenthesized: false, + }, + ), + iter: Name( + ExprName { + node_index: NodeIndex(None), + range: 63..64, + id: Name("z"), + ctx: Load, + }, + ), + ifs: [], + is_async: false, + }, + ], + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: NodeIndex(None), + range: 66..79, + value: Call( + ExprCall { + node_index: NodeIndex(None), + range: 66..79, + func: Name( + ExprName { + node_index: NodeIndex(None), + range: 66..69, + id: Name("foo"), + ctx: Load, + }, + ), + arguments: Arguments { + range: 69..79, + node_index: NodeIndex(None), + args: [], + keywords: [ + Keyword { + range: 70..78, + node_index: NodeIndex(None), + arg: None, + value: Name( + ExprName { + node_index: NodeIndex(None), + range: 72..78, + id: Name("kwargs"), + ctx: Load, + }, + ), + }, + ], + }, + }, + ), + }, + ), + ], + }, +) +``` From 60323c71c7e40a6e6d1cd6d8ad2e210c1a157624 Mon Sep 17 00:00:00 2001 From: Bhuminjay Soni Date: Mon, 8 Dec 2025 18:26:08 +0530 Subject: [PATCH 4/7] Delete crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap --- ...dict_double_star_missing_left_operand.snap | 108 ------------------ 1 file changed, 108 deletions(-) delete mode 100644 crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap diff --git a/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap b/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap deleted file mode 100644 index b2761a29a9..0000000000 --- a/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__dict_double_star_missing_left_operand.snap +++ /dev/null @@ -1,108 +0,0 @@ ---- -source: crates/ruff_python_parser/src/parser/tests.rs -expression: result ---- -Parsed { - syntax: ModExpression { - node_index: NodeIndex(None), - range: 0..25, - body: DictComp( - ExprDictComp { - node_index: NodeIndex(None), - range: 0..25, - key: Name( - ExprName { - node_index: NodeIndex(None), - range: 1..2, - id: Name("x"), - ctx: Load, - }, - ), - value: BinOp( - ExprBinOp { - node_index: NodeIndex(None), - range: 4..7, - left: Name( - ExprName { - node_index: NodeIndex(None), - range: 7..7, - id: Name(""), - ctx: Invalid, - }, - ), - op: Pow, - right: Name( - ExprName { - node_index: NodeIndex(None), - range: 6..7, - id: Name("y"), - ctx: Load, - }, - ), - }, - ), - generators: [ - Comprehension { - range: 8..24, - node_index: NodeIndex(None), - target: Tuple( - ExprTuple { - node_index: NodeIndex(None), - range: 12..16, - elts: [ - Name( - ExprName { - node_index: NodeIndex(None), - range: 12..13, - id: Name("x"), - ctx: Store, - }, - ), - Name( - ExprName { - node_index: NodeIndex(None), - range: 15..16, - id: Name("y"), - ctx: Store, - }, - ), - ], - ctx: Store, - parenthesized: false, - }, - ), - iter: Name( - ExprName { - node_index: NodeIndex(None), - range: 20..24, - id: Name("data"), - ctx: Load, - }, - ), - ifs: [], - is_async: false, - }, - ], - }, - ), - }, - tokens: Tokens { - raw: [ - Lbrace 0..1, - Name 1..2, - Colon 2..3, - DoubleStar 4..6, - Name 6..7, - For 8..11, - Name 12..13, - Comma 13..14, - Name 15..16, - In 17..19, - Name 20..24, - Rbrace 24..25, - Newline 25..25, - ], - }, - errors: [], - unsupported_syntax_errors: [], -} From d6fa930f8a8b0a112e380326de1e5e0662cbf3da Mon Sep 17 00:00:00 2001 From: Bhuminjay Soni Date: Mon, 8 Dec 2025 18:26:26 +0530 Subject: [PATCH 5/7] Delete crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap --- ...arser__parser__tests__function_kwargs.snap | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap diff --git a/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap b/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap deleted file mode 100644 index 4221c61a77..0000000000 --- a/crates/ruff_python_parser/src/parser/snapshots/ruff_python_parser__parser__tests__function_kwargs.snap +++ /dev/null @@ -1,56 +0,0 @@ ---- -source: crates/ruff_python_parser/src/parser/tests.rs -expression: result ---- -Parsed { - syntax: ModExpression { - node_index: NodeIndex(None), - range: 0..13, - body: Call( - ExprCall { - node_index: NodeIndex(None), - range: 0..13, - func: Name( - ExprName { - node_index: NodeIndex(None), - range: 0..3, - id: Name("foo"), - ctx: Load, - }, - ), - arguments: Arguments { - range: 3..13, - node_index: NodeIndex(None), - args: [], - keywords: [ - Keyword { - range: 4..12, - node_index: NodeIndex(None), - arg: None, - value: Name( - ExprName { - node_index: NodeIndex(None), - range: 6..12, - id: Name("kwargs"), - ctx: Load, - }, - ), - }, - ], - }, - }, - ), - }, - tokens: Tokens { - raw: [ - Name 0..3, - Lpar 3..4, - DoubleStar 4..6, - Name 6..12, - Rpar 12..13, - Newline 13..13, - ], - }, - errors: [], - unsupported_syntax_errors: [], -} From dbb0631e6090a4f39947167a9dd867c5fd370531 Mon Sep 17 00:00:00 2001 From: 11happy Date: Mon, 15 Dec 2025 07:25:49 +0000 Subject: [PATCH 6/7] add parseerror Signed-off-by: 11happy --- .../inline/{ok => err}/missing_power_lhs.py | 1 - .../inline/ok/function_kwargs_double_star.py | 2 + .../src/parser/expression.rs | 26 +++-- .../invalid_syntax@missing_power_lhs.py.snap | 108 ++++++++++++++++++ ...syntax@function_kwargs_double_star.py.snap | 56 +++++++++ 5 files changed, 185 insertions(+), 8 deletions(-) rename crates/ruff_python_parser/resources/inline/{ok => err}/missing_power_lhs.py (82%) create mode 100644 crates/ruff_python_parser/resources/inline/ok/function_kwargs_double_star.py create mode 100644 crates/ruff_python_parser/tests/snapshots/invalid_syntax@missing_power_lhs.py.snap create mode 100644 crates/ruff_python_parser/tests/snapshots/valid_syntax@function_kwargs_double_star.py.snap diff --git a/crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py b/crates/ruff_python_parser/resources/inline/err/missing_power_lhs.py similarity index 82% rename from crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py rename to crates/ruff_python_parser/resources/inline/err/missing_power_lhs.py index 152d079082..982d4994c1 100644 --- a/crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py +++ b/crates/ruff_python_parser/resources/inline/err/missing_power_lhs.py @@ -1,3 +1,2 @@ # parse_options: {"target-version": "3.8"} {x: **y for x, y in z} -foo(**kwargs) diff --git a/crates/ruff_python_parser/resources/inline/ok/function_kwargs_double_star.py b/crates/ruff_python_parser/resources/inline/ok/function_kwargs_double_star.py new file mode 100644 index 0000000000..b57364359d --- /dev/null +++ b/crates/ruff_python_parser/resources/inline/ok/function_kwargs_double_star.py @@ -0,0 +1,2 @@ +# parse_options: {"target-version": "3.8"} +foo(**kwargs) diff --git a/crates/ruff_python_parser/src/parser/expression.rs b/crates/ruff_python_parser/src/parser/expression.rs index ece64e40a1..828850870a 100644 --- a/crates/ruff_python_parser/src/parser/expression.rs +++ b/crates/ruff_python_parser/src/parser/expression.rs @@ -368,11 +368,8 @@ impl<'src> Parser<'src> { self.bump(TokenKind::DoubleStar); let right = self.parse_binary_expression_or_higher(OperatorPrecedence::Exponent, context); - // test_ok missing_power_lhs - // # parse_options: {"target-version": "3.8"} - // {x: **y for x, y in z} - // foo(**kwargs) - return Expr::BinOp(ast::ExprBinOp { + + let expr = Expr::BinOp(ast::ExprBinOp { left: Box::new(Expr::Name(ast::ExprName { range: TextRange::empty(current_start), id: Name::empty(), @@ -383,8 +380,23 @@ impl<'src> Parser<'src> { right: Box::new(right.expr), range: self.node_range(start), node_index: AtomicNodeIndex::NONE, - }) - .into(); + }); + + // test_err missing_power_lhs + // # parse_options: {"target-version": "3.8"} + // {x: **y for x, y in z} + + // test_ok function_kwargs_double_star + // # parse_options: {"target-version": "3.8"} + // foo(**kwargs) + + self.add_error( + ParseErrorType::OtherError( + "Power operator '**' requires a left operand".to_string(), + ), + &expr, + ); + return expr.into(); } TokenKind::Star => { let starred_expr = self.parse_starred_expression(context); diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@missing_power_lhs.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@missing_power_lhs.py.snap new file mode 100644 index 0000000000..cd7f1397b3 --- /dev/null +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@missing_power_lhs.py.snap @@ -0,0 +1,108 @@ +--- +source: crates/ruff_python_parser/tests/fixtures.rs +input_file: crates/ruff_python_parser/resources/inline/err/missing_power_lhs.py +--- +## AST + +``` +Module( + ModModule { + node_index: NodeIndex(None), + range: 0..66, + body: [ + Expr( + StmtExpr { + node_index: NodeIndex(None), + range: 43..65, + value: DictComp( + ExprDictComp { + node_index: NodeIndex(None), + range: 43..65, + key: Name( + ExprName { + node_index: NodeIndex(None), + range: 44..45, + id: Name("x"), + ctx: Load, + }, + ), + value: BinOp( + ExprBinOp { + node_index: NodeIndex(None), + range: 47..50, + left: Name( + ExprName { + node_index: NodeIndex(None), + range: 47..47, + id: Name(""), + ctx: Invalid, + }, + ), + op: Pow, + right: Name( + ExprName { + node_index: NodeIndex(None), + range: 49..50, + id: Name("y"), + ctx: Load, + }, + ), + }, + ), + generators: [ + Comprehension { + range: 51..64, + node_index: NodeIndex(None), + target: Tuple( + ExprTuple { + node_index: NodeIndex(None), + range: 55..59, + elts: [ + Name( + ExprName { + node_index: NodeIndex(None), + range: 55..56, + id: Name("x"), + ctx: Store, + }, + ), + Name( + ExprName { + node_index: NodeIndex(None), + range: 58..59, + id: Name("y"), + ctx: Store, + }, + ), + ], + ctx: Store, + parenthesized: false, + }, + ), + iter: Name( + ExprName { + node_index: NodeIndex(None), + range: 63..64, + id: Name("z"), + ctx: Load, + }, + ), + ifs: [], + is_async: false, + }, + ], + }, + ), + }, + ), + ], + }, +) +``` +## Errors + + | +1 | # parse_options: {"target-version": "3.8"} +2 | {x: **y for x, y in z} + | ^^^ Syntax Error: Power operator '**' requires a left operand + | diff --git a/crates/ruff_python_parser/tests/snapshots/valid_syntax@function_kwargs_double_star.py.snap b/crates/ruff_python_parser/tests/snapshots/valid_syntax@function_kwargs_double_star.py.snap new file mode 100644 index 0000000000..627bb3a907 --- /dev/null +++ b/crates/ruff_python_parser/tests/snapshots/valid_syntax@function_kwargs_double_star.py.snap @@ -0,0 +1,56 @@ +--- +source: crates/ruff_python_parser/tests/fixtures.rs +input_file: crates/ruff_python_parser/resources/inline/ok/function_kwargs_double_star.py +--- +## AST + +``` +Module( + ModModule { + node_index: NodeIndex(None), + range: 0..57, + body: [ + Expr( + StmtExpr { + node_index: NodeIndex(None), + range: 43..56, + value: Call( + ExprCall { + node_index: NodeIndex(None), + range: 43..56, + func: Name( + ExprName { + node_index: NodeIndex(None), + range: 43..46, + id: Name("foo"), + ctx: Load, + }, + ), + arguments: Arguments { + range: 46..56, + node_index: NodeIndex(None), + args: [], + keywords: [ + Keyword { + range: 47..55, + node_index: NodeIndex(None), + arg: None, + value: Name( + ExprName { + node_index: NodeIndex(None), + range: 49..55, + id: Name("kwargs"), + ctx: Load, + }, + ), + }, + ], + }, + }, + ), + }, + ), + ], + }, +) +``` From af623e1f9a0a99a471ab5a3a066bf8f1686e894d Mon Sep 17 00:00:00 2001 From: Bhuminjay Soni Date: Mon, 15 Dec 2025 13:09:04 +0530 Subject: [PATCH 7/7] Delete crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap --- .../valid_syntax@missing_power_lhs.py.snap | 141 ------------------ 1 file changed, 141 deletions(-) delete mode 100644 crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap diff --git a/crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap b/crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap deleted file mode 100644 index 8e8a54aa5d..0000000000 --- a/crates/ruff_python_parser/tests/snapshots/valid_syntax@missing_power_lhs.py.snap +++ /dev/null @@ -1,141 +0,0 @@ ---- -source: crates/ruff_python_parser/tests/fixtures.rs -input_file: crates/ruff_python_parser/resources/inline/ok/missing_power_lhs.py ---- -## AST - -``` -Module( - ModModule { - node_index: NodeIndex(None), - range: 0..80, - body: [ - Expr( - StmtExpr { - node_index: NodeIndex(None), - range: 43..65, - value: DictComp( - ExprDictComp { - node_index: NodeIndex(None), - range: 43..65, - key: Name( - ExprName { - node_index: NodeIndex(None), - range: 44..45, - id: Name("x"), - ctx: Load, - }, - ), - value: BinOp( - ExprBinOp { - node_index: NodeIndex(None), - range: 47..50, - left: Name( - ExprName { - node_index: NodeIndex(None), - range: 47..47, - id: Name(""), - ctx: Invalid, - }, - ), - op: Pow, - right: Name( - ExprName { - node_index: NodeIndex(None), - range: 49..50, - id: Name("y"), - ctx: Load, - }, - ), - }, - ), - generators: [ - Comprehension { - range: 51..64, - node_index: NodeIndex(None), - target: Tuple( - ExprTuple { - node_index: NodeIndex(None), - range: 55..59, - elts: [ - Name( - ExprName { - node_index: NodeIndex(None), - range: 55..56, - id: Name("x"), - ctx: Store, - }, - ), - Name( - ExprName { - node_index: NodeIndex(None), - range: 58..59, - id: Name("y"), - ctx: Store, - }, - ), - ], - ctx: Store, - parenthesized: false, - }, - ), - iter: Name( - ExprName { - node_index: NodeIndex(None), - range: 63..64, - id: Name("z"), - ctx: Load, - }, - ), - ifs: [], - is_async: false, - }, - ], - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: NodeIndex(None), - range: 66..79, - value: Call( - ExprCall { - node_index: NodeIndex(None), - range: 66..79, - func: Name( - ExprName { - node_index: NodeIndex(None), - range: 66..69, - id: Name("foo"), - ctx: Load, - }, - ), - arguments: Arguments { - range: 69..79, - node_index: NodeIndex(None), - args: [], - keywords: [ - Keyword { - range: 70..78, - node_index: NodeIndex(None), - arg: None, - value: Name( - ExprName { - node_index: NodeIndex(None), - range: 72..78, - id: Name("kwargs"), - ctx: Load, - }, - ), - }, - ], - }, - }, - ), - }, - ), - ], - }, -) -```