diff --git a/ast/src/source_locator.rs b/ast/src/source_locator.rs index 49b03a2..a72311d 100644 --- a/ast/src/source_locator.rs +++ b/ast/src/source_locator.rs @@ -274,6 +274,34 @@ impl crate::fold::Fold for LinearLocator<'_> { keywords, }) } + + fn fold_pattern_match_mapping( + &mut self, + node: crate::PatternMatchMapping, + ) -> Result, Self::Error> { + let crate::PatternMatchMapping { + keys, + patterns, + rest, + range, + } = node; + let context = self.will_map_user(&range); + + let mut located_keys = Vec::with_capacity(keys.len()); + let mut located_patterns = Vec::with_capacity(patterns.len()); + for (key, value) in keys.into_iter().zip(patterns.into_iter()) { + located_keys.push(self.fold(key)?); + located_patterns.push(self.fold(value)?); + } + let rest = self.fold(rest)?; + let range = self.map_user(range, context)?; + Ok(crate::PatternMatchMapping { + keys: located_keys, + patterns: located_patterns, + rest, + range, + }) + } } struct LinearLookaheadLocator<'a, 'b>(&'b mut LinearLocator<'a>); diff --git a/parser/src/python.lalrpop b/parser/src/python.lalrpop index e1b8cbc..fe584d8 100644 --- a/parser/src/python.lalrpop +++ b/parser/src/python.lalrpop @@ -370,13 +370,14 @@ MatchStatement: ast::Stmt = { .last() .unwrap() .end(); + let subject_range = (subjects.first().unwrap().start()..subjects.last().unwrap().end()).into(); ast::Stmt::Match( ast::StmtMatch { subject: Box::new(ast::Expr::Tuple( ast::ExprTuple { elts: subjects, ctx: ast::ExprContext::Load, - range: (location..end_location).into() + range: subject_range, }, )), cases, diff --git a/parser/src/python.rs b/parser/src/python.rs index 369499a..ab02fdb 100644 --- a/parser/src/python.rs +++ b/parser/src/python.rs @@ -1,5 +1,5 @@ // auto-generated: "lalrpop 0.20.0" -// sha3: de5ffc51d44962eb297cbbf668fae33652eed69586405ebef2229fc02d183bc8 +// sha3: c2ba3f0f3de013733a18ba664f36f7f587254cc430656e553ceada96d33c409b use crate::{ ast::{self as ast, Ranged, bigint::BigInt}, lexer::{LexicalError, LexicalErrorType}, @@ -30842,13 +30842,14 @@ fn __action82< .last() .unwrap() .end(); + let subject_range = (subjects.first().unwrap().start()..subjects.last().unwrap().end()).into(); ast::Stmt::Match( ast::StmtMatch { subject: Box::new(ast::Expr::Tuple( ast::ExprTuple { elts: subjects, ctx: ast::ExprContext::Load, - range: (location..end_location).into() + range: subject_range, }, )), cases, diff --git a/parser/src/snapshots/rustpython_parser__parser__tests__patma.snap b/parser/src/snapshots/rustpython_parser__parser__tests__patma.snap index 7b3b577..65eed26 100644 --- a/parser/src/snapshots/rustpython_parser__parser__tests__patma.snap +++ b/parser/src/snapshots/rustpython_parser__parser__tests__patma.snap @@ -3783,7 +3783,7 @@ expression: parse_ast range: 2720..2760, subject: Tuple( ExprTuple { - range: 2720..2760, + range: 2726..2730, elts: [ Name( ExprName {