From 98baa9b569b49162392ed4149dd435854fe941b8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 12 Aug 2020 16:22:05 +0200 Subject: Rename ra_arena --- crates/ra_hir_def/src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index d5f18b920..cb178655b 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -5,10 +5,10 @@ pub mod scope; use std::{mem, ops::Index, sync::Arc}; +use arena::{map::ArenaMap, Arena}; use drop_bomb::DropBomb; use either::Either; use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; -use ra_arena::{map::ArenaMap, Arena}; use ra_cfg::CfgOptions; use ra_db::CrateId; use ra_prof::profile; -- cgit v1.2.3 From 208b7bd7ba687fb570feb1b89219f14c63712ce8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 12 Aug 2020 16:32:36 +0200 Subject: Rename ra_prof -> profile --- crates/ra_hir_def/src/body.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index cb178655b..1deb1a837 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -11,7 +11,6 @@ use either::Either; use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; use ra_cfg::CfgOptions; use ra_db::CrateId; -use ra_prof::profile; use ra_syntax::{ast, AstNode, AstPtr}; use rustc_hash::FxHashMap; use test_utils::mark; @@ -228,7 +227,7 @@ impl Body { db: &dyn DefDatabase, def: DefWithBodyId, ) -> (Arc, Arc) { - let _p = profile("body_with_source_map_query"); + let _p = profile::span("body_with_source_map_query"); let mut params = None; let (file_id, module, body) = match def { -- cgit v1.2.3 From a1c187eef3ba08076aedb5154929f7eda8d1b424 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 12 Aug 2020 18:26:51 +0200 Subject: Rename ra_syntax -> syntax --- crates/ra_hir_def/src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 1deb1a837..7c33966a7 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -11,8 +11,8 @@ use either::Either; use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; use ra_cfg::CfgOptions; use ra_db::CrateId; -use ra_syntax::{ast, AstNode, AstPtr}; use rustc_hash::FxHashMap; +use syntax::{ast, AstNode, AstPtr}; use test_utils::mark; pub(crate) use lower::LowerCtx; -- cgit v1.2.3 From 68c223872562a8d746d4f1045d508887a0cbca5e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 13 Aug 2020 10:19:09 +0200 Subject: Rename ra_cfg -> cfg --- crates/ra_hir_def/src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 7c33966a7..3568513d1 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -9,7 +9,7 @@ use arena::{map::ArenaMap, Arena}; use drop_bomb::DropBomb; use either::Either; use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; -use ra_cfg::CfgOptions; +use cfg::CfgOptions; use ra_db::CrateId; use rustc_hash::FxHashMap; use syntax::{ast, AstNode, AstPtr}; -- cgit v1.2.3 From 7d9480c6eb43b3ef1bd75ad26e99c14cca5cb366 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 13 Aug 2020 10:32:19 +0200 Subject: fmt --- crates/ra_hir_def/src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 3568513d1..fe659386a 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -6,10 +6,10 @@ pub mod scope; use std::{mem, ops::Index, sync::Arc}; use arena::{map::ArenaMap, Arena}; +use cfg::CfgOptions; use drop_bomb::DropBomb; use either::Either; use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; -use cfg::CfgOptions; use ra_db::CrateId; use rustc_hash::FxHashMap; use syntax::{ast, AstNode, AstPtr}; -- cgit v1.2.3 From ed20a857f485a471369cd99b843af19a4d875ad0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 13 Aug 2020 16:25:38 +0200 Subject: Rename ra_db -> base_db --- crates/ra_hir_def/src/body.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index fe659386a..9a9a605dd 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -6,11 +6,11 @@ pub mod scope; use std::{mem, ops::Index, sync::Arc}; use arena::{map::ArenaMap, Arena}; +use base_db::CrateId; use cfg::CfgOptions; use drop_bomb::DropBomb; use either::Either; use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; -use ra_db::CrateId; use rustc_hash::FxHashMap; use syntax::{ast, AstNode, AstPtr}; use test_utils::mark; @@ -320,7 +320,7 @@ impl BodySourceMap { #[cfg(test)] mod tests { - use ra_db::{fixture::WithFixture, SourceDatabase}; + use base_db::{fixture::WithFixture, SourceDatabase}; use test_utils::mark; use crate::ModuleDefId; -- cgit v1.2.3 From b28c54a2c239acd73f2eea80fda9ee3960d2c046 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 13 Aug 2020 16:28:27 +0200 Subject: Rename ra_hir_def -> hir_def --- crates/ra_hir_def/src/body.rs | 360 ------------------------------------------ 1 file changed, 360 deletions(-) delete mode 100644 crates/ra_hir_def/src/body.rs (limited to 'crates/ra_hir_def/src/body.rs') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs deleted file mode 100644 index 9a9a605dd..000000000 --- a/crates/ra_hir_def/src/body.rs +++ /dev/null @@ -1,360 +0,0 @@ -//! Defines `Body`: a lowered representation of bodies of functions, statics and -//! consts. -mod lower; -pub mod scope; - -use std::{mem, ops::Index, sync::Arc}; - -use arena::{map::ArenaMap, Arena}; -use base_db::CrateId; -use cfg::CfgOptions; -use drop_bomb::DropBomb; -use either::Either; -use hir_expand::{ast_id_map::AstIdMap, hygiene::Hygiene, AstId, HirFileId, InFile, MacroDefId}; -use rustc_hash::FxHashMap; -use syntax::{ast, AstNode, AstPtr}; -use test_utils::mark; - -pub(crate) use lower::LowerCtx; - -use crate::{ - attr::Attrs, - db::DefDatabase, - expr::{Expr, ExprId, Pat, PatId}, - item_scope::BuiltinShadowMode, - item_scope::ItemScope, - nameres::CrateDefMap, - path::{ModPath, Path}, - src::HasSource, - AsMacroCall, DefWithBodyId, HasModule, Lookup, ModuleId, -}; - -/// A subset of Expander that only deals with cfg attributes. We only need it to -/// avoid cyclic queries in crate def map during enum processing. -pub(crate) struct CfgExpander { - cfg_options: CfgOptions, - hygiene: Hygiene, -} - -pub(crate) struct Expander { - cfg_expander: CfgExpander, - crate_def_map: Arc, - current_file_id: HirFileId, - ast_id_map: Arc, - module: ModuleId, - recursion_limit: usize, -} - -#[cfg(test)] -const EXPANSION_RECURSION_LIMIT: usize = 32; - -#[cfg(not(test))] -const EXPANSION_RECURSION_LIMIT: usize = 128; - -impl CfgExpander { - pub(crate) fn new( - db: &dyn DefDatabase, - current_file_id: HirFileId, - krate: CrateId, - ) -> CfgExpander { - let hygiene = Hygiene::new(db.upcast(), current_file_id); - let cfg_options = db.crate_graph()[krate].cfg_options.clone(); - CfgExpander { cfg_options, hygiene } - } - - pub(crate) fn parse_attrs(&self, owner: &dyn ast::AttrsOwner) -> Attrs { - Attrs::new(owner, &self.hygiene) - } - - pub(crate) fn is_cfg_enabled(&self, owner: &dyn ast::AttrsOwner) -> bool { - let attrs = self.parse_attrs(owner); - attrs.is_cfg_enabled(&self.cfg_options) - } -} - -impl Expander { - pub(crate) fn new( - db: &dyn DefDatabase, - current_file_id: HirFileId, - module: ModuleId, - ) -> Expander { - let cfg_expander = CfgExpander::new(db, current_file_id, module.krate); - let crate_def_map = db.crate_def_map(module.krate); - let ast_id_map = db.ast_id_map(current_file_id); - Expander { - cfg_expander, - crate_def_map, - current_file_id, - ast_id_map, - module, - recursion_limit: 0, - } - } - - pub(crate) fn enter_expand( - &mut self, - db: &dyn DefDatabase, - local_scope: Option<&ItemScope>, - macro_call: ast::MacroCall, - ) -> Option<(Mark, T)> { - self.recursion_limit += 1; - if self.recursion_limit > EXPANSION_RECURSION_LIMIT { - mark::hit!(your_stack_belongs_to_me); - return None; - } - - let macro_call = InFile::new(self.current_file_id, ¯o_call); - - if let Some(call_id) = macro_call.as_call_id(db, self.crate_def_map.krate, |path| { - if let Some(local_scope) = local_scope { - if let Some(def) = path.as_ident().and_then(|n| local_scope.get_legacy_macro(n)) { - return Some(def); - } - } - self.resolve_path_as_macro(db, &path) - }) { - let file_id = call_id.as_file(); - if let Some(node) = db.parse_or_expand(file_id) { - if let Some(expr) = T::cast(node) { - log::debug!("macro expansion {:#?}", expr.syntax()); - - let mark = Mark { - file_id: self.current_file_id, - ast_id_map: mem::take(&mut self.ast_id_map), - bomb: DropBomb::new("expansion mark dropped"), - }; - self.cfg_expander.hygiene = Hygiene::new(db.upcast(), file_id); - self.current_file_id = file_id; - self.ast_id_map = db.ast_id_map(file_id); - return Some((mark, expr)); - } - } - } - - // FIXME: Instead of just dropping the error from expansion - // report it - None - } - - pub(crate) fn exit(&mut self, db: &dyn DefDatabase, mut mark: Mark) { - self.cfg_expander.hygiene = Hygiene::new(db.upcast(), mark.file_id); - self.current_file_id = mark.file_id; - self.ast_id_map = mem::take(&mut mark.ast_id_map); - self.recursion_limit -= 1; - mark.bomb.defuse(); - } - - pub(crate) fn to_source(&self, value: T) -> InFile { - InFile { file_id: self.current_file_id, value } - } - - pub(crate) fn is_cfg_enabled(&self, owner: &dyn ast::AttrsOwner) -> bool { - self.cfg_expander.is_cfg_enabled(owner) - } - - fn parse_path(&mut self, path: ast::Path) -> Option { - Path::from_src(path, &self.cfg_expander.hygiene) - } - - fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option { - self.crate_def_map - .resolve_path(db, self.module.local_id, path, BuiltinShadowMode::Other) - .0 - .take_macros() - } - - fn ast_id(&self, item: &N) -> AstId { - let file_local_id = self.ast_id_map.ast_id(item); - AstId::new(self.current_file_id, file_local_id) - } -} - -pub(crate) struct Mark { - file_id: HirFileId, - ast_id_map: Arc, - bomb: DropBomb, -} - -/// The body of an item (function, const etc.). -#[derive(Debug, Eq, PartialEq)] -pub struct Body { - pub exprs: Arena, - pub pats: Arena, - /// The patterns for the function's parameters. While the parameter types are - /// part of the function signature, the patterns are not (they don't change - /// the external type of the function). - /// - /// If this `Body` is for the body of a constant, this will just be - /// empty. - pub params: Vec, - /// The `ExprId` of the actual body expression. - pub body_expr: ExprId, - pub item_scope: ItemScope, -} - -pub type ExprPtr = AstPtr; -pub type ExprSource = InFile; - -pub type PatPtr = Either, AstPtr>; -pub type PatSource = InFile; - -/// An item body together with the mapping from syntax nodes to HIR expression -/// IDs. This is needed to go from e.g. a position in a file to the HIR -/// expression containing it; but for type inference etc., we want to operate on -/// a structure that is agnostic to the actual positions of expressions in the -/// file, so that we don't recompute types whenever some whitespace is typed. -/// -/// One complication here is that, due to macro expansion, a single `Body` might -/// be spread across several files. So, for each ExprId and PatId, we record -/// both the HirFileId and the position inside the file. However, we only store -/// AST -> ExprId mapping for non-macro files, as it is not clear how to handle -/// this properly for macros. -#[derive(Default, Debug, Eq, PartialEq)] -pub struct BodySourceMap { - expr_map: FxHashMap, - expr_map_back: ArenaMap>, - pat_map: FxHashMap, - pat_map_back: ArenaMap>, - field_map: FxHashMap<(ExprId, usize), InFile>>, - expansions: FxHashMap>, HirFileId>, -} - -#[derive(Default, Debug, Eq, PartialEq, Clone, Copy)] -pub struct SyntheticSyntax; - -impl Body { - pub(crate) fn body_with_source_map_query( - db: &dyn DefDatabase, - def: DefWithBodyId, - ) -> (Arc, Arc) { - let _p = profile::span("body_with_source_map_query"); - let mut params = None; - - let (file_id, module, body) = match def { - DefWithBodyId::FunctionId(f) => { - let f = f.lookup(db); - let src = f.source(db); - params = src.value.param_list(); - (src.file_id, f.module(db), src.value.body().map(ast::Expr::from)) - } - DefWithBodyId::ConstId(c) => { - let c = c.lookup(db); - let src = c.source(db); - (src.file_id, c.module(db), src.value.body()) - } - DefWithBodyId::StaticId(s) => { - let s = s.lookup(db); - let src = s.source(db); - (src.file_id, s.module(db), src.value.body()) - } - }; - let expander = Expander::new(db, file_id, module); - let (body, source_map) = Body::new(db, def, expander, params, body); - (Arc::new(body), Arc::new(source_map)) - } - - pub(crate) fn body_query(db: &dyn DefDatabase, def: DefWithBodyId) -> Arc { - db.body_with_source_map(def).0 - } - - fn new( - db: &dyn DefDatabase, - def: DefWithBodyId, - expander: Expander, - params: Option, - body: Option, - ) -> (Body, BodySourceMap) { - lower::lower(db, def, expander, params, body) - } -} - -impl Index for Body { - type Output = Expr; - - fn index(&self, expr: ExprId) -> &Expr { - &self.exprs[expr] - } -} - -impl Index for Body { - type Output = Pat; - - fn index(&self, pat: PatId) -> &Pat { - &self.pats[pat] - } -} - -impl BodySourceMap { - pub fn expr_syntax(&self, expr: ExprId) -> Result { - self.expr_map_back[expr].clone() - } - - pub fn node_expr(&self, node: InFile<&ast::Expr>) -> Option { - let src = node.map(|it| AstPtr::new(it)); - self.expr_map.get(&src).cloned() - } - - pub fn node_macro_file(&self, node: InFile<&ast::MacroCall>) -> Option { - let src = node.map(|it| AstPtr::new(it)); - self.expansions.get(&src).cloned() - } - - pub fn pat_syntax(&self, pat: PatId) -> Result { - self.pat_map_back[pat].clone() - } - - pub fn node_pat(&self, node: InFile<&ast::Pat>) -> Option { - let src = node.map(|it| Either::Left(AstPtr::new(it))); - self.pat_map.get(&src).cloned() - } - - pub fn node_self_param(&self, node: InFile<&ast::SelfParam>) -> Option { - let src = node.map(|it| Either::Right(AstPtr::new(it))); - self.pat_map.get(&src).cloned() - } - - pub fn field_syntax(&self, expr: ExprId, field: usize) -> InFile> { - self.field_map[&(expr, field)].clone() - } -} - -#[cfg(test)] -mod tests { - use base_db::{fixture::WithFixture, SourceDatabase}; - use test_utils::mark; - - use crate::ModuleDefId; - - use super::*; - - fn lower(ra_fixture: &str) -> Arc { - let (db, file_id) = crate::test_db::TestDB::with_single_file(ra_fixture); - - let krate = db.crate_graph().iter().next().unwrap(); - let def_map = db.crate_def_map(krate); - let module = def_map.modules_for_file(file_id).next().unwrap(); - let module = &def_map[module]; - let fn_def = match module.scope.declarations().next().unwrap() { - ModuleDefId::FunctionId(it) => it, - _ => panic!(), - }; - - db.body(fn_def.into()) - } - - #[test] - fn your_stack_belongs_to_me() { - mark::check!(your_stack_belongs_to_me); - lower( - " -macro_rules! n_nuple { - ($e:tt) => (); - ($($rest:tt)*) => {{ - (n_nuple!($($rest)*)None,) - }}; -} -fn main() { n_nuple!(1,2,3); } -", - ); - } -} -- cgit v1.2.3