@@ -44,8 +44,8 @@ use crate::{
44
44
FormatPlaceholder , FormatSign , FormatTrait ,
45
45
} ,
46
46
Array , Binding , BindingAnnotation , BindingId , BindingProblems , CaptureBy , ClosureKind ,
47
- Expr , ExprId , Item , Label , LabelId , Literal , LiteralOrConst , MatchArm , Movability ,
48
- OffsetOf , Pat , PatId , RecordFieldPat , RecordLitField , Statement ,
47
+ Expr , ExprId , Item , Label , LabelId , Literal , MatchArm , Movability , OffsetOf , Pat , PatId ,
48
+ RecordFieldPat , RecordLitField , Statement ,
49
49
} ,
50
50
item_scope:: BuiltinShadowMode ,
51
51
lang_item:: LangItem ,
@@ -1784,23 +1784,33 @@ impl ExprCollector<'_> {
1784
1784
self . collect_macro_call ( call, macro_ptr, true , |this, expanded_pat| {
1785
1785
this. collect_pat_opt ( expanded_pat, binding_list)
1786
1786
} ) ;
1787
- self . source_map . pat_map . insert ( src, pat) ;
1787
+ self . source_map . pat_map . insert ( src, pat. into ( ) ) ;
1788
1788
return pat;
1789
1789
}
1790
1790
None => Pat :: Missing ,
1791
1791
} ,
1792
- // FIXME: implement in a way that also builds source map and calculates assoc resolutions in type inference.
1793
1792
ast:: Pat :: RangePat ( p) => {
1794
- let mut range_part_lower = |p : Option < ast:: Pat > | {
1795
- p. and_then ( |it| match & it {
1796
- ast:: Pat :: LiteralPat ( it) => {
1797
- Some ( Box :: new ( LiteralOrConst :: Literal ( pat_literal_to_hir ( it) ?. 0 ) ) )
1793
+ let mut range_part_lower = |p : Option < ast:: Pat > | -> Option < ExprId > {
1794
+ p. and_then ( |it| {
1795
+ let ptr = PatPtr :: new ( & it) ;
1796
+ match & it {
1797
+ ast:: Pat :: LiteralPat ( it) => Some ( self . alloc_expr_from_pat (
1798
+ Expr :: Literal ( pat_literal_to_hir ( it) ?. 0 ) ,
1799
+ ptr,
1800
+ ) ) ,
1801
+ ast:: Pat :: IdentPat ( ident) if ident. is_simple_ident ( ) => ident
1802
+ . name ( )
1803
+ . map ( |name| name. as_name ( ) )
1804
+ . map ( Path :: from)
1805
+ . map ( |path| self . alloc_expr_from_pat ( Expr :: Path ( path) , ptr) ) ,
1806
+ ast:: Pat :: PathPat ( p) => p
1807
+ . path ( )
1808
+ . and_then ( |path| self . parse_path ( path) )
1809
+ . map ( |parsed| self . alloc_expr_from_pat ( Expr :: Path ( parsed) , ptr) ) ,
1810
+ // We only need to handle literal, ident (if bare) and path patterns here,
1811
+ // as any other pattern as a range pattern operand is semantically invalid.
1812
+ _ => None ,
1798
1813
}
1799
- pat @ ( ast:: Pat :: IdentPat ( _) | ast:: Pat :: PathPat ( _) ) => {
1800
- let subpat = self . collect_pat ( pat. clone ( ) , binding_list) ;
1801
- Some ( Box :: new ( LiteralOrConst :: Const ( subpat) ) )
1802
- }
1803
- _ => None ,
1804
1814
} )
1805
1815
} ;
1806
1816
let start = range_part_lower ( p. start ( ) ) ;
@@ -1863,7 +1873,7 @@ impl ExprCollector<'_> {
1863
1873
}
1864
1874
} ) ;
1865
1875
if let Some ( pat) = pat. left ( ) {
1866
- self . source_map . pat_map . insert ( src, pat) ;
1876
+ self . source_map . pat_map . insert ( src, pat. into ( ) ) ;
1867
1877
}
1868
1878
pat
1869
1879
}
@@ -2490,7 +2500,7 @@ impl ExprCollector<'_> {
2490
2500
fn alloc_expr ( & mut self , expr : Expr , ptr : ExprPtr ) -> ExprId {
2491
2501
let src = self . expander . in_file ( ptr) ;
2492
2502
let id = self . store . exprs . alloc ( expr) ;
2493
- self . source_map . expr_map_back . insert ( id, src) ;
2503
+ self . source_map . expr_map_back . insert ( id, src. map ( AstPtr :: wrap_left ) ) ;
2494
2504
self . source_map . expr_map . insert ( src, id. into ( ) ) ;
2495
2505
id
2496
2506
}
@@ -2502,7 +2512,7 @@ impl ExprCollector<'_> {
2502
2512
fn alloc_expr_desugared_with_ptr ( & mut self , expr : Expr , ptr : ExprPtr ) -> ExprId {
2503
2513
let src = self . expander . in_file ( ptr) ;
2504
2514
let id = self . store . exprs . alloc ( expr) ;
2505
- self . source_map . expr_map_back . insert ( id, src) ;
2515
+ self . source_map . expr_map_back . insert ( id, src. map ( AstPtr :: wrap_left ) ) ;
2506
2516
// We intentionally don't fill this as it could overwrite a non-desugared entry
2507
2517
// self.source_map.expr_map.insert(src, id);
2508
2518
id
@@ -2526,11 +2536,20 @@ impl ExprCollector<'_> {
2526
2536
self . source_map . pat_map_back . insert ( id, src. map ( AstPtr :: wrap_left) ) ;
2527
2537
id
2528
2538
}
2539
+
2540
+ fn alloc_expr_from_pat ( & mut self , expr : Expr , ptr : PatPtr ) -> ExprId {
2541
+ let src = self . expander . in_file ( ptr) ;
2542
+ let id = self . store . exprs . alloc ( expr) ;
2543
+ self . source_map . pat_map . insert ( src, id. into ( ) ) ;
2544
+ self . source_map . expr_map_back . insert ( id, src. map ( AstPtr :: wrap_right) ) ;
2545
+ id
2546
+ }
2547
+
2529
2548
fn alloc_pat ( & mut self , pat : Pat , ptr : PatPtr ) -> PatId {
2530
2549
let src = self . expander . in_file ( ptr) ;
2531
2550
let id = self . store . pats . alloc ( pat) ;
2532
2551
self . source_map . pat_map_back . insert ( id, src. map ( AstPtr :: wrap_right) ) ;
2533
- self . source_map . pat_map . insert ( src, id) ;
2552
+ self . source_map . pat_map . insert ( src, id. into ( ) ) ;
2534
2553
id
2535
2554
}
2536
2555
// FIXME: desugared pats don't have ptr, that's wrong and should be fixed somehow.
0 commit comments