mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 06:03:58 +00:00
Pull Expander up
This commit is contained in:
parent
6b0870d12e
commit
e9519e1035
3 changed files with 24 additions and 11 deletions
|
@ -24,9 +24,11 @@ use crate::{
|
||||||
src::HasSource,
|
src::HasSource,
|
||||||
AsMacroCall, DefWithBodyId, HasModule, Lookup, ModuleId,
|
AsMacroCall, DefWithBodyId, HasModule, Lookup, ModuleId,
|
||||||
};
|
};
|
||||||
|
use ra_cfg::CfgOptions;
|
||||||
|
|
||||||
pub(crate) struct Expander {
|
pub(crate) struct Expander {
|
||||||
crate_def_map: Arc<CrateDefMap>,
|
crate_def_map: Arc<CrateDefMap>,
|
||||||
|
cfg_options: CfgOptions,
|
||||||
current_file_id: HirFileId,
|
current_file_id: HirFileId,
|
||||||
hygiene: Hygiene,
|
hygiene: Hygiene,
|
||||||
ast_id_map: Arc<AstIdMap>,
|
ast_id_map: Arc<AstIdMap>,
|
||||||
|
@ -43,7 +45,16 @@ impl Expander {
|
||||||
let crate_def_map = db.crate_def_map(module.krate);
|
let crate_def_map = db.crate_def_map(module.krate);
|
||||||
let hygiene = Hygiene::new(db.upcast(), current_file_id);
|
let hygiene = Hygiene::new(db.upcast(), current_file_id);
|
||||||
let ast_id_map = db.ast_id_map(current_file_id);
|
let ast_id_map = db.ast_id_map(current_file_id);
|
||||||
Expander { crate_def_map, current_file_id, hygiene, ast_id_map, module, recursive_limit: 0 }
|
let cfg_options = db.crate_graph()[module.krate].cfg_options.clone();
|
||||||
|
Expander {
|
||||||
|
crate_def_map,
|
||||||
|
cfg_options,
|
||||||
|
current_file_id,
|
||||||
|
hygiene,
|
||||||
|
ast_id_map,
|
||||||
|
module,
|
||||||
|
recursive_limit: 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn enter_expand<T: ast::AstNode>(
|
pub(crate) fn enter_expand<T: ast::AstNode>(
|
||||||
|
@ -107,6 +118,10 @@ impl Expander {
|
||||||
Attrs::new(owner, &self.hygiene)
|
Attrs::new(owner, &self.hygiene)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn check_cfg(&self, attrs: &Attrs) -> bool {
|
||||||
|
attrs.is_cfg_enabled(&self.cfg_options)
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_path(&mut self, path: ast::Path) -> Option<Path> {
|
fn parse_path(&mut self, path: ast::Path) -> Option<Path> {
|
||||||
Path::from_src(path, &self.hygiene)
|
Path::from_src(path, &self.hygiene)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,8 @@ use crate::{
|
||||||
path::GenericArgs,
|
path::GenericArgs,
|
||||||
path::Path,
|
path::Path,
|
||||||
type_ref::{Mutability, TypeRef},
|
type_ref::{Mutability, TypeRef},
|
||||||
AdtId, ConstLoc, ContainerId, DefWithBodyId, EnumLoc, FunctionLoc, HasModule, Intern,
|
AdtId, ConstLoc, ContainerId, DefWithBodyId, EnumLoc, FunctionLoc, Intern, ModuleDefId,
|
||||||
ModuleDefId, StaticLoc, StructLoc, TraitLoc, TypeAliasLoc, UnionLoc,
|
StaticLoc, StructLoc, TraitLoc, TypeAliasLoc, UnionLoc,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{ExprSource, PatSource};
|
use super::{ExprSource, PatSource};
|
||||||
|
@ -298,7 +298,6 @@ impl ExprCollector<'_> {
|
||||||
self.alloc_expr(Expr::Return { expr }, syntax_ptr)
|
self.alloc_expr(Expr::Return { expr }, syntax_ptr)
|
||||||
}
|
}
|
||||||
ast::Expr::RecordLit(e) => {
|
ast::Expr::RecordLit(e) => {
|
||||||
let crate_graph = self.db.crate_graph();
|
|
||||||
let path = e.path().and_then(|path| self.expander.parse_path(path));
|
let path = e.path().and_then(|path| self.expander.parse_path(path));
|
||||||
let mut field_ptrs = Vec::new();
|
let mut field_ptrs = Vec::new();
|
||||||
let record_lit = if let Some(nfl) = e.record_field_list() {
|
let record_lit = if let Some(nfl) = e.record_field_list() {
|
||||||
|
@ -306,10 +305,9 @@ impl ExprCollector<'_> {
|
||||||
.fields()
|
.fields()
|
||||||
.inspect(|field| field_ptrs.push(AstPtr::new(field)))
|
.inspect(|field| field_ptrs.push(AstPtr::new(field)))
|
||||||
.filter_map(|field| {
|
.filter_map(|field| {
|
||||||
let module_id = ContainerId::DefWithBodyId(self.def).module(self.db);
|
|
||||||
let attrs = self.expander.parse_attrs(&field);
|
let attrs = self.expander.parse_attrs(&field);
|
||||||
|
|
||||||
if !attrs.is_cfg_enabled(&crate_graph[module_id.krate].cfg_options) {
|
if !self.expander.check_cfg(&attrs) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ use crate::{
|
||||||
type_ref::{Mutability, TypeBound, TypeRef},
|
type_ref::{Mutability, TypeBound, TypeRef},
|
||||||
visibility::RawVisibility,
|
visibility::RawVisibility,
|
||||||
AssocContainerId, AssocItemId, ConstId, ConstLoc, Expander, FunctionId, FunctionLoc, HasModule,
|
AssocContainerId, AssocItemId, ConstId, ConstLoc, Expander, FunctionId, FunctionLoc, HasModule,
|
||||||
ImplId, Intern, Lookup, ModuleId, StaticId, TraitId, TypeAliasId, TypeAliasLoc,
|
ImplId, Intern, Lookup, StaticId, TraitId, TypeAliasId, TypeAliasLoc,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
@ -218,10 +218,11 @@ impl ImplData {
|
||||||
let mut items = Vec::new();
|
let mut items = Vec::new();
|
||||||
|
|
||||||
if let Some(item_list) = src.value.item_list() {
|
if let Some(item_list) = src.value.item_list() {
|
||||||
|
let mut expander = Expander::new(db, impl_loc.ast_id.file_id, module_id);
|
||||||
items.extend(collect_impl_items(db, item_list.impl_items(), src.file_id, id));
|
items.extend(collect_impl_items(db, item_list.impl_items(), src.file_id, id));
|
||||||
items.extend(collect_impl_items_in_macros(
|
items.extend(collect_impl_items_in_macros(
|
||||||
db,
|
db,
|
||||||
module_id,
|
&mut expander,
|
||||||
&src.with_value(item_list),
|
&src.with_value(item_list),
|
||||||
id,
|
id,
|
||||||
));
|
));
|
||||||
|
@ -268,18 +269,17 @@ impl ConstData {
|
||||||
|
|
||||||
fn collect_impl_items_in_macros(
|
fn collect_impl_items_in_macros(
|
||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
module_id: ModuleId,
|
expander: &mut Expander,
|
||||||
impl_def: &InFile<ast::ItemList>,
|
impl_def: &InFile<ast::ItemList>,
|
||||||
id: ImplId,
|
id: ImplId,
|
||||||
) -> Vec<AssocItemId> {
|
) -> Vec<AssocItemId> {
|
||||||
let mut expander = Expander::new(db, impl_def.file_id, module_id);
|
|
||||||
let mut res = Vec::new();
|
let mut res = Vec::new();
|
||||||
|
|
||||||
// We set a limit to protect against infinite recursion
|
// We set a limit to protect against infinite recursion
|
||||||
let limit = 100;
|
let limit = 100;
|
||||||
|
|
||||||
for m in impl_def.value.syntax().children().filter_map(ast::MacroCall::cast) {
|
for m in impl_def.value.syntax().children().filter_map(ast::MacroCall::cast) {
|
||||||
res.extend(collect_impl_items_in_macro(db, &mut expander, m, id, limit))
|
res.extend(collect_impl_items_in_macro(db, expander, m, id, limit))
|
||||||
}
|
}
|
||||||
|
|
||||||
res
|
res
|
||||||
|
|
Loading…
Reference in a new issue