Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/pretty.rs')
-rw-r--r--crates/hir-ty/src/mir/pretty.rs63
1 files changed, 41 insertions, 22 deletions
diff --git a/crates/hir-ty/src/mir/pretty.rs b/crates/hir-ty/src/mir/pretty.rs
index 2a26101ac4..7d7d4106cb 100644
--- a/crates/hir-ty/src/mir/pretty.rs
+++ b/crates/hir-ty/src/mir/pretty.rs
@@ -9,11 +9,10 @@ use either::Either;
use hir_def::{expr_store::Body, hir::BindingId};
use hir_expand::{name::Name, Lookup};
use la_arena::ArenaMap;
-use span::Edition;
use crate::{
db::HirDatabase,
- display::{ClosureStyle, HirDisplay},
+ display::{ClosureStyle, DisplayTarget, HirDisplay},
mir::{PlaceElem, ProjectionElem, StatementKind, TerminatorKind},
ClosureId,
};
@@ -39,17 +38,21 @@ macro_rules! wln {
}
impl MirBody {
- pub fn pretty_print(&self, db: &dyn HirDatabase) -> String {
+ pub fn pretty_print(&self, db: &dyn HirDatabase, display_target: DisplayTarget) -> String {
let hir_body = db.body(self.owner);
- let mut ctx = MirPrettyCtx::new(self, &hir_body, db);
+ let mut ctx = MirPrettyCtx::new(self, &hir_body, db, display_target);
ctx.for_body(|this| match ctx.body.owner {
hir_def::DefWithBodyId::FunctionId(id) => {
let data = db.function_data(id);
- w!(this, "fn {}() ", data.name.display(db.upcast(), Edition::LATEST));
+ w!(this, "fn {}() ", data.name.display(db.upcast(), this.display_target.edition));
}
hir_def::DefWithBodyId::StaticId(id) => {
let data = db.static_data(id);
- w!(this, "static {}: _ = ", data.name.display(db.upcast(), Edition::LATEST));
+ w!(
+ this,
+ "static {}: _ = ",
+ data.name.display(db.upcast(), this.display_target.edition)
+ );
}
hir_def::DefWithBodyId::ConstId(id) => {
let data = db.const_data(id);
@@ -59,7 +62,7 @@ impl MirBody {
data.name
.as_ref()
.unwrap_or(&Name::missing())
- .display(db.upcast(), Edition::LATEST)
+ .display(db.upcast(), this.display_target.edition)
);
}
hir_def::DefWithBodyId::VariantId(id) => {
@@ -70,10 +73,10 @@ impl MirBody {
"enum {}::{} = ",
enum_loc.id.item_tree(db.upcast())[enum_loc.id.value]
.name
- .display(db.upcast(), Edition::LATEST),
+ .display(db.upcast(), this.display_target.edition),
loc.id.item_tree(db.upcast())[loc.id.value]
.name
- .display(db.upcast(), Edition::LATEST),
+ .display(db.upcast(), this.display_target.edition),
)
}
hir_def::DefWithBodyId::InTypeConstId(id) => {
@@ -85,14 +88,14 @@ impl MirBody {
// String with lines is rendered poorly in `dbg` macros, which I use very much, so this
// function exists to solve that.
- pub fn dbg(&self, db: &dyn HirDatabase) -> impl Debug {
+ pub fn dbg(&self, db: &dyn HirDatabase, display_target: DisplayTarget) -> impl Debug {
struct StringDbg(String);
impl Debug for StringDbg {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
- StringDbg(self.pretty_print(db))
+ StringDbg(self.pretty_print(db, display_target))
}
}
@@ -103,6 +106,7 @@ struct MirPrettyCtx<'a> {
result: String,
indent: String,
local_to_binding: ArenaMap<LocalId, BindingId>,
+ display_target: DisplayTarget,
}
impl Write for MirPrettyCtx<'_> {
@@ -182,7 +186,12 @@ impl<'a> MirPrettyCtx<'a> {
wln!(self, "}}");
}
- fn new(body: &'a MirBody, hir_body: &'a Body, db: &'a dyn HirDatabase) -> Self {
+ fn new(
+ body: &'a MirBody,
+ hir_body: &'a Body,
+ db: &'a dyn HirDatabase,
+ display_target: DisplayTarget,
+ ) -> Self {
let local_to_binding = body.local_to_binding_map();
MirPrettyCtx {
body,
@@ -191,6 +200,7 @@ impl<'a> MirPrettyCtx<'a> {
indent: String::new(),
local_to_binding,
hir_body,
+ display_target,
}
}
@@ -208,7 +218,7 @@ impl<'a> MirPrettyCtx<'a> {
wln!(
self,
"let {}: {};",
- self.local_name(id).display_test(self.db),
+ self.local_name(id).display_test(self.db, self.display_target),
self.hir_display(&local.ty)
);
}
@@ -242,14 +252,14 @@ impl<'a> MirPrettyCtx<'a> {
wln!(
this,
"StorageDead({})",
- this.local_name(*p).display_test(self.db)
+ this.local_name(*p).display_test(this.db, this.display_target)
);
}
StatementKind::StorageLive(p) => {
wln!(
this,
"StorageLive({})",
- this.local_name(*p).display_test(self.db)
+ this.local_name(*p).display_test(this.db, this.display_target)
);
}
StatementKind::Deinit(p) => {
@@ -313,7 +323,7 @@ impl<'a> MirPrettyCtx<'a> {
fn f(this: &mut MirPrettyCtx<'_>, local: LocalId, projections: &[PlaceElem]) {
let Some((last, head)) = projections.split_last() else {
// no projection
- w!(this, "{}", this.local_name(local).display_test(this.db));
+ w!(this, "{}", this.local_name(local).display_test(this.db, this.display_target));
return;
};
match last {
@@ -333,13 +343,17 @@ impl<'a> MirPrettyCtx<'a> {
w!(
this,
" as {}).{}",
- variant_name.display(this.db.upcast(), Edition::LATEST),
- name.display(this.db.upcast(), Edition::LATEST)
+ variant_name.display(this.db.upcast(), this.display_target.edition),
+ name.display(this.db.upcast(), this.display_target.edition)
);
}
hir_def::VariantId::StructId(_) | hir_def::VariantId::UnionId(_) => {
f(this, local, head);
- w!(this, ".{}", name.display(this.db.upcast(), Edition::LATEST));
+ w!(
+ this,
+ ".{}",
+ name.display(this.db.upcast(), this.display_target.edition)
+ );
}
}
}
@@ -353,7 +367,11 @@ impl<'a> MirPrettyCtx<'a> {
}
ProjectionElem::Index(l) => {
f(this, local, head);
- w!(this, "[{}]", this.local_name(*l).display_test(this.db));
+ w!(
+ this,
+ "[{}]",
+ this.local_name(*l).display_test(this.db, this.display_target)
+ );
}
it => {
f(this, local, head);
@@ -403,7 +421,7 @@ impl<'a> MirPrettyCtx<'a> {
Rvalue::Repeat(op, len) => {
w!(self, "[");
self.operand(op);
- w!(self, "; {}]", len.display_test(self.db));
+ w!(self, "; {}]", len.display_test(self.db, self.display_target));
}
Rvalue::Aggregate(AggregateKind::Adt(_, _), it) => {
w!(self, "Adt(");
@@ -478,6 +496,7 @@ impl<'a> MirPrettyCtx<'a> {
}
fn hir_display<T: HirDisplay>(&self, ty: &'a T) -> impl Display + 'a {
- ty.display_test(self.db).with_closure_style(ClosureStyle::ClosureWithSubst)
+ ty.display_test(self.db, self.display_target)
+ .with_closure_style(ClosureStyle::ClosureWithSubst)
}
}