Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/pretty.rs')
-rw-r--r--crates/hir-def/src/pretty.rs99
1 files changed, 62 insertions, 37 deletions
diff --git a/crates/hir-def/src/pretty.rs b/crates/hir-def/src/pretty.rs
index d5ef17a91f..9ceb82d5fd 100644
--- a/crates/hir-def/src/pretty.rs
+++ b/crates/hir-def/src/pretty.rs
@@ -1,9 +1,11 @@
//! Display and pretty printing routines.
-use std::fmt::{self, Write};
+use std::{
+ fmt::{self, Write},
+ mem,
+};
use hir_expand::mod_path::PathKind;
-use intern::Interned;
use itertools::Itertools;
use span::Edition;
@@ -11,12 +13,15 @@ use crate::{
db::DefDatabase,
lang_item::LangItemTarget,
path::{GenericArg, GenericArgs, Path},
- type_ref::{Mutability, TraitBoundModifier, TypeBound, TypeRef},
+ type_ref::{
+ Mutability, TraitBoundModifier, TypeBound, TypeRef, TypeRefId, TypesMap, UseArgRef,
+ },
};
pub(crate) fn print_path(
db: &dyn DefDatabase,
path: &Path,
+ map: &TypesMap,
buf: &mut dyn Write,
edition: Edition,
) -> fmt::Result {
@@ -58,7 +63,7 @@ pub(crate) fn print_path(
match path.type_anchor() {
Some(anchor) => {
write!(buf, "<")?;
- print_type_ref(db, anchor, buf, edition)?;
+ print_type_ref(db, anchor, map, buf, edition)?;
write!(buf, ">::")?;
}
None => match path.kind() {
@@ -87,7 +92,7 @@ pub(crate) fn print_path(
write!(buf, "{}", segment.name.display(db.upcast(), edition))?;
if let Some(generics) = segment.args_and_bindings {
write!(buf, "::<")?;
- print_generic_args(db, generics, buf, edition)?;
+ print_generic_args(db, generics, map, buf, edition)?;
write!(buf, ">")?;
}
@@ -99,6 +104,7 @@ pub(crate) fn print_path(
pub(crate) fn print_generic_args(
db: &dyn DefDatabase,
generics: &GenericArgs,
+ map: &TypesMap,
buf: &mut dyn Write,
edition: Edition,
) -> fmt::Result {
@@ -106,7 +112,7 @@ pub(crate) fn print_generic_args(
let args = if generics.has_self_type {
let (self_ty, args) = generics.args.split_first().unwrap();
write!(buf, "Self=")?;
- print_generic_arg(db, self_ty, buf, edition)?;
+ print_generic_arg(db, self_ty, map, buf, edition)?;
first = false;
args
} else {
@@ -117,7 +123,7 @@ pub(crate) fn print_generic_args(
write!(buf, ", ")?;
}
first = false;
- print_generic_arg(db, arg, buf, edition)?;
+ print_generic_arg(db, arg, map, buf, edition)?;
}
for binding in generics.bindings.iter() {
if !first {
@@ -127,11 +133,11 @@ pub(crate) fn print_generic_args(
write!(buf, "{}", binding.name.display(db.upcast(), edition))?;
if !binding.bounds.is_empty() {
write!(buf, ": ")?;
- print_type_bounds(db, &binding.bounds, buf, edition)?;
+ print_type_bounds(db, &binding.bounds, map, buf, edition)?;
}
- if let Some(ty) = &binding.type_ref {
+ if let Some(ty) = binding.type_ref {
write!(buf, " = ")?;
- print_type_ref(db, ty, buf, edition)?;
+ print_type_ref(db, ty, map, buf, edition)?;
}
}
Ok(())
@@ -140,11 +146,12 @@ pub(crate) fn print_generic_args(
pub(crate) fn print_generic_arg(
db: &dyn DefDatabase,
arg: &GenericArg,
+ map: &TypesMap,
buf: &mut dyn Write,
edition: Edition,
) -> fmt::Result {
match arg {
- GenericArg::Type(ty) => print_type_ref(db, ty, buf, edition),
+ GenericArg::Type(ty) => print_type_ref(db, *ty, map, buf, edition),
GenericArg::Const(c) => write!(buf, "{}", c.display(db.upcast(), edition)),
GenericArg::Lifetime(lt) => write!(buf, "{}", lt.name.display(db.upcast(), edition)),
}
@@ -152,12 +159,13 @@ pub(crate) fn print_generic_arg(
pub(crate) fn print_type_ref(
db: &dyn DefDatabase,
- type_ref: &TypeRef,
+ type_ref: TypeRefId,
+ map: &TypesMap,
buf: &mut dyn Write,
edition: Edition,
) -> fmt::Result {
// FIXME: deduplicate with `HirDisplay` impl
- match type_ref {
+ match &map[type_ref] {
TypeRef::Never => write!(buf, "!")?,
TypeRef::Placeholder => write!(buf, "_")?,
TypeRef::Tuple(fields) => {
@@ -166,48 +174,48 @@ pub(crate) fn print_type_ref(
if i != 0 {
write!(buf, ", ")?;
}
- print_type_ref(db, field, buf, edition)?;
+ print_type_ref(db, *field, map, buf, edition)?;
}
write!(buf, ")")?;
}
- TypeRef::Path(path) => print_path(db, path, buf, edition)?,
+ TypeRef::Path(path) => print_path(db, path, map, buf, edition)?,
TypeRef::RawPtr(pointee, mtbl) => {
let mtbl = match mtbl {
Mutability::Shared => "*const",
Mutability::Mut => "*mut",
};
write!(buf, "{mtbl} ")?;
- print_type_ref(db, pointee, buf, edition)?;
+ print_type_ref(db, *pointee, map, buf, edition)?;
}
- TypeRef::Reference(pointee, lt, mtbl) => {
- let mtbl = match mtbl {
+ TypeRef::Reference(ref_) => {
+ let mtbl = match ref_.mutability {
Mutability::Shared => "",
Mutability::Mut => "mut ",
};
write!(buf, "&")?;
- if let Some(lt) = lt {
+ if let Some(lt) = &ref_.lifetime {
write!(buf, "{} ", lt.name.display(db.upcast(), edition))?;
}
write!(buf, "{mtbl}")?;
- print_type_ref(db, pointee, buf, edition)?;
+ print_type_ref(db, ref_.ty, map, buf, edition)?;
}
- TypeRef::Array(elem, len) => {
+ TypeRef::Array(array) => {
write!(buf, "[")?;
- print_type_ref(db, elem, buf, edition)?;
- write!(buf, "; {}]", len.display(db.upcast(), edition))?;
+ print_type_ref(db, array.ty, map, buf, edition)?;
+ write!(buf, "; {}]", array.len.display(db.upcast(), edition))?;
}
TypeRef::Slice(elem) => {
write!(buf, "[")?;
- print_type_ref(db, elem, buf, edition)?;
+ print_type_ref(db, *elem, map, buf, edition)?;
write!(buf, "]")?;
}
- TypeRef::Fn(args_and_ret, varargs, is_unsafe, abi) => {
+ TypeRef::Fn(fn_) => {
let ((_, return_type), args) =
- args_and_ret.split_last().expect("TypeRef::Fn is missing return type");
- if *is_unsafe {
+ fn_.params().split_last().expect("TypeRef::Fn is missing return type");
+ if fn_.is_unsafe() {
write!(buf, "unsafe ")?;
}
- if let Some(abi) = abi {
+ if let Some(abi) = fn_.abi() {
buf.write_str("extern ")?;
buf.write_str(abi.as_str())?;
buf.write_char(' ')?;
@@ -217,16 +225,16 @@ pub(crate) fn print_type_ref(
if i != 0 {
write!(buf, ", ")?;
}
- print_type_ref(db, typeref, buf, edition)?;
+ print_type_ref(db, *typeref, map, buf, edition)?;
}
- if *varargs {
+ if fn_.is_varargs() {
if !args.is_empty() {
write!(buf, ", ")?;
}
write!(buf, "...")?;
}
write!(buf, ") -> ")?;
- print_type_ref(db, return_type, buf, edition)?;
+ print_type_ref(db, *return_type, map, buf, edition)?;
}
TypeRef::Macro(_ast_id) => {
write!(buf, "<macro>")?;
@@ -234,11 +242,11 @@ pub(crate) fn print_type_ref(
TypeRef::Error => write!(buf, "{{unknown}}")?,
TypeRef::ImplTrait(bounds) => {
write!(buf, "impl ")?;
- print_type_bounds(db, bounds, buf, edition)?;
+ print_type_bounds(db, bounds, map, buf, edition)?;
}
TypeRef::DynTrait(bounds) => {
write!(buf, "dyn ")?;
- print_type_bounds(db, bounds, buf, edition)?;
+ print_type_bounds(db, bounds, map, buf, edition)?;
}
}
@@ -247,7 +255,8 @@ pub(crate) fn print_type_ref(
pub(crate) fn print_type_bounds(
db: &dyn DefDatabase,
- bounds: &[Interned<TypeBound>],
+ bounds: &[TypeBound],
+ map: &TypesMap,
buf: &mut dyn Write,
edition: Edition,
) -> fmt::Result {
@@ -256,13 +265,13 @@ pub(crate) fn print_type_bounds(
write!(buf, " + ")?;
}
- match bound.as_ref() {
+ match bound {
TypeBound::Path(path, modifier) => {
match modifier {
TraitBoundModifier::None => (),
TraitBoundModifier::Maybe => write!(buf, "?")?,
}
- print_path(db, path, buf, edition)?;
+ print_path(db, path, map, buf, edition)?;
}
TypeBound::ForLifetime(lifetimes, path) => {
write!(
@@ -270,9 +279,25 @@ pub(crate) fn print_type_bounds(
"for<{}> ",
lifetimes.iter().map(|it| it.display(db.upcast(), edition)).format(", ")
)?;
- print_path(db, path, buf, edition)?;
+ print_path(db, path, map, buf, edition)?;
}
TypeBound::Lifetime(lt) => write!(buf, "{}", lt.name.display(db.upcast(), edition))?,
+ TypeBound::Use(args) => {
+ write!(buf, "use<")?;
+ let mut first = true;
+ for arg in args {
+ if !mem::take(&mut first) {
+ write!(buf, ", ")?;
+ }
+ match arg {
+ UseArgRef::Name(it) => write!(buf, "{}", it.display(db.upcast(), edition))?,
+ UseArgRef::Lifetime(it) => {
+ write!(buf, "{}", it.name.display(db.upcast(), edition))?
+ }
+ }
+ }
+ write!(buf, ">")?
+ }
TypeBound::Error => write!(buf, "{{unknown}}")?,
}
}