Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/lib.rs')
-rw-r--r--crates/hir/src/lib.rs339
1 files changed, 46 insertions, 293 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index c50be5f114..1e21045e98 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -24,12 +24,12 @@
mod semantics;
mod source_analyzer;
-mod from_id;
mod attrs;
+mod from_id;
mod has_source;
-pub mod diagnostics;
pub mod db;
+pub mod diagnostics;
pub mod symbols;
mod display;
@@ -61,7 +61,7 @@ use hir_def::{
use hir_expand::{attrs::collect_attrs, name::name, proc_macro::ProcMacroKind, MacroCallKind};
use hir_ty::{
all_super_traits, autoderef, check_orphan_rules,
- consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
+ consteval::{try_const_usize, unknown_const_as_generic, ConstExt},
diagnostics::BodyValidationDiagnostic,
known_const_to_ast,
layout::{Layout as TyLayout, RustcEnumVariantIdx, RustcFieldIdx, TagEncoding},
@@ -76,7 +76,6 @@ use hir_ty::{
};
use itertools::Itertools;
use nameres::diagnostics::DefDiagnosticKind;
-use once_cell::unsync::Lazy;
use rustc_hash::FxHashSet;
use stdx::{impl_from, never};
use syntax::{
@@ -132,8 +131,10 @@ pub use {
MacroFileIdExt,
},
hir_ty::{
+ consteval::ConstEvalError,
display::{ClosureStyle, HirDisplay, HirDisplayError, HirWrite},
layout::LayoutError,
+ mir::{MirEvalError, MirLowerError},
PointerCast, Safety,
},
// FIXME: Properly encapsulate mir
@@ -234,8 +235,8 @@ impl Crate {
db: &dyn DefDatabase,
query: import_map::Query,
) -> impl Iterator<Item = Either<ModuleDef, Macro>> {
- let _p = profile::span("query_external_importables");
- import_map::search_dependencies(db, self.into(), query).into_iter().map(|item| {
+ let _p = tracing::span!(tracing::Level::INFO, "query_external_importables");
+ import_map::search_dependencies(db, self.into(), &query).into_iter().map(|item| {
match ItemInNs::from(item) {
ItemInNs::Types(mod_id) | ItemInNs::Values(mod_id) => Either::Left(mod_id),
ItemInNs::Macros(mac_id) => Either::Right(mac_id),
@@ -538,13 +539,8 @@ impl Module {
/// Fills `acc` with the module's diagnostics.
pub fn diagnostics(self, db: &dyn HirDatabase, acc: &mut Vec<AnyDiagnostic>) {
- let _p = profile::span("Module::diagnostics").detail(|| {
- format!(
- "{:?}",
- self.name(db)
- .map_or("<unknown>".into(), |name| name.display(db.upcast()).to_string())
- )
- });
+ let name = self.name(db);
+ let _p = tracing::span!(tracing::Level::INFO, "Module::diagnostics", ?name);
let def_map = self.id.def_map(db.upcast());
for diag in def_map.diagnostics() {
if diag.in_module != self.id.local_id {
@@ -907,7 +903,7 @@ fn emit_def_diagnostic_(
}
DefDiagnosticKind::InvalidDeriveTarget { ast, id } => {
let node = ast.to_node(db.upcast());
- let derive = node.attrs().nth(*id as usize);
+ let derive = node.attrs().nth(*id);
match derive {
Some(derive) => {
acc.push(
@@ -922,7 +918,7 @@ fn emit_def_diagnostic_(
}
DefDiagnosticKind::MalformedDerive { ast, id } => {
let node = ast.to_node(db.upcast());
- let derive = node.attrs().nth(*id as usize);
+ let derive = node.attrs().nth(*id);
match derive {
Some(derive) => {
acc.push(
@@ -1592,181 +1588,43 @@ impl DefWithBody {
}
for diag in source_map.diagnostics() {
- match diag {
- BodyDiagnostic::InactiveCode { node, cfg, opts } => acc.push(
- InactiveCode { node: *node, cfg: cfg.clone(), opts: opts.clone() }.into(),
- ),
- BodyDiagnostic::MacroError { node, message } => acc.push(
- MacroError {
- node: (*node).map(|it| it.into()),
- precise_location: None,
- message: message.to_string(),
- }
- .into(),
- ),
- BodyDiagnostic::UnresolvedProcMacro { node, krate } => acc.push(
- UnresolvedProcMacro {
- node: (*node).map(|it| it.into()),
- precise_location: None,
- macro_name: None,
- kind: MacroKind::ProcMacro,
- krate: *krate,
- }
- .into(),
- ),
- BodyDiagnostic::UnresolvedMacroCall { node, path } => acc.push(
- UnresolvedMacroCall {
- macro_call: (*node).map(|ast_ptr| ast_ptr.into()),
- precise_location: None,
- path: path.clone(),
- is_bang: true,
- }
- .into(),
- ),
+ acc.push(match diag {
+ BodyDiagnostic::InactiveCode { node, cfg, opts } => {
+ InactiveCode { node: *node, cfg: cfg.clone(), opts: opts.clone() }.into()
+ }
+ BodyDiagnostic::MacroError { node, message } => MacroError {
+ node: (*node).map(|it| it.into()),
+ precise_location: None,
+ message: message.to_string(),
+ }
+ .into(),
+ BodyDiagnostic::UnresolvedProcMacro { node, krate } => UnresolvedProcMacro {
+ node: (*node).map(|it| it.into()),
+ precise_location: None,
+ macro_name: None,
+ kind: MacroKind::ProcMacro,
+ krate: *krate,
+ }
+ .into(),
+ BodyDiagnostic::UnresolvedMacroCall { node, path } => UnresolvedMacroCall {
+ macro_call: (*node).map(|ast_ptr| ast_ptr.into()),
+ precise_location: None,
+ path: path.clone(),
+ is_bang: true,
+ }
+ .into(),
BodyDiagnostic::UnreachableLabel { node, name } => {
- acc.push(UnreachableLabel { node: *node, name: name.clone() }.into())
+ UnreachableLabel { node: *node, name: name.clone() }.into()
}
BodyDiagnostic::UndeclaredLabel { node, name } => {
- acc.push(UndeclaredLabel { node: *node, name: name.clone() }.into())
+ UndeclaredLabel { node: *node, name: name.clone() }.into()
}
- }
+ });
}
let infer = db.infer(self.into());
- let source_map = Lazy::new(|| db.body_with_source_map(self.into()).1);
- let expr_syntax = |expr| source_map.expr_syntax(expr).expect("unexpected synthetic");
- let pat_syntax = |pat| source_map.pat_syntax(pat).expect("unexpected synthetic");
for d in &infer.diagnostics {
- match d {
- &hir_ty::InferenceDiagnostic::NoSuchField { field: expr, private } => {
- let expr_or_pat = match expr {
- ExprOrPatId::ExprId(expr) => {
- source_map.field_syntax(expr).map(AstPtr::wrap_left)
- }
- ExprOrPatId::PatId(pat) => {
- source_map.pat_field_syntax(pat).map(AstPtr::wrap_right)
- }
- };
- acc.push(NoSuchField { field: expr_or_pat, private }.into())
- }
- &hir_ty::InferenceDiagnostic::MismatchedArgCount { call_expr, expected, found } => {
- acc.push(
- MismatchedArgCount { call_expr: expr_syntax(call_expr), expected, found }
- .into(),
- )
- }
- &hir_ty::InferenceDiagnostic::PrivateField { expr, field } => {
- let expr = expr_syntax(expr);
- let field = field.into();
- acc.push(PrivateField { expr, field }.into())
- }
- &hir_ty::InferenceDiagnostic::PrivateAssocItem { id, item } => {
- let expr_or_pat = match id {
- ExprOrPatId::ExprId(expr) => expr_syntax(expr).map(AstPtr::wrap_left),
- ExprOrPatId::PatId(pat) => pat_syntax(pat).map(AstPtr::wrap_right),
- };
- let item = item.into();
- acc.push(PrivateAssocItem { expr_or_pat, item }.into())
- }
- hir_ty::InferenceDiagnostic::ExpectedFunction { call_expr, found } => {
- let call_expr = expr_syntax(*call_expr);
-
- acc.push(
- ExpectedFunction {
- call: call_expr,
- found: Type::new(db, DefWithBodyId::from(self), found.clone()),
- }
- .into(),
- )
- }
- hir_ty::InferenceDiagnostic::UnresolvedField {
- expr,
- receiver,
- name,
- method_with_same_name_exists,
- } => {
- let expr = expr_syntax(*expr);
-
- acc.push(
- UnresolvedField {
- expr,
- name: name.clone(),
- receiver: Type::new(db, DefWithBodyId::from(self), receiver.clone()),
- method_with_same_name_exists: *method_with_same_name_exists,
- }
- .into(),
- )
- }
- hir_ty::InferenceDiagnostic::UnresolvedMethodCall {
- expr,
- receiver,
- name,
- field_with_same_name,
- assoc_func_with_same_name,
- } => {
- let expr = expr_syntax(*expr);
-
- acc.push(
- UnresolvedMethodCall {
- expr,
- name: name.clone(),
- receiver: Type::new(db, DefWithBodyId::from(self), receiver.clone()),
- field_with_same_name: field_with_same_name
- .clone()
- .map(|ty| Type::new(db, DefWithBodyId::from(self), ty)),
- assoc_func_with_same_name: *assoc_func_with_same_name,
- }
- .into(),
- )
- }
- &hir_ty::InferenceDiagnostic::UnresolvedAssocItem { id } => {
- let expr_or_pat = match id {
- ExprOrPatId::ExprId(expr) => expr_syntax(expr).map(AstPtr::wrap_left),
- ExprOrPatId::PatId(pat) => pat_syntax(pat).map(AstPtr::wrap_right),
- };
- acc.push(UnresolvedAssocItem { expr_or_pat }.into())
- }
- &hir_ty::InferenceDiagnostic::BreakOutsideOfLoop {
- expr,
- is_break,
- bad_value_break,
- } => {
- let expr = expr_syntax(expr);
- acc.push(BreakOutsideOfLoop { expr, is_break, bad_value_break }.into())
- }
- hir_ty::InferenceDiagnostic::TypedHole { expr, expected } => {
- let expr = expr_syntax(*expr);
- acc.push(
- TypedHole {
- expr,
- expected: Type::new(db, DefWithBodyId::from(self), expected.clone()),
- }
- .into(),
- )
- }
- &hir_ty::InferenceDiagnostic::MismatchedTupleStructPatArgCount {
- pat,
- expected,
- found,
- } => {
- let expr_or_pat = match pat {
- ExprOrPatId::ExprId(expr) => expr_syntax(expr).map(AstPtr::wrap_left),
- ExprOrPatId::PatId(pat) => {
- let InFile { file_id, value } =
- source_map.pat_syntax(pat).expect("unexpected synthetic");
-
- // cast from Either<Pat, SelfParam> -> Either<_, Pat>
- let Some(ptr) = AstPtr::try_from_raw(value.syntax_node_ptr()) else {
- continue;
- };
- InFile { file_id, value: ptr }
- }
- };
- acc.push(
- MismatchedTupleStructPatArgCount { expr_or_pat, expected, found }.into(),
- )
- }
- }
+ acc.extend(AnyDiagnostic::inference_diagnostic(db, self.into(), d, &source_map));
}
for (pat_or_expr, mismatch) in infer.type_mismatches() {
let expr_or_pat = match pat_or_expr {
@@ -1805,8 +1663,6 @@ impl DefWithBody {
}
}
- let hir_body = db.body(self.into());
-
if let Ok(borrowck_results) = db.borrowck(self.into()) {
for borrowck_result in borrowck_results.iter() {
let mir_body = &borrowck_result.mir_body;
@@ -1828,7 +1684,7 @@ impl DefWithBody {
)
}
let mol = &borrowck_result.mutability_of_locals;
- for (binding_id, binding_data) in hir_body.bindings.iter() {
+ for (binding_id, binding_data) in body.bindings.iter() {
if binding_data.problems.is_some() {
// We should report specific diagnostics for these problems, not `need-mut` and `unused-mut`.
continue;
@@ -1890,109 +1746,7 @@ impl DefWithBody {
}
for diagnostic in BodyValidationDiagnostic::collect(db, self.into()) {
- match diagnostic {
- BodyValidationDiagnostic::RecordMissingFields {
- record,
- variant,
- missed_fields,
- } => {
- let variant_data = variant.variant_data(db.upcast());
- let missed_fields = missed_fields
- .into_iter()
- .map(|idx| variant_data.fields()[idx].name.clone())
- .collect();
-
- match record {
- Either::Left(record_expr) => match source_map.expr_syntax(record_expr) {
- Ok(source_ptr) => {
- let root = source_ptr.file_syntax(db.upcast());
- if let ast::Expr::RecordExpr(record_expr) =
- source_ptr.value.to_node(&root)
- {
- if record_expr.record_expr_field_list().is_some() {
- let field_list_parent_path =
- record_expr.path().map(|path| AstPtr::new(&path));
- acc.push(
- MissingFields {
- file: source_ptr.file_id,
- field_list_parent: AstPtr::new(&Either::Left(
- record_expr,
- )),
- field_list_parent_path,
- missed_fields,
- }
- .into(),
- )
- }
- }
- }
- Err(SyntheticSyntax) => (),
- },
- Either::Right(record_pat) => match source_map.pat_syntax(record_pat) {
- Ok(source_ptr) => {
- if let Some(ptr) = source_ptr.value.cast::<ast::RecordPat>() {
- let root = source_ptr.file_syntax(db.upcast());
- let record_pat = ptr.to_node(&root);
- if record_pat.record_pat_field_list().is_some() {
- let field_list_parent_path =
- record_pat.path().map(|path| AstPtr::new(&path));
- acc.push(
- MissingFields {
- file: source_ptr.file_id,
- field_list_parent: AstPtr::new(&Either::Right(
- record_pat,
- )),
- field_list_parent_path,
- missed_fields,
- }
- .into(),
- )
- }
- }
- }
- Err(SyntheticSyntax) => (),
- },
- }
- }
- BodyValidationDiagnostic::ReplaceFilterMapNextWithFindMap { method_call_expr } => {
- if let Ok(next_source_ptr) = source_map.expr_syntax(method_call_expr) {
- acc.push(
- ReplaceFilterMapNextWithFindMap {
- file: next_source_ptr.file_id,
- next_expr: next_source_ptr.value,
- }
- .into(),
- );
- }
- }
- BodyValidationDiagnostic::MissingMatchArms { match_expr, uncovered_patterns } => {
- match source_map.expr_syntax(match_expr) {
- Ok(source_ptr) => {
- let root = source_ptr.file_syntax(db.upcast());
- if let ast::Expr::MatchExpr(match_expr) =
- &source_ptr.value.to_node(&root)
- {
- match match_expr.expr() {
- Some(scrut_expr) if match_expr.match_arm_list().is_some() => {
- acc.push(
- MissingMatchArms {
- scrutinee_expr: InFile::new(
- source_ptr.file_id,
- AstPtr::new(&scrut_expr),
- ),
- uncovered_patterns,
- }
- .into(),
- );
- }
- _ => {}
- }
- }
- }
- Err(SyntheticSyntax) => (),
- }
- }
- }
+ acc.extend(AnyDiagnostic::body_validation_diagnostic(db, diagnostic, &source_map));
}
let def: ModuleDef = match self {
@@ -2008,7 +1762,6 @@ impl DefWithBody {
}
}
}
-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Function {
pub(crate) id: FunctionId,
@@ -4299,7 +4052,7 @@ impl Type {
name: Option<&Name>,
mut callback: impl FnMut(Function) -> Option<T>,
) -> Option<T> {
- let _p = profile::span("iterate_method_candidates");
+ let _p = tracing::span!(tracing::Level::INFO, "iterate_method_candidates");
let mut slot = None;
self.iterate_method_candidates_dyn(
@@ -4378,7 +4131,7 @@ impl Type {
name: Option<&Name>,
mut callback: impl FnMut(AssocItem) -> Option<T>,
) -> Option<T> {
- let _p = profile::span("iterate_path_candidates");
+ let _p = tracing::span!(tracing::Level::INFO, "iterate_path_candidates");
let mut slot = None;
self.iterate_path_candidates_dyn(
db,
@@ -4444,7 +4197,7 @@ impl Type {
&'a self,
db: &'a dyn HirDatabase,
) -> impl Iterator<Item = Trait> + 'a {
- let _p = profile::span("applicable_inherent_traits");
+ let _p = tracing::span!(tracing::Level::INFO, "applicable_inherent_traits");
self.autoderef_(db)
.filter_map(|ty| ty.dyn_trait())
.flat_map(move |dyn_trait_id| hir_ty::all_super_traits(db.upcast(), dyn_trait_id))
@@ -4452,7 +4205,7 @@ impl Type {
}
pub fn env_traits<'a>(&'a self, db: &'a dyn HirDatabase) -> impl Iterator<Item = Trait> + 'a {
- let _p = profile::span("env_traits");
+ let _p = tracing::span!(tracing::Level::INFO, "env_traits");
self.autoderef_(db)
.filter(|ty| matches!(ty.kind(Interner), TyKind::Placeholder(_)))
.flat_map(|ty| {