Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 37 additions & 73 deletions crates/hir-ty/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ use crate::{
utils::{detect_variant_from_bytes, fn_traits},
};

pub type Result<T = (), E = HirDisplayError> = std::result::Result<T, E>;

pub trait HirWrite: fmt::Write {
fn start_location_link(&mut self, _location: ModuleDefId) {}
fn end_location_link(&mut self) {}
Expand Down Expand Up @@ -190,7 +192,7 @@ impl<'db> HirFormatter<'_, 'db> {
}

pub trait HirDisplay<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError>;
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result;

/// Returns a `Display`able type that is human-readable.
fn into_displayable<'a>(
Expand Down Expand Up @@ -399,7 +401,7 @@ impl<'db> HirFormatter<'_, 'db> {
&mut self,
iter: impl IntoIterator<Item = T>,
sep: &str,
) -> Result<(), HirDisplayError> {
) -> Result {
let mut first = true;
for e in iter {
if !first {
Expand All @@ -418,7 +420,7 @@ impl<'db> HirFormatter<'_, 'db> {
}

/// This allows using the `write!` macro directly with a `HirFormatter`.
pub fn write_fmt(&mut self, args: fmt::Arguments<'_>) -> Result<(), HirDisplayError> {
pub fn write_fmt(&mut self, args: fmt::Arguments<'_>) -> Result {
// We write to a buffer first to track output size
self.buf.clear();
fmt::write(&mut self.buf, args)?;
Expand All @@ -428,12 +430,12 @@ impl<'db> HirFormatter<'_, 'db> {
self.fmt.write_str(&self.buf).map_err(HirDisplayError::from)
}

pub fn write_str(&mut self, s: &str) -> Result<(), HirDisplayError> {
pub fn write_str(&mut self, s: &str) -> Result {
self.fmt.write_str(s)?;
Ok(())
}

pub fn write_char(&mut self, c: char) -> Result<(), HirDisplayError> {
pub fn write_char(&mut self, c: char) -> Result {
self.fmt.write_char(c)?;
Ok(())
}
Expand Down Expand Up @@ -541,7 +543,7 @@ pub enum ClosureStyle {
}

impl<'db, T: HirDisplay<'db>> HirDisplayWrapper<'_, 'db, T> {
pub fn write_to<F: HirWrite>(&self, f: &mut F) -> Result<(), HirDisplayError> {
pub fn write_to<F: HirWrite>(&self, f: &mut F) -> Result {
let krate = self.display_target.krate;
let interner = DbInterner::new_with(self.db, krate);
self.t.hir_fmt(&mut HirFormatter {
Expand Down Expand Up @@ -594,21 +596,18 @@ where
const TYPE_HINT_TRUNCATION: &str = "…";

impl<'db, T: HirDisplay<'db>> HirDisplay<'db> for &T {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
HirDisplay::hir_fmt(*self, f)
}
}

impl<'db, T: HirDisplay<'db> + Internable> HirDisplay<'db> for Interned<T> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
HirDisplay::hir_fmt(self.as_ref(), f)
}
}

fn write_projection<'db>(
f: &mut HirFormatter<'_, 'db>,
alias: &AliasTy<'db>,
) -> Result<(), HirDisplayError> {
fn write_projection<'db>(f: &mut HirFormatter<'_, 'db>, alias: &AliasTy<'db>) -> Result {
if f.should_truncate() {
return write!(f, "{TYPE_HINT_TRUNCATION}");
}
Expand Down Expand Up @@ -665,7 +664,7 @@ fn write_projection<'db>(
}

impl<'db> HirDisplay<'db> for GenericArg<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
match self {
GenericArg::Ty(ty) => ty.hir_fmt(f),
GenericArg::Lifetime(lt) => lt.hir_fmt(f),
Expand All @@ -675,7 +674,7 @@ impl<'db> HirDisplay<'db> for GenericArg<'db> {
}

impl<'db> HirDisplay<'db> for Const<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
match self.kind() {
ConstKind::Placeholder(_) => write!(f, "<placeholder>"),
ConstKind::Bound(BoundVarIndexKind::Bound(db), bound_const) => {
Expand Down Expand Up @@ -714,7 +713,7 @@ fn render_const_scalar<'db>(
b: &[u8],
memory_map: &MemoryMap<'db>,
ty: Ty<'db>,
) -> Result<(), HirDisplayError> {
) -> Result {
let param_env = ParamEnv::empty();
let infcx = f.interner.infer_ctxt().build(TypingMode::PostAnalysis);
let ty = infcx.at(&ObligationCause::new(), param_env).deeply_normalize(ty).unwrap_or(ty);
Expand All @@ -727,7 +726,7 @@ fn render_const_scalar_inner<'db>(
memory_map: &MemoryMap<'db>,
ty: Ty<'db>,
param_env: ParamEnv<'db>,
) -> Result<(), HirDisplayError> {
) -> Result {
use TyKind;
let param_env = ParamEnvAndCrate { param_env, krate: f.krate() };
match ty.kind() {
Expand Down Expand Up @@ -1000,7 +999,7 @@ fn render_variant_after_name<'db>(
args: GenericArgs<'db>,
b: &[u8],
memory_map: &MemoryMap<'db>,
) -> Result<(), HirDisplayError> {
) -> Result {
let param_env = ParamEnvAndCrate { param_env, krate: f.krate() };
match data.shape {
FieldsShape::Record | FieldsShape::Tuple => {
Expand Down Expand Up @@ -1044,10 +1043,7 @@ fn render_variant_after_name<'db>(
}

impl<'db> HirDisplay<'db> for Ty<'db> {
fn hir_fmt(
&self,
f @ &mut HirFormatter { db, .. }: &mut HirFormatter<'_, 'db>,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f @ &mut HirFormatter { db, .. }: &mut HirFormatter<'_, 'db>) -> Result {
let interner = f.interner;
if f.should_truncate() {
return write!(f, "{TYPE_HINT_TRUNCATION}");
Expand Down Expand Up @@ -1650,7 +1646,7 @@ fn hir_fmt_generics<'db>(
parameters: &[GenericArg<'db>],
generic_def: Option<hir_def::GenericDefId>,
self_: Option<Ty<'db>>,
) -> Result<(), HirDisplayError> {
) -> Result {
if parameters.is_empty() {
return Ok(());
}
Expand Down Expand Up @@ -1700,7 +1696,7 @@ fn hir_fmt_generic_args<'db>(
parameters: &[GenericArg<'db>],
generic_def: Option<hir_def::GenericDefId>,
self_: Option<Ty<'db>>,
) -> Result<(), HirDisplayError> {
) -> Result {
if parameters.is_empty() {
return Ok(());
}
Expand All @@ -1720,7 +1716,7 @@ fn hir_fmt_generic_arguments<'db>(
f: &mut HirFormatter<'_, 'db>,
parameters: &[GenericArg<'db>],
self_: Option<Ty<'db>>,
) -> Result<(), HirDisplayError> {
) -> Result {
let mut first = true;
let lifetime_offset = parameters.iter().position(|arg| arg.region().is_some());

Expand All @@ -1744,7 +1740,7 @@ fn hir_fmt_tys<'db>(
f: &mut HirFormatter<'_, 'db>,
tys: &[Ty<'db>],
self_: Option<Ty<'db>>,
) -> Result<(), HirDisplayError> {
) -> Result {
let mut first = true;

for ty in tys {
Expand All @@ -1760,7 +1756,7 @@ fn hir_fmt_tys<'db>(
}

impl<'db> HirDisplay<'db> for PolyFnSig<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
let FnSig { inputs_and_output, c_variadic, safety, abi: _ } = self.skip_binder();
if let Safety::Unsafe = safety {
write!(f, "unsafe ")?;
Expand Down Expand Up @@ -1791,7 +1787,7 @@ impl<'db> HirDisplay<'db> for PolyFnSig<'db> {
}

impl<'db> HirDisplay<'db> for Term<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
match self {
Term::Ty(it) => it.hir_fmt(f),
Term::Const(it) => it.hir_fmt(f),
Expand Down Expand Up @@ -1823,7 +1819,7 @@ pub fn write_bounds_like_dyn_trait_with_prefix<'db>(
this: Either<Ty<'db>, Region<'db>>,
predicates: &[Clause<'db>],
default_sized: SizedByDefault,
) -> Result<(), HirDisplayError> {
) -> Result {
write!(f, "{prefix}")?;
if !predicates.is_empty()
|| predicates.is_empty() && matches!(default_sized, SizedByDefault::Sized { .. })
Expand All @@ -1840,7 +1836,7 @@ fn write_bounds_like_dyn_trait<'db>(
this: Either<Ty<'db>, Region<'db>>,
predicates: &[Clause<'db>],
default_sized: SizedByDefault,
) -> Result<(), HirDisplayError> {
) -> Result {
// Note: This code is written to produce nice results (i.e.
// corresponding to surface Rust) for types that can occur in
// actual Rust. It will have weird results if the predicates
Expand Down Expand Up @@ -1984,7 +1980,7 @@ fn write_bounds_like_dyn_trait<'db>(
}

impl<'db> HirDisplay<'db> for TraitRef<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
let trait_ = self.def_id.0;
f.start_location_link(trait_.into());
write!(f, "{}", f.db.trait_signature(trait_).name.display(f.db, f.edition()))?;
Expand All @@ -1995,7 +1991,7 @@ impl<'db> HirDisplay<'db> for TraitRef<'db> {
}

impl<'db> HirDisplay<'db> for Region<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
match self.kind() {
RegionKind::ReEarlyParam(param) => {
let generics = generics(f.db, param.id.parent);
Expand Down Expand Up @@ -2029,7 +2025,7 @@ pub fn write_visibility<'db>(
module_id: ModuleId,
vis: Visibility,
f: &mut HirFormatter<'_, 'db>,
) -> Result<(), HirDisplayError> {
) -> Result {
match vis {
Visibility::Public => write!(f, "pub "),
Visibility::PubCrate(_) => write!(f, "pub(crate) "),
Expand All @@ -2052,21 +2048,13 @@ pub fn write_visibility<'db>(
}

pub trait HirDisplayWithExpressionStore<'db> {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError>;
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result;
}

impl<'db, T: ?Sized + HirDisplayWithExpressionStore<'db>> HirDisplayWithExpressionStore<'db>
for &'_ T
{
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result {
T::hir_fmt(&**self, f, store)
}
}
Expand All @@ -2087,16 +2075,12 @@ impl<'a, T> ExpressionStoreAdapter<'a, T> {
}

impl<'db, T: HirDisplayWithExpressionStore<'db>> HirDisplay<'db> for ExpressionStoreAdapter<'_, T> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
T::hir_fmt(&self.0, f, self.1)
}
}
impl<'db> HirDisplayWithExpressionStore<'db> for LifetimeRefId {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result {
match &store[*self] {
LifetimeRef::Named(name) => write!(f, "{}", name.display(f.db, f.edition())),
LifetimeRef::Static => write!(f, "'static"),
Expand All @@ -2115,11 +2099,7 @@ impl<'db> HirDisplayWithExpressionStore<'db> for LifetimeRefId {
}

impl<'db> HirDisplayWithExpressionStore<'db> for TypeRefId {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result {
match &store[*self] {
TypeRef::Never => write!(f, "!")?,
TypeRef::TypeParam(param) => {
Expand Down Expand Up @@ -2244,11 +2224,7 @@ impl<'db> HirDisplayWithExpressionStore<'db> for TypeRefId {
}

impl<'db> HirDisplayWithExpressionStore<'db> for ConstRef {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
_store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, _store: &ExpressionStore) -> Result {
// FIXME
write!(f, "{{const}}")?;

Expand All @@ -2257,11 +2233,7 @@ impl<'db> HirDisplayWithExpressionStore<'db> for ConstRef {
}

impl<'db> HirDisplayWithExpressionStore<'db> for TypeBound {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result {
match self {
&TypeBound::Path(path, modifier) => {
match modifier {
Expand Down Expand Up @@ -2301,11 +2273,7 @@ impl<'db> HirDisplayWithExpressionStore<'db> for TypeBound {
}

impl<'db> HirDisplayWithExpressionStore<'db> for Path {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result {
match (self.type_anchor(), self.kind()) {
(Some(anchor), _) => {
write!(f, "<")?;
Expand Down Expand Up @@ -2453,11 +2421,7 @@ impl<'db> HirDisplayWithExpressionStore<'db> for Path {
}

impl<'db> HirDisplayWithExpressionStore<'db> for hir_def::expr_store::path::GenericArg {
fn hir_fmt(
&self,
f: &mut HirFormatter<'_, 'db>,
store: &ExpressionStore,
) -> Result<(), HirDisplayError> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>, store: &ExpressionStore) -> Result {
match self {
hir_def::expr_store::path::GenericArg::Type(ty) => ty.hir_fmt(f, store),
hir_def::expr_store::path::GenericArg::Const(_c) => {
Expand Down
Loading