Skip to content

Commit a7edf5b

Browse files
committed
Simplify
1 parent f29fc03 commit a7edf5b

File tree

4 files changed

+88
-129
lines changed

4 files changed

+88
-129
lines changed

crates/hir-def/src/expr_store/expander.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@ use std::mem;
44

55
use base_db::Crate;
66
use drop_bomb::DropBomb;
7+
use hir_expand::attrs::RawAttrs;
78
use hir_expand::eager::EagerCallBackFn;
89
use hir_expand::{
910
ExpandError, ExpandErrorKind, ExpandResult, HirFileId, InFile, Lookup, MacroCallId,
1011
mod_path::ModPath, span_map::SpanMap,
1112
};
1213
use span::{AstIdMap, Edition, SyntaxContext};
14+
use syntax::ast::HasAttrs;
1315
use syntax::{Parse, ast};
1416
use triomphe::Arc;
17+
use tt::TextRange;
1518

19+
use crate::attr::Attrs;
20+
use crate::expr_store::HygieneId;
1621
use crate::nameres::DefMap;
1722
use crate::{AsMacroCall, MacroId, UnresolvedMacro, db::DefDatabase};
1823

@@ -48,8 +53,35 @@ impl Expander {
4853
}
4954
}
5055

51-
pub(super) fn span_map(&self) -> &SpanMap {
52-
&self.span_map
56+
pub(super) fn ctx_for_range(&self, range: TextRange) -> SyntaxContext {
57+
self.span_map.span_for_range(range).ctx
58+
}
59+
60+
pub(super) fn hygiene_for_range(&self, db: &dyn DefDatabase, range: TextRange) -> HygieneId {
61+
match self.span_map.as_ref() {
62+
hir_expand::span_map::SpanMapRef::ExpansionSpanMap(span_map) => {
63+
HygieneId::new(span_map.span_at(range.start()).ctx.opaque_and_semitransparent(db))
64+
}
65+
hir_expand::span_map::SpanMapRef::RealSpanMap(_) => HygieneId::ROOT,
66+
}
67+
}
68+
69+
pub(super) fn attrs(
70+
&self,
71+
db: &dyn DefDatabase,
72+
krate: Crate,
73+
has_attrs: &dyn HasAttrs,
74+
) -> Attrs {
75+
Attrs::filter(db, krate, RawAttrs::new(db.upcast(), has_attrs, self.span_map.as_ref()))
76+
}
77+
78+
pub(super) fn is_cfg_enabled(
79+
&self,
80+
db: &dyn DefDatabase,
81+
krate: Crate,
82+
has_attrs: &dyn HasAttrs,
83+
) -> bool {
84+
self.attrs(db, krate, has_attrs).is_cfg_enabled(krate.cfg_options(db))
5385
}
5486

5587
pub(super) fn call_syntax_ctx(&self) -> SyntaxContext {

crates/hir-def/src/expr_store/lower.rs

Lines changed: 48 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ use std::mem;
1010
use either::Either;
1111
use hir_expand::{
1212
InFile, Lookup, MacroDefId,
13-
attrs::RawAttrs,
1413
mod_path::tool_path,
1514
name::{AsName, Name},
16-
span_map::SpanMap,
1715
};
1816
use intern::{Symbol, sym};
1917
use rustc_hash::FxHashMap;
@@ -27,14 +25,13 @@ use syntax::{
2725
SlicePatComponents,
2826
},
2927
};
30-
use text_size::TextSize;
3128
use thin_vec::ThinVec;
3229
use triomphe::Arc;
30+
use tt::TextRange;
3331

3432
use crate::{
3533
AdtId, BlockId, BlockLoc, DefWithBodyId, FunctionId, GenericDefId, ImplId, ItemTreeLoc,
3634
MacroId, ModuleDefId, ModuleId, TraitAliasId, TraitId, TypeAliasId, UnresolvedMacro,
37-
attr::Attrs,
3835
builtin_type::BuiltinUint,
3936
db::DefDatabase,
4037
expr_store::{
@@ -83,6 +80,8 @@ pub(super) fn lower_body(
8380
// even though they should be the same. Also, when the body comes from multiple expansions, their
8481
// hygiene is different.
8582

83+
let krate = module.krate();
84+
8685
let mut self_param = None;
8786
let mut source_map_self_param = None;
8887
let mut params = vec![];
@@ -100,14 +99,10 @@ pub(super) fn lower_body(
10099
// and skip the body.
101100
if skip_body {
102101
if let Some(param_list) = parameters {
103-
if let Some(self_param_syn) = param_list.self_param().filter(|self_param| {
104-
Attrs::filter(
105-
db,
106-
module.krate(),
107-
RawAttrs::new(db.upcast(), self_param, collector.expander.span_map().as_ref()),
108-
)
109-
.is_cfg_enabled(module.krate().cfg_options(db))
110-
}) {
102+
if let Some(self_param_syn) = param_list
103+
.self_param()
104+
.filter(|self_param| collector.expander.is_cfg_enabled(db, krate, self_param))
105+
{
111106
let is_mutable =
112107
self_param_syn.mut_token().is_some() && self_param_syn.amp_token().is_none();
113108
let binding_id: la_arena::Idx<Binding> = collector.alloc_binding(
@@ -120,14 +115,7 @@ pub(super) fn lower_body(
120115
}
121116
let count = param_list
122117
.params()
123-
.filter(|it| {
124-
Attrs::filter(
125-
db,
126-
module.krate(),
127-
RawAttrs::new(db.upcast(), it, collector.expander.span_map().as_ref()),
128-
)
129-
.is_cfg_enabled(module.krate().cfg_options(db))
130-
})
118+
.filter(|it| collector.expander.is_cfg_enabled(db, krate, it))
131119
.count();
132120
params = (0..count).map(|_| collector.missing_pat()).collect();
133121
};
@@ -144,14 +132,9 @@ pub(super) fn lower_body(
144132
}
145133

146134
if let Some(param_list) = parameters {
147-
if let Some(self_param_syn) = param_list.self_param().filter(|it| {
148-
Attrs::filter(
149-
db,
150-
module.krate(),
151-
RawAttrs::new(db.upcast(), it, collector.expander.span_map().as_ref()),
152-
)
153-
.is_cfg_enabled(module.krate().cfg_options(db))
154-
}) {
135+
if let Some(self_param_syn) =
136+
param_list.self_param().filter(|it| collector.expander.is_cfg_enabled(db, krate, it))
137+
{
155138
let is_mutable =
156139
self_param_syn.mut_token().is_some() && self_param_syn.amp_token().is_none();
157140
let binding_id: la_arena::Idx<Binding> = collector.alloc_binding(
@@ -160,7 +143,7 @@ pub(super) fn lower_body(
160143
);
161144
let hygiene = self_param_syn
162145
.name()
163-
.map(|name| collector.hygiene_id_for(name.syntax().text_range().start()))
146+
.map(|name| collector.hygiene_id_for(name.syntax().text_range()))
164147
.unwrap_or(HygieneId::ROOT);
165148
if !hygiene.is_root() {
166149
collector.store.binding_hygiene.insert(binding_id, hygiene);
@@ -170,13 +153,7 @@ pub(super) fn lower_body(
170153
}
171154

172155
for param in param_list.params() {
173-
if Attrs::filter(
174-
db,
175-
module.krate(),
176-
RawAttrs::new(db.upcast(), &param, collector.expander.span_map().as_ref()),
177-
)
178-
.is_cfg_enabled(module.krate().cfg_options(db))
179-
{
156+
if collector.expander.is_cfg_enabled(db, krate, &param) {
180157
let param_pat = collector.collect_pat_top(param.pat());
181158
params.push(param_pat);
182159
}
@@ -336,66 +313,45 @@ pub(crate) fn lower_function(
336313
let mut params = vec![];
337314
let mut has_self_param = false;
338315
let mut has_variadic = false;
339-
collector.collect_impl_trait(|expr_collector, mut impl_trait_lower_fn| {
316+
collector.collect_impl_trait(|collector, mut impl_trait_lower_fn| {
340317
if let Some(param_list) = fn_.value.param_list() {
341318
if let Some(param) = param_list.self_param() {
342-
let enabled = Attrs::filter(
343-
expr_collector.db,
344-
expr_collector.module.krate(),
345-
RawAttrs::new(
346-
expr_collector.db.upcast(),
347-
&param,
348-
expr_collector.expander.span_map().as_ref(),
349-
),
350-
)
351-
.is_cfg_enabled(expr_collector.module.krate().cfg_options(expr_collector.db));
319+
let enabled = collector.expander.is_cfg_enabled(db, module.krate(), &param);
352320
if enabled {
353321
has_self_param = true;
354322
params.push(match param.ty() {
355-
Some(ty) => expr_collector.lower_type_ref(ty, &mut impl_trait_lower_fn),
323+
Some(ty) => collector.lower_type_ref(ty, &mut impl_trait_lower_fn),
356324
None => {
357-
let self_type = expr_collector.alloc_type_ref_desugared(TypeRef::Path(
325+
let self_type = collector.alloc_type_ref_desugared(TypeRef::Path(
358326
Name::new_symbol_root(sym::Self_.clone()).into(),
359327
));
360328
let lifetime = param
361329
.lifetime()
362-
.map(|lifetime| expr_collector.lower_lifetime_ref(lifetime));
330+
.map(|lifetime| collector.lower_lifetime_ref(lifetime));
363331
match param.kind() {
364332
ast::SelfParamKind::Owned => self_type,
365-
ast::SelfParamKind::Ref => expr_collector.alloc_type_ref_desugared(
333+
ast::SelfParamKind::Ref => collector.alloc_type_ref_desugared(
366334
TypeRef::Reference(Box::new(RefType {
367335
ty: self_type,
368336
lifetime,
369337
mutability: Mutability::Shared,
370338
})),
371339
),
372-
ast::SelfParamKind::MutRef => expr_collector
373-
.alloc_type_ref_desugared(TypeRef::Reference(Box::new(
374-
RefType {
375-
ty: self_type,
376-
lifetime,
377-
mutability: Mutability::Mut,
378-
},
379-
))),
340+
ast::SelfParamKind::MutRef => collector.alloc_type_ref_desugared(
341+
TypeRef::Reference(Box::new(RefType {
342+
ty: self_type,
343+
lifetime,
344+
mutability: Mutability::Mut,
345+
})),
346+
),
380347
}
381348
}
382349
});
383350
}
384351
}
385352
let p = param_list
386353
.params()
387-
.filter(|param| {
388-
Attrs::filter(
389-
expr_collector.db,
390-
expr_collector.module.krate(),
391-
RawAttrs::new(
392-
expr_collector.db.upcast(),
393-
param,
394-
expr_collector.expander.span_map().as_ref(),
395-
),
396-
)
397-
.is_cfg_enabled(expr_collector.module.krate().cfg_options(expr_collector.db))
398-
})
354+
.filter(|param| collector.expander.is_cfg_enabled(db, module.krate(), param))
399355
.filter(|param| {
400356
let is_variadic = param.dotdotdot_token().is_some();
401357
has_variadic |= is_variadic;
@@ -405,7 +361,7 @@ pub(crate) fn lower_function(
405361
// FIXME
406362
.collect::<Vec<_>>();
407363
for p in p {
408-
params.push(expr_collector.lower_type_ref_opt(p, &mut impl_trait_lower_fn));
364+
params.push(collector.lower_type_ref_opt(p, &mut impl_trait_lower_fn));
409365
}
410366
}
411367
});
@@ -1026,7 +982,7 @@ impl ExprCollector<'_> {
1026982
})
1027983
}
1028984
Some(ast::BlockModifier::Label(label)) => {
1029-
let label_hygiene = self.hygiene_id_for(label.syntax().text_range().start());
985+
let label_hygiene = self.hygiene_id_for(label.syntax().text_range());
1030986
let label_id = self.collect_label(label);
1031987
self.with_labeled_rib(label_id, label_hygiene, |this| {
1032988
this.collect_block_(e, |id, statements, tail| Expr::Block {
@@ -1072,10 +1028,7 @@ impl ExprCollector<'_> {
10721028
},
10731029
ast::Expr::LoopExpr(e) => {
10741030
let label = e.label().map(|label| {
1075-
(
1076-
self.hygiene_id_for(label.syntax().text_range().start()),
1077-
self.collect_label(label),
1078-
)
1031+
(self.hygiene_id_for(label.syntax().text_range()), self.collect_label(label))
10791032
});
10801033
let body = self.collect_labelled_block_opt(label, e.loop_body());
10811034
self.alloc_expr(Expr::Loop { body, label: label.map(|it| it.1) }, syntax_ptr)
@@ -1423,7 +1376,7 @@ impl ExprCollector<'_> {
14231376
// Need to enable `mod_path.len() < 1` for `self`.
14241377
let may_be_variable = matches!(&path, Path::BarePath(mod_path) if mod_path.len() <= 1);
14251378
let hygiene = if may_be_variable {
1426-
self.hygiene_id_for(e.syntax().text_range().start())
1379+
self.hygiene_id_for(e.syntax().text_range())
14271380
} else {
14281381
HygieneId::ROOT
14291382
};
@@ -1697,7 +1650,7 @@ impl ExprCollector<'_> {
16971650
/// to preserve drop semantics. We should probably do the same in future.
16981651
fn collect_while_loop(&mut self, syntax_ptr: AstPtr<ast::Expr>, e: ast::WhileExpr) -> ExprId {
16991652
let label = e.label().map(|label| {
1700-
(self.hygiene_id_for(label.syntax().text_range().start()), self.collect_label(label))
1653+
(self.hygiene_id_for(label.syntax().text_range()), self.collect_label(label))
17011654
});
17021655
let body = self.collect_labelled_block_opt(label, e.loop_body());
17031656

@@ -1765,7 +1718,7 @@ impl ExprCollector<'_> {
17651718
ellipsis: None,
17661719
};
17671720
let label = e.label().map(|label| {
1768-
(self.hygiene_id_for(label.syntax().text_range().start()), self.collect_label(label))
1721+
(self.hygiene_id_for(label.syntax().text_range()), self.collect_label(label))
17691722
});
17701723
let some_arm = MatchArm {
17711724
pat: self.alloc_pat_desugared(some_pat),
@@ -2191,7 +2144,7 @@ impl ExprCollector<'_> {
21912144
let name = bp.name().map(|nr| nr.as_name()).unwrap_or_else(Name::missing);
21922145
let hygiene = bp
21932146
.name()
2194-
.map(|name| self.hygiene_id_for(name.syntax().text_range().start()))
2147+
.map(|name| self.hygiene_id_for(name.syntax().text_range()))
21952148
.unwrap_or(HygieneId::ROOT);
21962149

21972150
let annotation =
@@ -2498,11 +2451,7 @@ impl ExprCollector<'_> {
24982451
/// Returns `None` (and emits diagnostics) when `owner` if `#[cfg]`d out, and `Some(())` when
24992452
/// not.
25002453
fn check_cfg(&mut self, owner: &dyn ast::HasAttrs) -> Option<()> {
2501-
let attrs = Attrs::filter(
2502-
self.db,
2503-
self.module.krate(),
2504-
RawAttrs::new(self.db.upcast(), owner, self.expander.span_map().as_ref()),
2505-
);
2454+
let attrs = self.expander.attrs(self.db, self.module.krate(), owner);
25062455
match attrs.cfg() {
25072456
Some(cfg) => {
25082457
let cfg_options = self.module.krate().cfg_options(self.db);
@@ -2541,14 +2490,16 @@ impl ExprCollector<'_> {
25412490
lifetime: Option<ast::Lifetime>,
25422491
) -> Result<Option<LabelId>, ExpressionStoreDiagnostics> {
25432492
let Some(lifetime) = lifetime else { return Ok(None) };
2544-
let span_map = self.expander.span_map();
2545-
let span = span_map.span_for_range(lifetime.syntax().text_range());
2546-
let ctx = span.ctx;
2547-
let mut hygiene_id = HygieneId::new(ctx.opaque_and_semitransparent(self.db));
2548-
let mut hygiene_info = ctx.outer_expn(self.db).map(|expansion| {
2549-
let expansion = self.db.lookup_intern_macro_call(expansion);
2550-
(ctx.parent(self.db), expansion.def)
2551-
});
2493+
let mut hygiene_id =
2494+
self.expander.hygiene_for_range(self.db, lifetime.syntax().text_range());
2495+
let mut hygiene_info = if hygiene_id.is_root() {
2496+
None
2497+
} else {
2498+
hygiene_id.lookup().outer_expn(self.db).map(|expansion| {
2499+
let expansion = self.db.lookup_intern_macro_call(expansion);
2500+
(hygiene_id.lookup().parent(self.db), expansion.def)
2501+
})
2502+
};
25522503
let name = Name::new_lifetime(&lifetime);
25532504

25542505
for (rib_idx, rib) in self.label_ribs.iter().enumerate().rev() {
@@ -2686,7 +2637,7 @@ impl ExprCollector<'_> {
26862637
}) {
26872638
Some(((s, is_direct_literal), template)) => {
26882639
let call_ctx = self.expander.call_syntax_ctx();
2689-
let hygiene = self.hygiene_id_for(s.syntax().text_range().start());
2640+
let hygiene = self.hygiene_id_for(s.syntax().text_range());
26902641
let fmt = format_args::parse(
26912642
&s,
26922643
fmt_snippet,
@@ -3196,15 +3147,8 @@ impl ExprCollector<'_> {
31963147
res
31973148
}
31983149

3199-
/// If this returns `HygieneId::ROOT`, do not allocate to save space.
3200-
fn hygiene_id_for(&self, span_start: TextSize) -> HygieneId {
3201-
match self.expander.span_map() {
3202-
SpanMap::RealSpanMap(_) => HygieneId::ROOT,
3203-
SpanMap::ExpansionSpanMap(span_map) => {
3204-
let ctx = span_map.span_at(span_start).ctx;
3205-
HygieneId::new(ctx.opaque_and_semitransparent(self.db))
3206-
}
3207-
}
3150+
fn hygiene_id_for(&self, range: TextRange) -> HygieneId {
3151+
self.expander.hygiene_for_range(self.db, range)
32083152
}
32093153
}
32103154

0 commit comments

Comments
 (0)