Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r--crates/hir/src/semantics.rs34
1 files changed, 24 insertions, 10 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index a1bbe47188..f633bb063f 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -1088,7 +1088,12 @@ impl<'db> SemanticsImpl<'db> {
/// That is, we strictly check if it lies inside the input of a macro call.
pub fn is_inside_macro_call(&self, token @ InFile { value, .. }: InFile<&SyntaxToken>) -> bool {
value.parent_ancestors().any(|ancestor| {
- if ast::MacroCall::can_cast(ancestor.kind()) {
+ if let Some(macro_call) = ast::MacroCall::cast(ancestor.clone())
+ // If this is the *path* of a macro, it's not inside the call.
+ && macro_call.path().is_none_or(|path| {
+ !path.syntax().text_range().contains_range(value.text_range())
+ })
+ {
return true;
}
@@ -1323,7 +1328,7 @@ impl<'db> SemanticsImpl<'db> {
.map(|(call_id, item)| {
let item_range = item.syntax().text_range();
let loc = call_id.loc(db);
- let text_range = match loc.kind {
+ let text_range = match &loc.kind {
hir_expand::MacroCallKind::Attr {
censored_attr_ids: attr_ids,
..
@@ -1740,11 +1745,7 @@ impl<'db> SemanticsImpl<'db> {
analyzer.expr_adjustments(expr).map(|it| {
it.iter()
.map(|adjust| {
- let target = Type::new_with_resolver(
- self.db,
- &analyzer.resolver,
- adjust.target.as_ref(),
- );
+ let target = analyzer.ty(adjust.target.as_ref());
let kind = match adjust.kind {
hir_ty::Adjust::NeverToAny => Adjust::NeverToAny,
hir_ty::Adjust::Deref(Some(hir_ty::OverloadedDeref(m))) => {
@@ -1771,6 +1772,10 @@ impl<'db> SemanticsImpl<'db> {
})
}
+ pub fn expr_is_diverging(&self, expr: &ast::Expr) -> bool {
+ (|| self.analyze(expr.syntax())?.expr_is_diverging(self.db, expr))().unwrap_or(false)
+ }
+
pub fn type_of_expr(&self, expr: &ast::Expr) -> Option<TypeInfo<'db>> {
self.analyze(expr.syntax())?
.type_of_expr(self.db, expr)
@@ -1835,10 +1840,10 @@ impl<'db> SemanticsImpl<'db> {
let substs =
hir_ty::next_solver::GenericArgs::for_item(interner, trait_.id.into(), |_, id, _| {
assert!(matches!(id, hir_def::GenericParamId::TypeParamId(_)), "expected a type");
- subst.next().expect("too few subst").ty.into()
+ subst.next().expect("too few subst").ty.skip_binder().into()
});
assert!(subst.next().is_none(), "too many subst");
- Some(match self.db.lookup_impl_method(env.env, func, substs).0 {
+ Some(match self.db.lookup_impl_method(env.param_env(self.db), func, substs).0 {
Either::Left(it) => it.into(),
Either::Right((impl_, method)) => {
Function { id: AnyFunctionId::BuiltinDeriveImplMethod { method, impl_ } }
@@ -1946,6 +1951,15 @@ impl<'db> SemanticsImpl<'db> {
self.analyze(field.syntax())?.resolve_record_pat_field(self.db, field)
}
+ // FIXME: Remove this from https://github.com/rust-lang/rust-analyzer/pull/22449#discussion_r3299763452
+ pub fn resolve_tuple_struct_pat_fields(
+ &self,
+ tuple_struct_pat: &ast::TupleStructPat,
+ ) -> Option<Vec<(Field, Type<'db>)>> {
+ self.analyze(tuple_struct_pat.syntax())?
+ .resolve_tuple_struct_pat_fields(self.db, tuple_struct_pat)
+ }
+
// FIXME: Replace this with `resolve_macro_call2`
pub fn resolve_macro_call(&self, macro_call: &ast::MacroCall) -> Option<Macro> {
let macro_call = self.find_file(macro_call.syntax()).with_value(macro_call);
@@ -2436,7 +2450,7 @@ impl<'db> SemanticsImpl<'db> {
AnyImplId::ImplId(id) => id,
AnyImplId::BuiltinDeriveImplId(id) => return Some(id.loc(self.db).adt.into()),
};
- let source = hir_def::src::HasSource::ast_ptr(&id.loc(self.db), self.db);
+ let source = hir_def::src::HasSource::ast_ptr(id.loc(self.db), self.db);
let mut file_id = source.file_id;
let adt_ast_id = loop {
let macro_call = file_id.macro_file()?;