11use std:: marker:: PhantomData ;
2- use std:: sync:: Arc ;
32
43use super :: SyntaxGroup ;
54use crate :: node:: { SyntaxNode , TypedSyntaxNode } ;
@@ -25,8 +24,7 @@ impl<'db, T: TypedSyntaxNode<'db>> ElementList<'db, T, 1> {
2524 & self ,
2625 db : & ' db dyn SyntaxGroup ,
2726 ) -> impl ExactSizeIterator < Item = T > + DoubleEndedIterator + ' db {
28- ElementListRawIter :: new ( self . node . get_children ( db) . as_slice ( ) . into ( ) )
29- . map ( move |x| T :: from_syntax_node ( db, x) )
27+ self . node . get_children ( db) . iter ( ) . copied ( ) . map ( move |x| T :: from_syntax_node ( db, x) )
3028 }
3129 pub fn has_tail ( & self , _db : & dyn SyntaxGroup ) -> bool {
3230 false
@@ -40,51 +38,14 @@ impl<'db, T: TypedSyntaxNode<'db>> ElementList<'db, T, 2> {
4038 & self ,
4139 db : & ' db dyn SyntaxGroup ,
4240 ) -> impl ExactSizeIterator < Item = T > + DoubleEndedIterator + ' db {
43- ElementListRawIter :: new ( self . node . get_children ( db) . as_slice ( ) . into ( ) )
41+ self . node
42+ . get_children ( db)
43+ . iter ( )
44+ . copied ( )
4445 . step_by ( 2 )
4546 . map ( move |x| T :: from_syntax_node ( db, x) )
4647 }
4748 pub fn has_tail ( & self , db : & dyn SyntaxGroup ) -> bool {
4849 !self . node . get_children ( db) . len ( ) . is_multiple_of ( 2 )
4950 }
5051}
51-
52- /// Iterator over the raw elements of an `ElementList`.
53- struct ElementListRawIter < ' a > {
54- /// The `Arc` storing the actual node.
55- _data : Arc < [ SyntaxNode < ' a > ] > ,
56- /// Actual iterator over the elements.
57- iter : std:: slice:: Iter < ' a , SyntaxNode < ' a > > ,
58- }
59-
60- impl < ' a > ElementListRawIter < ' a > {
61- fn new ( data : Arc < [ SyntaxNode < ' a > ] > ) -> Self {
62- // We leak the Arc to get a 'static reference, and keep the Arc in the struct to avoid
63- // leaks.
64- let ptr: * const [ SyntaxNode < ' _ > ] = Arc :: as_ptr ( & data) ;
65- let slice: & ' static [ SyntaxNode < ' _ > ] = unsafe { std:: mem:: transmute ( & * ptr) } ;
66- let iter = slice. iter ( ) ;
67- Self { _data : data, iter }
68- }
69- }
70-
71- impl < ' a > Iterator for ElementListRawIter < ' a > {
72- type Item = SyntaxNode < ' a > ;
73-
74- fn next ( & mut self ) -> Option < Self :: Item > {
75- self . iter . next ( ) . copied ( )
76- }
77- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
78- self . iter . size_hint ( )
79- }
80- }
81- impl ExactSizeIterator for ElementListRawIter < ' _ > {
82- fn len ( & self ) -> usize {
83- self . iter . len ( )
84- }
85- }
86- impl DoubleEndedIterator for ElementListRawIter < ' _ > {
87- fn next_back ( & mut self ) -> Option < Self :: Item > {
88- self . iter . next_back ( ) . copied ( )
89- }
90- }
0 commit comments