@@ -535,8 +535,23 @@ pub fn do_local_search_with_string(path: &[&str], filepath: &Path, pos: uint,
535
535
return out. move_iter ( ) ;
536
536
}
537
537
538
+
539
+ // HACK: Make box iterator support iterator trait
540
+ //
541
+ // I can't get the type signature to resolve_name to compile, so instead am boxing it into a trait object and then returning it as an iterator
542
+ pub struct BoxIter {
543
+ iter : Box < Iterator < Match > >
544
+ }
545
+
546
+ impl Iterator < Match > for BoxIter {
547
+ #[ inline]
548
+ fn next ( & mut self ) -> Option < Match > {
549
+ return self . iter . next ( ) ;
550
+ }
551
+ }
552
+
538
553
pub fn resolve_name ( searchstr : & str , filepath : & Path , pos : uint ,
539
- search_type : SearchType , namespace : Namespace ) -> Box < Iterator < Match > > {
554
+ search_type : SearchType , namespace : Namespace ) -> BoxIter {
540
555
let msrc = racer:: load_file_and_mask_comments ( filepath) ;
541
556
542
557
let s = String :: from_str ( searchstr) ;
@@ -604,21 +619,32 @@ pub fn resolve_name(searchstr: &str, filepath: &Path, pos: uint,
604
619
None
605
620
} . move_iter ( ) . flat_map ( |p| p ( ) ) ) ;
606
621
607
- return box it as Box < Iterator < Match > > ;
622
+ //return it;
623
+
624
+ let it = box it as Box < Iterator < Match > > ;
625
+ return BoxIter { iter : it } ;
626
+
608
627
}
609
628
610
629
611
630
pub fn resolve_path ( path : & [ & str ] , filepath : & Path , pos : uint ,
612
- search_type : SearchType , namespace : Namespace ) -> Box < Iterator < Match > > {
631
+ search_type : SearchType , namespace : Namespace ) -> vec :: MoveItems < Match > {
613
632
debug ! ( "PHIL do_local_search path {} in {}" , path, filepath. as_str( ) ) ;
614
633
634
+ let mut out = Vec :: new ( ) ;
635
+
615
636
if path. len ( ) == 1 {
616
637
let searchstr = path[ 0 ] ;
617
- return resolve_name ( searchstr, filepath, pos, search_type, namespace) ;
638
+ for m in resolve_name ( searchstr, filepath, pos, search_type, namespace) {
639
+ out. push ( m) ;
640
+ }
641
+ return out. move_iter ( ) ;
618
642
} else {
619
643
if path[ 0 ] == "" {
620
644
// match global searches starting with :: - e.g. ::std::blah::...
621
- return box do_external_search ( path. slice_from ( 1 ) , filepath, pos, search_type, namespace) as Box < Iterator < Match > > ;
645
+ for m in do_external_search ( path. slice_from ( 1 ) , filepath, pos, search_type, namespace) {
646
+ out. push ( m) ;
647
+ }
622
648
}
623
649
624
650
let parent_path = path. slice_to ( path. len ( ) -1 ) ;
@@ -661,7 +687,8 @@ pub fn resolve_path(path: &[&str], filepath: &Path, pos: uint,
661
687
_ => ( )
662
688
}
663
689
} ) ;
664
- return box out. move_iter ( ) as Box < Iterator < Match > > ;
690
+
691
+ return out. move_iter ( ) ;
665
692
}
666
693
}
667
694
0 commit comments