aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres/collector.rs
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2020-06-24 14:36:18 +0100
committerJonas Schievink <[email protected]>2020-06-24 15:54:20 +0100
commit43cad21623bc5de59598a565097be9c7d8642818 (patch)
tree5c467e4497824e0c67659311da7641ded7164a97 /crates/ra_hir_def/src/nameres/collector.rs
parent16fd4dabb754b017237127e70ef1e2b409c4f9b6 (diff)
Don't allocate common visibilities
Diffstat (limited to 'crates/ra_hir_def/src/nameres/collector.rs')
-rw-r--r--crates/ra_hir_def/src/nameres/collector.rs52
1 files changed, 28 insertions, 24 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs
index 40aff830f..94da700ad 100644
--- a/crates/ra_hir_def/src/nameres/collector.rs
+++ b/crates/ra_hir_def/src/nameres/collector.rs
@@ -20,7 +20,9 @@ use test_utils::mark;
20use crate::{ 20use crate::{
21 attr::Attrs, 21 attr::Attrs,
22 db::DefDatabase, 22 db::DefDatabase,
23 item_tree::{self, ItemTree, ItemTreeId, MacroCall, Mod, ModItem, ModKind, StructDefKind}, 23 item_tree::{
24 self, FileItemTreeId, ItemTree, ItemTreeId, MacroCall, Mod, ModItem, ModKind, StructDefKind,
25 },
24 nameres::{ 26 nameres::{
25 diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, 27 diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint,
26 BuiltinShadowMode, CrateDefMap, ModuleData, ModuleOrigin, ResolveMode, 28 BuiltinShadowMode, CrateDefMap, ModuleData, ModuleOrigin, ResolveMode,
@@ -114,26 +116,28 @@ struct Import {
114 pub is_macro_use: bool, 116 pub is_macro_use: bool,
115} 117}
116 118
117impl From<item_tree::Import> for Import { 119impl Import {
118 fn from(it: item_tree::Import) -> Self { 120 fn from_use(tree: &ItemTree, id: FileItemTreeId<item_tree::Import>) -> Self {
121 let it = &tree[id];
122 let visibility = &tree[it.visibility];
119 Self { 123 Self {
120 path: it.path, 124 path: it.path.clone(),
121 alias: it.alias, 125 alias: it.alias.clone(),
122 visibility: it.visibility, 126 visibility: visibility.clone(),
123 is_glob: it.is_glob, 127 is_glob: it.is_glob,
124 is_prelude: it.is_prelude, 128 is_prelude: it.is_prelude,
125 is_extern_crate: false, 129 is_extern_crate: false,
126 is_macro_use: false, 130 is_macro_use: false,
127 } 131 }
128 } 132 }
129}
130 133
131impl From<item_tree::ExternCrate> for Import { 134 fn from_extern_crate(tree: &ItemTree, id: FileItemTreeId<item_tree::ExternCrate>) -> Self {
132 fn from(it: item_tree::ExternCrate) -> Self { 135 let it = &tree[id];
136 let visibility = &tree[it.visibility];
133 Self { 137 Self {
134 path: it.path, 138 path: it.path.clone(),
135 alias: it.alias, 139 alias: it.alias.clone(),
136 visibility: it.visibility, 140 visibility: visibility.clone(),
137 is_glob: false, 141 is_glob: false,
138 is_prelude: false, 142 is_prelude: false,
139 is_extern_crate: true, 143 is_extern_crate: true,
@@ -761,14 +765,14 @@ impl ModCollector<'_, '_> {
761 ModItem::Import(import_id) => { 765 ModItem::Import(import_id) => {
762 self.def_collector.unresolved_imports.push(ImportDirective { 766 self.def_collector.unresolved_imports.push(ImportDirective {
763 module_id: self.module_id, 767 module_id: self.module_id,
764 import: self.item_tree[import_id].clone().into(), 768 import: Import::from_use(&self.item_tree, import_id),
765 status: PartialResolvedImport::Unresolved, 769 status: PartialResolvedImport::Unresolved,
766 }) 770 })
767 } 771 }
768 ModItem::ExternCrate(import_id) => { 772 ModItem::ExternCrate(import_id) => {
769 self.def_collector.unresolved_imports.push(ImportDirective { 773 self.def_collector.unresolved_imports.push(ImportDirective {
770 module_id: self.module_id, 774 module_id: self.module_id,
771 import: self.item_tree[import_id].clone().into(), 775 import: Import::from_extern_crate(&self.item_tree, import_id),
772 status: PartialResolvedImport::Unresolved, 776 status: PartialResolvedImport::Unresolved,
773 }) 777 })
774 } 778 }
@@ -795,7 +799,7 @@ impl ModCollector<'_, '_> {
795 .intern(self.def_collector.db) 799 .intern(self.def_collector.db)
796 .into(), 800 .into(),
797 name: &func.name, 801 name: &func.name,
798 visibility: &func.visibility, 802 visibility: &self.item_tree[func.visibility],
799 has_constructor: false, 803 has_constructor: false,
800 }); 804 });
801 } 805 }
@@ -812,7 +816,7 @@ impl ModCollector<'_, '_> {
812 .intern(self.def_collector.db) 816 .intern(self.def_collector.db)
813 .into(), 817 .into(),
814 name: &it.name, 818 name: &it.name,
815 visibility: &it.visibility, 819 visibility: &self.item_tree[it.visibility],
816 has_constructor: it.kind != StructDefKind::Record, 820 has_constructor: it.kind != StructDefKind::Record,
817 }); 821 });
818 } 822 }
@@ -829,7 +833,7 @@ impl ModCollector<'_, '_> {
829 .intern(self.def_collector.db) 833 .intern(self.def_collector.db)
830 .into(), 834 .into(),
831 name: &it.name, 835 name: &it.name,
832 visibility: &it.visibility, 836 visibility: &self.item_tree[it.visibility],
833 has_constructor: false, 837 has_constructor: false,
834 }); 838 });
835 } 839 }
@@ -846,7 +850,7 @@ impl ModCollector<'_, '_> {
846 .intern(self.def_collector.db) 850 .intern(self.def_collector.db)
847 .into(), 851 .into(),
848 name: &it.name, 852 name: &it.name,
849 visibility: &it.visibility, 853 visibility: &self.item_tree[it.visibility],
850 has_constructor: false, 854 has_constructor: false,
851 }); 855 });
852 } 856 }
@@ -862,7 +866,7 @@ impl ModCollector<'_, '_> {
862 .intern(self.def_collector.db) 866 .intern(self.def_collector.db)
863 .into(), 867 .into(),
864 name, 868 name,
865 visibility: &it.visibility, 869 visibility: &self.item_tree[it.visibility],
866 has_constructor: false, 870 has_constructor: false,
867 }); 871 });
868 } 872 }
@@ -875,7 +879,7 @@ impl ModCollector<'_, '_> {
875 .intern(self.def_collector.db) 879 .intern(self.def_collector.db)
876 .into(), 880 .into(),
877 name: &it.name, 881 name: &it.name,
878 visibility: &it.visibility, 882 visibility: &self.item_tree[it.visibility],
879 has_constructor: false, 883 has_constructor: false,
880 }); 884 });
881 } 885 }
@@ -887,7 +891,7 @@ impl ModCollector<'_, '_> {
887 .intern(self.def_collector.db) 891 .intern(self.def_collector.db)
888 .into(), 892 .into(),
889 name: &it.name, 893 name: &it.name,
890 visibility: &it.visibility, 894 visibility: &self.item_tree[it.visibility],
891 has_constructor: false, 895 has_constructor: false,
892 }); 896 });
893 } 897 }
@@ -902,7 +906,7 @@ impl ModCollector<'_, '_> {
902 .intern(self.def_collector.db) 906 .intern(self.def_collector.db)
903 .into(), 907 .into(),
904 name: &it.name, 908 name: &it.name,
905 visibility: &it.visibility, 909 visibility: &self.item_tree[it.visibility],
906 has_constructor: false, 910 has_constructor: false,
907 }); 911 });
908 } 912 }
@@ -935,7 +939,7 @@ impl ModCollector<'_, '_> {
935 module.name.clone(), 939 module.name.clone(),
936 AstId::new(self.file_id, module.ast_id), 940 AstId::new(self.file_id, module.ast_id),
937 None, 941 None,
938 &module.visibility, 942 &self.item_tree[module.visibility],
939 ); 943 );
940 944
941 ModCollector { 945 ModCollector {
@@ -965,7 +969,7 @@ impl ModCollector<'_, '_> {
965 module.name.clone(), 969 module.name.clone(),
966 ast_id, 970 ast_id,
967 Some((file_id, is_mod_rs)), 971 Some((file_id, is_mod_rs)),
968 &module.visibility, 972 &self.item_tree[module.visibility],
969 ); 973 );
970 let item_tree = self.def_collector.db.item_tree(file_id.into()); 974 let item_tree = self.def_collector.db.item_tree(file_id.into());
971 ModCollector { 975 ModCollector {