@@ -21,7 +21,7 @@ use itertools::Itertools;
2121use la_arena:: Idx ;
2222use limit:: Limit ;
2323use rustc_hash:: { FxHashMap , FxHashSet } ;
24- use syntax:: ast;
24+ use syntax:: { ast, SmolStr } ;
2525
2626use crate :: {
2727 attr:: { Attr , AttrId , AttrInput , Attrs } ,
@@ -94,7 +94,6 @@ pub(super) fn collect_defs(
9494 glob_imports : FxHashMap :: default ( ) ,
9595 unresolved_imports : Vec :: new ( ) ,
9696 resolved_imports : Vec :: new ( ) ,
97-
9897 unresolved_macros : Vec :: new ( ) ,
9998 mod_dirs : FxHashMap :: default ( ) ,
10099 cfg_options,
@@ -107,12 +106,8 @@ pub(super) fn collect_defs(
107106 registered_tools : Default :: default ( ) ,
108107 } ;
109108 match block {
110- Some ( block) => {
111- collector. seed_with_inner ( block) ;
112- }
113- None => {
114- collector. seed_with_top_level ( ) ;
115- }
109+ Some ( block) => collector. seed_with_inner ( block) ,
110+ None => collector. seed_with_top_level ( ) ,
116111 }
117112 collector. collect ( ) ;
118113 let mut def_map = collector. finish ( ) ;
@@ -126,16 +121,15 @@ enum PartialResolvedImport {
126121 Unresolved ,
127122 /// One of namespaces is resolved
128123 Indeterminate ( PerNs ) ,
129- /// All namespaces are resolved, OR it is came from other crate
124+ /// All namespaces are resolved, OR it comes from other crate
130125 Resolved ( PerNs ) ,
131126}
132127
133128impl PartialResolvedImport {
134- fn namespaces ( & self ) -> PerNs {
129+ fn namespaces ( self ) -> PerNs {
135130 match self {
136131 PartialResolvedImport :: Unresolved => PerNs :: none ( ) ,
137- PartialResolvedImport :: Indeterminate ( ns) => * ns,
138- PartialResolvedImport :: Resolved ( ns) => * ns,
132+ PartialResolvedImport :: Indeterminate ( ns) | PartialResolvedImport :: Resolved ( ns) => ns,
139133 }
140134 }
141135}
@@ -268,9 +262,9 @@ struct DefCollector<'a> {
268262 /// attributes.
269263 derive_helpers_in_scope : FxHashMap < AstId < ast:: Item > , Vec < Name > > ,
270264 /// Custom attributes registered with `#![register_attr]`.
271- registered_attrs : Vec < String > ,
265+ registered_attrs : Vec < SmolStr > ,
272266 /// Custom tool modules registered with `#![register_tool]`.
273- registered_tools : Vec < String > ,
267+ registered_tools : Vec < SmolStr > ,
274268}
275269
276270impl DefCollector < ' _ > {
@@ -292,31 +286,31 @@ impl DefCollector<'_> {
292286 None => continue ,
293287 } ;
294288
295- let registered_name = if * attr_name == hir_expand:: name![ register_attr]
296- || * attr_name == hir_expand:: name![ register_tool]
297- {
298- match attr. input . as_deref ( ) {
299- Some ( AttrInput :: TokenTree ( subtree, _) ) => match & * subtree. token_trees {
300- [ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( name) ) ] => name. as_name ( ) ,
301- _ => continue ,
302- } ,
303- _ => continue ,
304- }
305- } else {
289+ let attr_is_register_like = * attr_name == hir_expand:: name![ register_attr]
290+ || * attr_name == hir_expand:: name![ register_tool] ;
291+ if !attr_is_register_like {
306292 continue ;
293+ }
294+
295+ let registered_name = match attr. input . as_deref ( ) {
296+ Some ( AttrInput :: TokenTree ( subtree, _) ) => match & * subtree. token_trees {
297+ [ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( name) ) ] => name. as_name ( ) ,
298+ _ => continue ,
299+ } ,
300+ _ => continue ,
307301 } ;
308302
309303 if * attr_name == hir_expand:: name![ register_attr] {
310- self . registered_attrs . push ( registered_name. to_string ( ) ) ;
304+ self . registered_attrs . push ( registered_name. to_smol_str ( ) ) ;
311305 cov_mark:: hit!( register_attr) ;
312306 } else {
313- self . registered_tools . push ( registered_name. to_string ( ) ) ;
307+ self . registered_tools . push ( registered_name. to_smol_str ( ) ) ;
314308 cov_mark:: hit!( register_tool) ;
315309 }
316310 }
317311
318312 ModCollector {
319- def_collector : & mut * self ,
313+ def_collector : self ,
320314 macro_depth : 0 ,
321315 module_id,
322316 tree_id : TreeId :: new ( file_id. into ( ) , None ) ,
@@ -330,13 +324,14 @@ impl DefCollector<'_> {
330324 fn seed_with_inner ( & mut self , block : AstId < ast:: BlockExpr > ) {
331325 let item_tree = self . db . file_item_tree ( block. file_id ) ;
332326 let module_id = self . def_map . root ;
333- if item_tree
327+
328+ let is_cfg_enabled = item_tree
334329 . top_level_attrs ( self . db , self . def_map . krate )
335330 . cfg ( )
336- . map_or ( true , |cfg| self . cfg_options . check ( & cfg) != Some ( false ) )
337- {
331+ . map_or ( true , |cfg| self . cfg_options . check ( & cfg) != Some ( false ) ) ;
332+ if is_cfg_enabled {
338333 ModCollector {
339- def_collector : & mut * self ,
334+ def_collector : self ,
340335 macro_depth : 0 ,
341336 module_id,
342337 // FIXME: populate block once we have per-block ItemTrees
@@ -444,7 +439,7 @@ impl DefCollector<'_> {
444439 let item_tree = self . db . file_item_tree ( file_id) ;
445440 let mod_dir = self . mod_dirs [ & directive. module_id ] . clone ( ) ;
446441 ModCollector {
447- def_collector : & mut * self ,
442+ def_collector : self ,
448443 macro_depth : directive. depth ,
449444 module_id : directive. module_id ,
450445 tree_id : TreeId :: new ( file_id, None ) ,
@@ -522,16 +517,16 @@ impl DefCollector<'_> {
522517 BuiltinShadowMode :: Other ,
523518 ) ;
524519
525- match & per_ns. types {
520+ match per_ns. types {
526521 Some ( ( ModuleDefId :: ModuleId ( m) , _) ) => {
527- self . def_map . prelude = Some ( * m) ;
522+ self . def_map . prelude = Some ( m) ;
528523 return ;
529524 }
530- _ => {
525+ types => {
531526 tracing:: debug!(
532527 "could not resolve prelude path `{}` to module (resolved to {:?})" ,
533528 path,
534- per_ns . types
529+ types
535530 ) ;
536531 }
537532 }
@@ -558,9 +553,9 @@ impl DefCollector<'_> {
558553 let kind = def. kind . to_basedb_kind ( ) ;
559554 self . exports_proc_macros = true ;
560555 let macro_def = match self . proc_macros . iter ( ) . find ( |( n, _) | n == & def. name ) {
561- Some ( ( _, expander) ) => MacroDefId {
556+ Some ( & ( _, expander) ) => MacroDefId {
562557 krate : self . def_map . krate ,
563- kind : MacroDefKind :: ProcMacro ( * expander, kind, ast_id) ,
558+ kind : MacroDefKind :: ProcMacro ( expander, kind, ast_id) ,
564559 local_inner : false ,
565560 } ,
566561 None => MacroDefId {
@@ -786,18 +781,16 @@ impl DefCollector<'_> {
786781 }
787782
788783 fn resolve_extern_crate ( & self , name : & Name ) -> PerNs {
789- let arc;
790- let root = match self . def_map . block {
791- Some ( _) => {
792- arc = self . def_map . crate_root ( self . db ) . def_map ( self . db ) ;
793- & * arc
794- }
795- None => & self . def_map ,
796- } ;
797-
798784 if name == & name ! ( self ) {
799785 cov_mark:: hit!( extern_crate_self_as) ;
800- PerNs :: types ( root. module_id ( root. root ( ) ) . into ( ) , Visibility :: Public )
786+ let root = match self . def_map . block {
787+ Some ( _) => {
788+ let def_map = self . def_map . crate_root ( self . db ) . def_map ( self . db ) ;
789+ def_map. module_id ( def_map. root ( ) )
790+ }
791+ None => self . def_map . module_id ( self . def_map . root ( ) ) ,
792+ } ;
793+ PerNs :: types ( root. into ( ) , Visibility :: Public )
801794 } else {
802795 self . deps . get ( name) . map_or ( PerNs :: none ( ) , |& it| PerNs :: types ( it, Visibility :: Public ) )
803796 }
@@ -817,10 +810,10 @@ impl DefCollector<'_> {
817810 match import. kind {
818811 ImportKind :: Plain | ImportKind :: TypeOnly => {
819812 let name = match & import. alias {
820- Some ( ImportAlias :: Alias ( name) ) => Some ( name. clone ( ) ) ,
813+ Some ( ImportAlias :: Alias ( name) ) => Some ( name) ,
821814 Some ( ImportAlias :: Underscore ) => None ,
822815 None => match import. path . segments ( ) . last ( ) {
823- Some ( last_segment) => Some ( last_segment. clone ( ) ) ,
816+ Some ( last_segment) => Some ( last_segment) ,
824817 None => {
825818 cov_mark:: hit!( bogus_paths) ;
826819 return ;
@@ -837,12 +830,12 @@ impl DefCollector<'_> {
837830
838831 // extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658
839832 if import. is_extern_crate && module_id == self . def_map . root {
840- if let ( Some ( def) , Some ( name) ) = ( def. take_types ( ) , name. as_ref ( ) ) {
833+ if let ( Some ( def) , Some ( name) ) = ( def. take_types ( ) , name) {
841834 self . def_map . extern_prelude . insert ( name. clone ( ) , def) ;
842835 }
843836 }
844837
845- self . update ( module_id, & [ ( name, def) ] , vis, ImportType :: Named ) ;
838+ self . update ( module_id, & [ ( name. cloned ( ) , def) ] , vis, ImportType :: Named ) ;
846839 }
847840 ImportKind :: Glob => {
848841 tracing:: debug!( "glob import: {:?}" , import) ;
@@ -1763,7 +1756,7 @@ impl ModCollector<'_, '_> {
17631756 let is_tool = builtin_attr:: TOOL_MODULES
17641757 . iter ( )
17651758 . copied ( )
1766- . chain ( self . def_collector . registered_tools . iter ( ) . map ( AsRef :: as_ref ) )
1759+ . chain ( self . def_collector . registered_tools . iter ( ) . map ( SmolStr :: as_str ) )
17671760 . any ( |m| tool_module == * m) ;
17681761 if is_tool {
17691762 return true ;
@@ -1776,7 +1769,7 @@ impl ModCollector<'_, '_> {
17761769 . iter ( )
17771770 . chain ( builtin_attr:: EXTRA_ATTRIBUTES )
17781771 . copied ( )
1779- . chain ( self . def_collector . registered_attrs . iter ( ) . map ( AsRef :: as_ref ) )
1772+ . chain ( self . def_collector . registered_attrs . iter ( ) . map ( SmolStr :: as_str ) )
17801773 . any ( |attr| name == * attr) ;
17811774 return is_inert;
17821775 }
0 commit comments