@@ -87,51 +87,43 @@ impl WorldState {
8787 ) -> WorldState {
8888 let mut change = AnalysisChange :: new ( ) ;
8989
90- let mut roots = Vec :: new ( ) ;
91- roots. extend ( folder_roots. iter ( ) . map ( |path| {
92- let mut filter = RustPackageFilterBuilder :: default ( ) . set_member ( true ) ;
93- for glob in exclude_globs. iter ( ) {
94- filter = filter. exclude ( glob. clone ( ) ) ;
95- }
96- RootEntry :: new ( path. clone ( ) , filter. into_vfs_filter ( ) )
97- } ) ) ;
98- for ws in workspaces. iter ( ) {
99- roots. extend ( ws. to_roots ( ) . into_iter ( ) . map ( |pkg_root| {
100- let mut filter =
101- RustPackageFilterBuilder :: default ( ) . set_member ( pkg_root. is_member ( ) ) ;
102- for glob in exclude_globs. iter ( ) {
103- filter = filter. exclude ( glob. clone ( ) ) ;
104- }
105- RootEntry :: new ( pkg_root. path ( ) . clone ( ) , filter. into_vfs_filter ( ) )
106- } ) ) ;
107- }
108-
109- let mut extern_dirs = FxHashSet :: default ( ) ;
110- for ws in workspaces. iter ( ) {
111- extern_dirs. extend ( ws. out_dirs ( ) ) ;
112- }
113-
114- let mut extern_source_roots = FxHashMap :: default ( ) ;
115-
116- roots. extend ( extern_dirs. iter ( ) . map ( |path| {
117- let mut filter = RustPackageFilterBuilder :: default ( ) . set_member ( false ) ;
118- for glob in exclude_globs. iter ( ) {
119- filter = filter. exclude ( glob. clone ( ) ) ;
120- }
121- RootEntry :: new ( PathBuf :: from ( & path) , filter. into_vfs_filter ( ) )
122- } ) ) ;
90+ let extern_dirs: FxHashSet < _ > =
91+ workspaces. iter ( ) . flat_map ( ProjectWorkspace :: out_dirs) . collect ( ) ;
92+
93+ let roots: Vec < _ > = {
94+ let create_filter = |is_member| {
95+ RustPackageFilterBuilder :: default ( )
96+ . set_member ( is_member)
97+ . exclude ( exclude_globs. iter ( ) . cloned ( ) )
98+ . into_vfs_filter ( )
99+ } ;
100+ folder_roots
101+ . iter ( )
102+ . map ( |path| RootEntry :: new ( path. clone ( ) , create_filter ( true ) ) )
103+ . chain ( workspaces. iter ( ) . flat_map ( ProjectWorkspace :: to_roots) . map ( |pkg_root| {
104+ RootEntry :: new ( pkg_root. path , create_filter ( pkg_root. is_member ) )
105+ } ) )
106+ . chain (
107+ extern_dirs
108+ . iter ( )
109+ . map ( |path| RootEntry :: new ( path. to_owned ( ) , create_filter ( false ) ) ) ,
110+ )
111+ . collect ( )
112+ } ;
123113
124114 let ( task_sender, task_receiver) = unbounded ( ) ;
125115 let task_sender = Box :: new ( move |t| task_sender. send ( t) . unwrap ( ) ) ;
126116 let ( mut vfs, vfs_roots) = Vfs :: new ( roots, task_sender, watch) ;
127117
118+ let mut extern_source_roots = FxHashMap :: default ( ) ;
128119 for r in vfs_roots {
129120 let vfs_root_path = vfs. root2path ( r) ;
130121 let is_local = folder_roots. iter ( ) . any ( |it| vfs_root_path. starts_with ( it) ) ;
131122 change. add_root ( SourceRootId ( r. 0 ) , is_local) ;
132123 change. set_debug_root_path ( SourceRootId ( r. 0 ) , vfs_root_path. display ( ) . to_string ( ) ) ;
133124
134125 // FIXME: add path2root in vfs to simpily this logic
126+
135127 if extern_dirs. contains ( & vfs_root_path) {
136128 extern_source_roots. insert ( vfs_root_path, ExternSourceId ( r. 0 ) ) ;
137129 }
0 commit comments