mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Merge #10974
10974: minor: Simplify r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
9eb5a96387
5 changed files with 56 additions and 46 deletions
|
@ -8,7 +8,7 @@ use hir_expand::{
|
||||||
};
|
};
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use rustc_hash::FxHashSet;
|
use rustc_hash::FxHashSet;
|
||||||
use smallvec::SmallVec;
|
use smallvec::{smallvec, SmallVec};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
body::scope::{ExprScopes, ScopeId},
|
body::scope::{ExprScopes, ScopeId},
|
||||||
|
@ -567,6 +567,8 @@ pub fn resolver_for_scope(
|
||||||
let mut r = owner.resolver(db);
|
let mut r = owner.resolver(db);
|
||||||
let scopes = db.expr_scopes(owner);
|
let scopes = db.expr_scopes(owner);
|
||||||
let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
|
let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
|
||||||
|
r.scopes.reserve(scope_chain.len());
|
||||||
|
|
||||||
for scope in scope_chain.into_iter().rev() {
|
for scope in scope_chain.into_iter().rev() {
|
||||||
if let Some(block) = scopes.block(scope) {
|
if let Some(block) = scopes.block(scope) {
|
||||||
if let Some(def_map) = db.block_def_map(block) {
|
if let Some(def_map) = db.block_def_map(block) {
|
||||||
|
@ -739,12 +741,13 @@ pub trait HasResolver: Copy {
|
||||||
impl HasResolver for ModuleId {
|
impl HasResolver for ModuleId {
|
||||||
fn resolver(self, db: &dyn DefDatabase) -> Resolver {
|
fn resolver(self, db: &dyn DefDatabase) -> Resolver {
|
||||||
let mut def_map = self.def_map(db);
|
let mut def_map = self.def_map(db);
|
||||||
let mut modules = vec![(def_map.clone(), self.local_id)];
|
let mut modules: SmallVec<[_; 2]> = smallvec![(def_map.clone(), self.local_id)];
|
||||||
while let Some(parent) = def_map.parent() {
|
while let Some(parent) = def_map.parent() {
|
||||||
def_map = parent.def_map(db);
|
def_map = parent.def_map(db);
|
||||||
modules.push((def_map.clone(), parent.local_id));
|
modules.push((def_map.clone(), parent.local_id));
|
||||||
}
|
}
|
||||||
let mut resolver = Resolver::default();
|
let mut resolver = Resolver::default();
|
||||||
|
resolver.scopes.reserve(modules.len());
|
||||||
for (def_map, module) in modules.into_iter().rev() {
|
for (def_map, module) in modules.into_iter().rev() {
|
||||||
resolver = resolver.push_module_scope(def_map, module);
|
resolver = resolver.push_module_scope(def_map, module);
|
||||||
}
|
}
|
||||||
|
|
|
@ -334,6 +334,13 @@ pub mod known {
|
||||||
gt,
|
gt,
|
||||||
le,
|
le,
|
||||||
lt,
|
lt,
|
||||||
|
// lang items
|
||||||
|
not,
|
||||||
|
neg,
|
||||||
|
future_trait,
|
||||||
|
owned_box,
|
||||||
|
index,
|
||||||
|
partial_ord
|
||||||
);
|
);
|
||||||
|
|
||||||
// self/Self cannot be used as an identifier
|
// self/Self cannot be used as an identifier
|
||||||
|
|
|
@ -28,11 +28,10 @@ use hir_def::{
|
||||||
AdtId, AssocItemId, DefWithBodyId, EnumVariantId, FieldId, FunctionId, HasModule, Lookup,
|
AdtId, AssocItemId, DefWithBodyId, EnumVariantId, FieldId, FunctionId, HasModule, Lookup,
|
||||||
TraitId, TypeAliasId, VariantId,
|
TraitId, TypeAliasId, VariantId,
|
||||||
};
|
};
|
||||||
use hir_expand::name::name;
|
use hir_expand::name::{name, Name};
|
||||||
use la_arena::ArenaMap;
|
use la_arena::ArenaMap;
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
use stdx::impl_from;
|
use stdx::impl_from;
|
||||||
use syntax::SmolStr;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase, fold_tys, infer::coerce::CoerceMany, lower::ImplTraitLoweringMode,
|
db::HirDatabase, fold_tys, infer::coerce::CoerceMany, lower::ImplTraitLoweringMode,
|
||||||
|
@ -719,10 +718,9 @@ impl<'a> InferenceContext<'a> {
|
||||||
self.infer_expr_coerce(self.body.body_expr, &Expectation::has_type(self.return_ty.clone()));
|
self.infer_expr_coerce(self.body.body_expr, &Expectation::has_type(self.return_ty.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_lang_item(&self, name: &str) -> Option<LangItemTarget> {
|
fn resolve_lang_item(&self, name: Name) -> Option<LangItemTarget> {
|
||||||
let krate = self.resolver.krate()?;
|
let krate = self.resolver.krate()?;
|
||||||
let name = SmolStr::new_inline(name);
|
self.db.lang_item(krate, name.to_smol_str())
|
||||||
self.db.lang_item(krate, name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_into_iter_item(&self) -> Option<TypeAliasId> {
|
fn resolve_into_iter_item(&self) -> Option<TypeAliasId> {
|
||||||
|
@ -743,22 +741,22 @@ impl<'a> InferenceContext<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_ops_neg_output(&self) -> Option<TypeAliasId> {
|
fn resolve_ops_neg_output(&self) -> Option<TypeAliasId> {
|
||||||
let trait_ = self.resolve_lang_item("neg")?.as_trait()?;
|
let trait_ = self.resolve_lang_item(name![neg])?.as_trait()?;
|
||||||
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
|
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_ops_not_output(&self) -> Option<TypeAliasId> {
|
fn resolve_ops_not_output(&self) -> Option<TypeAliasId> {
|
||||||
let trait_ = self.resolve_lang_item("not")?.as_trait()?;
|
let trait_ = self.resolve_lang_item(name![not])?.as_trait()?;
|
||||||
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
|
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_future_future_output(&self) -> Option<TypeAliasId> {
|
fn resolve_future_future_output(&self) -> Option<TypeAliasId> {
|
||||||
let trait_ = self.resolve_lang_item("future_trait")?.as_trait()?;
|
let trait_ = self.resolve_lang_item(name![future_trait])?.as_trait()?;
|
||||||
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
|
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_boxed_box(&self) -> Option<AdtId> {
|
fn resolve_boxed_box(&self) -> Option<AdtId> {
|
||||||
let struct_ = self.resolve_lang_item("owned_box")?.as_struct()?;
|
let struct_ = self.resolve_lang_item(name![owned_box])?.as_struct()?;
|
||||||
Some(struct_.into())
|
Some(struct_.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -799,7 +797,7 @@ impl<'a> InferenceContext<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_ops_index(&self) -> Option<TraitId> {
|
fn resolve_ops_index(&self) -> Option<TraitId> {
|
||||||
self.resolve_lang_item("index")?.as_trait()
|
self.resolve_lang_item(name![index])?.as_trait()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_ops_index_output(&self) -> Option<TypeAliasId> {
|
fn resolve_ops_index_output(&self) -> Option<TypeAliasId> {
|
||||||
|
|
|
@ -1276,41 +1276,43 @@ impl<'a> InferenceContext<'a> {
|
||||||
let (name, lang_item) = match op {
|
let (name, lang_item) = match op {
|
||||||
BinaryOp::LogicOp(_) => return None,
|
BinaryOp::LogicOp(_) => return None,
|
||||||
BinaryOp::ArithOp(aop) => match aop {
|
BinaryOp::ArithOp(aop) => match aop {
|
||||||
ArithOp::Add => (name!(add), "add"),
|
ArithOp::Add => (name!(add), name!(add)),
|
||||||
ArithOp::Mul => (name!(mul), "mul"),
|
ArithOp::Mul => (name!(mul), name!(mul)),
|
||||||
ArithOp::Sub => (name!(sub), "sub"),
|
ArithOp::Sub => (name!(sub), name!(sub)),
|
||||||
ArithOp::Div => (name!(div), "div"),
|
ArithOp::Div => (name!(div), name!(div)),
|
||||||
ArithOp::Rem => (name!(rem), "rem"),
|
ArithOp::Rem => (name!(rem), name!(rem)),
|
||||||
ArithOp::Shl => (name!(shl), "shl"),
|
ArithOp::Shl => (name!(shl), name!(shl)),
|
||||||
ArithOp::Shr => (name!(shr), "shr"),
|
ArithOp::Shr => (name!(shr), name!(shr)),
|
||||||
ArithOp::BitXor => (name!(bitxor), "bitxor"),
|
ArithOp::BitXor => (name!(bitxor), name!(bitxor)),
|
||||||
ArithOp::BitOr => (name!(bitor), "bitor"),
|
ArithOp::BitOr => (name!(bitor), name!(bitor)),
|
||||||
ArithOp::BitAnd => (name!(bitand), "bitand"),
|
ArithOp::BitAnd => (name!(bitand), name!(bitand)),
|
||||||
},
|
},
|
||||||
BinaryOp::Assignment { op: Some(aop) } => match aop {
|
BinaryOp::Assignment { op: Some(aop) } => match aop {
|
||||||
ArithOp::Add => (name!(add_assign), "add_assign"),
|
ArithOp::Add => (name!(add_assign), name!(add_assign)),
|
||||||
ArithOp::Mul => (name!(mul_assign), "mul_assign"),
|
ArithOp::Mul => (name!(mul_assign), name!(mul_assign)),
|
||||||
ArithOp::Sub => (name!(sub_assign), "sub_assign"),
|
ArithOp::Sub => (name!(sub_assign), name!(sub_assign)),
|
||||||
ArithOp::Div => (name!(div_assign), "div_assign"),
|
ArithOp::Div => (name!(div_assign), name!(div_assign)),
|
||||||
ArithOp::Rem => (name!(rem_assign), "rem_assign"),
|
ArithOp::Rem => (name!(rem_assign), name!(rem_assign)),
|
||||||
ArithOp::Shl => (name!(shl_assign), "shl_assign"),
|
ArithOp::Shl => (name!(shl_assign), name!(shl_assign)),
|
||||||
ArithOp::Shr => (name!(shr_assign), "shr_assign"),
|
ArithOp::Shr => (name!(shr_assign), name!(shr_assign)),
|
||||||
ArithOp::BitXor => (name!(bitxor_assign), "bitxor_assign"),
|
ArithOp::BitXor => (name!(bitxor_assign), name!(bitxor_assign)),
|
||||||
ArithOp::BitOr => (name!(bitor_assign), "bitor_assign"),
|
ArithOp::BitOr => (name!(bitor_assign), name!(bitor_assign)),
|
||||||
ArithOp::BitAnd => (name!(bitand_assign), "bitand_assign"),
|
ArithOp::BitAnd => (name!(bitand_assign), name!(bitand_assign)),
|
||||||
},
|
},
|
||||||
BinaryOp::CmpOp(cop) => match cop {
|
BinaryOp::CmpOp(cop) => match cop {
|
||||||
CmpOp::Eq { negated: false } => (name!(eq), "eq"),
|
CmpOp::Eq { negated: false } => (name!(eq), name!(eq)),
|
||||||
CmpOp::Eq { negated: true } => (name!(ne), "eq"),
|
CmpOp::Eq { negated: true } => (name!(ne), name!(eq)),
|
||||||
CmpOp::Ord { ordering: Ordering::Less, strict: false } => {
|
CmpOp::Ord { ordering: Ordering::Less, strict: false } => {
|
||||||
(name!(le), "partial_ord")
|
(name!(le), name!(partial_ord))
|
||||||
|
}
|
||||||
|
CmpOp::Ord { ordering: Ordering::Less, strict: true } => {
|
||||||
|
(name!(lt), name!(partial_ord))
|
||||||
}
|
}
|
||||||
CmpOp::Ord { ordering: Ordering::Less, strict: true } => (name!(lt), "partial_ord"),
|
|
||||||
CmpOp::Ord { ordering: Ordering::Greater, strict: false } => {
|
CmpOp::Ord { ordering: Ordering::Greater, strict: false } => {
|
||||||
(name!(ge), "partial_ord")
|
(name!(ge), name!(partial_ord))
|
||||||
}
|
}
|
||||||
CmpOp::Ord { ordering: Ordering::Greater, strict: true } => {
|
CmpOp::Ord { ordering: Ordering::Greater, strict: true } => {
|
||||||
(name!(gt), "partial_ord")
|
(name!(gt), name!(partial_ord))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
BinaryOp::Assignment { op: None } => return None,
|
BinaryOp::Assignment { op: None } => return None,
|
||||||
|
|
|
@ -96,9 +96,9 @@ impl<'a> TyLoweringContext<'a> {
|
||||||
debruijn: DebruijnIndex,
|
debruijn: DebruijnIndex,
|
||||||
f: impl FnOnce(&TyLoweringContext) -> T,
|
f: impl FnOnce(&TyLoweringContext) -> T,
|
||||||
) -> T {
|
) -> T {
|
||||||
let opaque_ty_data_vec = self.opaque_type_data.replace(Vec::new());
|
let opaque_ty_data_vec = self.opaque_type_data.take();
|
||||||
let expander = self.expander.replace(None);
|
let expander = self.expander.take();
|
||||||
let unsized_types = self.unsized_types.replace(Default::default());
|
let unsized_types = self.unsized_types.take();
|
||||||
let new_ctx = Self {
|
let new_ctx = Self {
|
||||||
in_binders: debruijn,
|
in_binders: debruijn,
|
||||||
impl_trait_counter: Cell::new(self.impl_trait_counter.get()),
|
impl_trait_counter: Cell::new(self.impl_trait_counter.get()),
|
||||||
|
@ -615,7 +615,7 @@ impl<'a> TyLoweringContext<'a> {
|
||||||
// `Option::None::<T>` are both allowed (though the former is
|
// `Option::None::<T>` are both allowed (though the former is
|
||||||
// preferred). See also `def_ids_for_path_segments` in rustc.
|
// preferred). See also `def_ids_for_path_segments` in rustc.
|
||||||
let len = path.segments().len();
|
let len = path.segments().len();
|
||||||
let penultimate = if len >= 2 { path.segments().get(len - 2) } else { None };
|
let penultimate = len.checked_sub(2).and_then(|idx| path.segments().get(idx));
|
||||||
let segment = match penultimate {
|
let segment = match penultimate {
|
||||||
Some(segment) if segment.args_and_bindings.is_some() => segment,
|
Some(segment) if segment.args_and_bindings.is_some() => segment,
|
||||||
_ => last,
|
_ => last,
|
||||||
|
@ -841,8 +841,8 @@ impl<'a> TyLoweringContext<'a> {
|
||||||
};
|
};
|
||||||
last_segment
|
last_segment
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flat_map(|segment| segment.args_and_bindings.into_iter())
|
.filter_map(|segment| segment.args_and_bindings)
|
||||||
.flat_map(|args_and_bindings| args_and_bindings.bindings.iter())
|
.flat_map(|args_and_bindings| &args_and_bindings.bindings)
|
||||||
.flat_map(move |binding| {
|
.flat_map(move |binding| {
|
||||||
let found = associated_type_by_name_including_super_traits(
|
let found = associated_type_by_name_including_super_traits(
|
||||||
self.db,
|
self.db,
|
||||||
|
@ -850,14 +850,14 @@ impl<'a> TyLoweringContext<'a> {
|
||||||
&binding.name,
|
&binding.name,
|
||||||
);
|
);
|
||||||
let (super_trait_ref, associated_ty) = match found {
|
let (super_trait_ref, associated_ty) = match found {
|
||||||
None => return SmallVec::<[QuantifiedWhereClause; 1]>::new(),
|
None => return SmallVec::new(),
|
||||||
Some(t) => t,
|
Some(t) => t,
|
||||||
};
|
};
|
||||||
let projection_ty = ProjectionTy {
|
let projection_ty = ProjectionTy {
|
||||||
associated_ty_id: to_assoc_type_id(associated_ty),
|
associated_ty_id: to_assoc_type_id(associated_ty),
|
||||||
substitution: super_trait_ref.substitution,
|
substitution: super_trait_ref.substitution,
|
||||||
};
|
};
|
||||||
let mut preds = SmallVec::with_capacity(
|
let mut preds: SmallVec<[_; 1]> = SmallVec::with_capacity(
|
||||||
binding.type_ref.as_ref().map_or(0, |_| 1) + binding.bounds.len(),
|
binding.type_ref.as_ref().map_or(0, |_| 1) + binding.bounds.len(),
|
||||||
);
|
);
|
||||||
if let Some(type_ref) = &binding.type_ref {
|
if let Some(type_ref) = &binding.type_ref {
|
||||||
|
|
Loading…
Reference in a new issue