Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/expr_store/lower.rs')
| -rw-r--r-- | crates/hir-def/src/expr_store/lower.rs | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs index f3cf2f7d81..5cbcfe5f23 100644 --- a/crates/hir-def/src/expr_store/lower.rs +++ b/crates/hir-def/src/expr_store/lower.rs @@ -35,8 +35,9 @@ use thin_vec::ThinVec; use tt::TextRange; use crate::{ - AdtId, BlockId, BlockLoc, ConstId, DefWithBodyId, FunctionId, GenericDefId, ImplId, - ItemContainerId, MacroId, ModuleDefId, ModuleId, TraitId, TypeAliasId, UnresolvedMacro, + AdtId, BlockId, BlockIdLt, ConstId, DefWithBodyId, FunctionId, GenericDefId, ImplId, + ItemContainerId, LoweringMode, MacroId, ModuleDefId, ModuleId, TraitId, TypeAliasId, + UnresolvedMacro, attrs::AttrFlags, expr_store::{ Body, BodySourceMap, ExprPtr, ExprRoot, ExpressionStore, ExpressionStoreBuilder, @@ -85,7 +86,7 @@ pub(super) fn lower_body( let mut self_param = None; let mut source_map_self_param = None; let mut params = vec![]; - let mut collector = ExprCollector::new(db, module, current_file_id); + let mut collector = ExprCollector::new(db, module, current_file_id, LoweringMode::Analysis); let skip_body = AttrFlags::query( db, @@ -203,7 +204,8 @@ pub(crate) fn lower_type_ref( module: ModuleId, type_ref: InFile<Option<ast::Type>>, ) -> (ExpressionStore, ExpressionStoreSourceMap, TypeRefId) { - let mut expr_collector = ExprCollector::new(db, module, type_ref.file_id); + let mut expr_collector = + ExprCollector::new(db, module, type_ref.file_id, LoweringMode::Analysis); let type_ref = expr_collector.lower_type_ref_opt(type_ref.value, &mut ExprCollector::impl_trait_allocator); let (store, source_map) = expr_collector.store.finish(); @@ -217,8 +219,9 @@ pub fn lower_generic_params( file_id: HirFileId, param_list: Option<ast::GenericParamList>, where_clause: Option<ast::WhereClause>, + mode: LoweringMode, ) -> (ExpressionStore, GenericParams, ExpressionStoreSourceMap) { - let mut expr_collector = ExprCollector::new(db, module, file_id); + let mut expr_collector = ExprCollector::new(db, module, file_id, mode); let mut collector = generics::GenericParamsCollector::new(def); collector.lower(&mut expr_collector, param_list, where_clause); let params = collector.finish(); @@ -232,7 +235,8 @@ pub(crate) fn lower_impl( impl_syntax: InFile<ast::Impl>, impl_id: ImplId, ) -> (ExpressionStore, ExpressionStoreSourceMap, TypeRefId, Option<TraitRef>, GenericParams) { - let mut expr_collector = ExprCollector::new(db, module, impl_syntax.file_id); + let mut expr_collector = + ExprCollector::new(db, module, impl_syntax.file_id, LoweringMode::Analysis); let self_ty = expr_collector.lower_type_ref_opt_disallow_impl_trait(impl_syntax.value.self_ty()); let trait_ = impl_syntax.value.trait_().and_then(|it| match &it { @@ -260,7 +264,8 @@ pub(crate) fn lower_trait( trait_syntax: InFile<ast::Trait>, trait_id: TraitId, ) -> (ExpressionStore, ExpressionStoreSourceMap, GenericParams) { - let mut expr_collector = ExprCollector::new(db, module, trait_syntax.file_id); + let mut expr_collector = + ExprCollector::new(db, module, trait_syntax.file_id, LoweringMode::Analysis); let mut collector = generics::GenericParamsCollector::with_self_param( &mut expr_collector, trait_id.into(), @@ -283,7 +288,7 @@ pub(crate) fn lower_type_alias( type_alias_id: TypeAliasId, ) -> (ExpressionStore, ExpressionStoreSourceMap, GenericParams, Box<[TypeBound]>, Option<TypeRefId>) { - let mut expr_collector = ExprCollector::new(db, module, alias.file_id); + let mut expr_collector = ExprCollector::new(db, module, alias.file_id, LoweringMode::Analysis); let bounds = alias .value .type_bound_list() @@ -325,7 +330,7 @@ pub(crate) fn lower_function( bool, bool, ) { - let mut expr_collector = ExprCollector::new(db, module, fn_.file_id); + let mut expr_collector = ExprCollector::new(db, module, fn_.file_id, LoweringMode::Analysis); let mut collector = generics::GenericParamsCollector::new(function_id.into()); collector.lower(&mut expr_collector, fn_.value.generic_param_list(), fn_.value.where_clause()); let mut params = vec![]; @@ -449,6 +454,7 @@ pub struct ExprCollector<'db> { def_map: &'db DefMap, local_def_map: &'db LocalDefMap, module: ModuleId, + lowering_mode: LoweringMode, lang_items: OnceCell<&'db LangItems>, pub store: ExpressionStoreBuilder, pub named_lifetime_store: NamedLifetimeStore, @@ -605,6 +611,7 @@ impl<'db> ExprCollector<'db> { db: &dyn SourceDatabase, module: ModuleId, current_file_id: HirFileId, + lowering_mode: LoweringMode, ) -> ExprCollector<'_> { let (def_map, local_def_map) = module.local_def_map(db); let expander = Expander::new(db, current_file_id, def_map); @@ -613,6 +620,7 @@ impl<'db> ExprCollector<'db> { db, cfg_options: krate.cfg_options(db), module, + lowering_mode, def_map, local_def_map, lang_items: OnceCell::new(), @@ -2595,10 +2603,12 @@ impl<'db> ExprCollector<'db> { block: ast::BlockExpr, mk_block: impl FnOnce(&mut Self, Option<BlockId>, Box<[Statement]>, Option<ExprId>) -> Expr, ) -> ExprId { - let block_id = self.expander.ast_id_map().ast_id_for_block(&block).map(|file_local_id| { + let block_id = (|| { + let token = self.lowering_mode.allow_tracked_structs()?; + let file_local_id = self.expander.ast_id_map().ast_id_for_block(&block)?; let ast_id = self.expander.in_file(file_local_id); - BlockId::new(self.db, BlockLoc { ast_id, module: self.module }) - }); + Some(unsafe { BlockIdLt::new(self.db, ast_id, self.module, token).to_static() }) + })(); let (module, def_map) = match block_id.map(|block_id| (block_def_map(self.db, block_id), block_id)) { |