mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 06:11:35 +00:00
Separate Ty
and TyKind
like in Chalk
Currently `Ty` just wraps `TyKind`, but this allows us to change most places to already use `intern` / `interned`.
This commit is contained in:
parent
7accf6bc37
commit
6c32bbf3ca
20 changed files with 756 additions and 620 deletions
|
@ -12,8 +12,8 @@ use hir_expand::name::Name;
|
|||
|
||||
use crate::{
|
||||
db::HirDatabase, primitive, utils::generics, AdtId, AliasTy, CallableDefId, CallableSig,
|
||||
GenericPredicate, Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Scalar, Substs,
|
||||
TraitRef, Ty,
|
||||
GenericPredicate, Interner, Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Scalar,
|
||||
Substs, TraitRef, Ty, TyKind,
|
||||
};
|
||||
|
||||
pub struct HirFormatter<'a> {
|
||||
|
@ -267,32 +267,32 @@ impl HirDisplay for Ty {
|
|||
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||
}
|
||||
|
||||
match self {
|
||||
Ty::Never => write!(f, "!")?,
|
||||
Ty::Str => write!(f, "str")?,
|
||||
Ty::Scalar(Scalar::Bool) => write!(f, "bool")?,
|
||||
Ty::Scalar(Scalar::Char) => write!(f, "char")?,
|
||||
&Ty::Scalar(Scalar::Float(t)) => write!(f, "{}", primitive::float_ty_to_string(t))?,
|
||||
&Ty::Scalar(Scalar::Int(t)) => write!(f, "{}", primitive::int_ty_to_string(t))?,
|
||||
&Ty::Scalar(Scalar::Uint(t)) => write!(f, "{}", primitive::uint_ty_to_string(t))?,
|
||||
Ty::Slice(parameters) => {
|
||||
match self.interned(&Interner) {
|
||||
TyKind::Never => write!(f, "!")?,
|
||||
TyKind::Str => write!(f, "str")?,
|
||||
TyKind::Scalar(Scalar::Bool) => write!(f, "bool")?,
|
||||
TyKind::Scalar(Scalar::Char) => write!(f, "char")?,
|
||||
&TyKind::Scalar(Scalar::Float(t)) => write!(f, "{}", primitive::float_ty_to_string(t))?,
|
||||
&TyKind::Scalar(Scalar::Int(t)) => write!(f, "{}", primitive::int_ty_to_string(t))?,
|
||||
&TyKind::Scalar(Scalar::Uint(t)) => write!(f, "{}", primitive::uint_ty_to_string(t))?,
|
||||
TyKind::Slice(parameters) => {
|
||||
let t = parameters.as_single();
|
||||
write!(f, "[")?;
|
||||
t.hir_fmt(f)?;
|
||||
write!(f, "]")?;
|
||||
}
|
||||
Ty::Array(parameters) => {
|
||||
TyKind::Array(parameters) => {
|
||||
let t = parameters.as_single();
|
||||
write!(f, "[")?;
|
||||
t.hir_fmt(f)?;
|
||||
write!(f, "; _]")?;
|
||||
}
|
||||
Ty::Raw(m, parameters) | Ty::Ref(m, parameters) => {
|
||||
TyKind::Raw(m, parameters) | TyKind::Ref(m, parameters) => {
|
||||
let t = parameters.as_single();
|
||||
let ty_display =
|
||||
t.into_displayable(f.db, f.max_size, f.omit_verbose_types, f.display_target);
|
||||
|
||||
if matches!(self, Ty::Raw(..)) {
|
||||
if matches!(self.interned(&Interner), TyKind::Raw(..)) {
|
||||
write!(
|
||||
f,
|
||||
"*{}",
|
||||
|
@ -313,11 +313,11 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
|
||||
let datas;
|
||||
let predicates = match t {
|
||||
Ty::Dyn(predicates) if predicates.len() > 1 => {
|
||||
let predicates = match t.interned(&Interner) {
|
||||
TyKind::Dyn(predicates) if predicates.len() > 1 => {
|
||||
Cow::Borrowed(predicates.as_ref())
|
||||
}
|
||||
&Ty::Alias(AliasTy::Opaque(OpaqueTy {
|
||||
&TyKind::Alias(AliasTy::Opaque(OpaqueTy {
|
||||
opaque_ty_id: OpaqueTyId::ReturnTypeImplTrait(func, idx),
|
||||
ref parameters,
|
||||
})) => {
|
||||
|
@ -347,7 +347,7 @@ impl HirDisplay for Ty {
|
|||
write!(f, "{}", ty_display)?;
|
||||
}
|
||||
}
|
||||
Ty::Tuple(_, substs) => {
|
||||
TyKind::Tuple(_, substs) => {
|
||||
if substs.len() == 1 {
|
||||
write!(f, "(")?;
|
||||
substs[0].hir_fmt(f)?;
|
||||
|
@ -358,11 +358,11 @@ impl HirDisplay for Ty {
|
|||
write!(f, ")")?;
|
||||
}
|
||||
}
|
||||
Ty::Function(fn_ptr) => {
|
||||
TyKind::Function(fn_ptr) => {
|
||||
let sig = CallableSig::from_fn_ptr(fn_ptr);
|
||||
sig.hir_fmt(f)?;
|
||||
}
|
||||
Ty::FnDef(def, parameters) => {
|
||||
TyKind::FnDef(def, parameters) => {
|
||||
let def = *def;
|
||||
let sig = f.db.callable_item_signature(def).subst(parameters);
|
||||
match def {
|
||||
|
@ -401,7 +401,7 @@ impl HirDisplay for Ty {
|
|||
write!(f, " -> {}", ret_display)?;
|
||||
}
|
||||
}
|
||||
Ty::Adt(AdtId(def_id), parameters) => {
|
||||
TyKind::Adt(AdtId(def_id), parameters) => {
|
||||
match f.display_target {
|
||||
DisplayTarget::Diagnostics | DisplayTarget::Test => {
|
||||
let name = match *def_id {
|
||||
|
@ -427,37 +427,39 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
|
||||
if parameters.len() > 0 {
|
||||
let parameters_to_write =
|
||||
if f.display_target.is_source_code() || f.omit_verbose_types() {
|
||||
match self
|
||||
.as_generic_def()
|
||||
.map(|generic_def_id| f.db.generic_defaults(generic_def_id))
|
||||
.filter(|defaults| !defaults.is_empty())
|
||||
{
|
||||
None => parameters.0.as_ref(),
|
||||
Some(default_parameters) => {
|
||||
let mut default_from = 0;
|
||||
for (i, parameter) in parameters.iter().enumerate() {
|
||||
match (parameter, default_parameters.get(i)) {
|
||||
(&Ty::Unknown, _) | (_, None) => {
|
||||
let parameters_to_write = if f.display_target.is_source_code()
|
||||
|| f.omit_verbose_types()
|
||||
{
|
||||
match self
|
||||
.as_generic_def()
|
||||
.map(|generic_def_id| f.db.generic_defaults(generic_def_id))
|
||||
.filter(|defaults| !defaults.is_empty())
|
||||
{
|
||||
None => parameters.0.as_ref(),
|
||||
Some(default_parameters) => {
|
||||
let mut default_from = 0;
|
||||
for (i, parameter) in parameters.iter().enumerate() {
|
||||
match (parameter.interned(&Interner), default_parameters.get(i))
|
||||
{
|
||||
(&TyKind::Unknown, _) | (_, None) => {
|
||||
default_from = i + 1;
|
||||
}
|
||||
(_, Some(default_parameter)) => {
|
||||
let actual_default = default_parameter
|
||||
.clone()
|
||||
.subst(¶meters.prefix(i));
|
||||
if parameter != &actual_default {
|
||||
default_from = i + 1;
|
||||
}
|
||||
(_, Some(default_parameter)) => {
|
||||
let actual_default = default_parameter
|
||||
.clone()
|
||||
.subst(¶meters.prefix(i));
|
||||
if parameter != &actual_default {
|
||||
default_from = i + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
¶meters.0[0..default_from]
|
||||
}
|
||||
¶meters.0[0..default_from]
|
||||
}
|
||||
} else {
|
||||
parameters.0.as_ref()
|
||||
};
|
||||
}
|
||||
} else {
|
||||
parameters.0.as_ref()
|
||||
};
|
||||
if !parameters_to_write.is_empty() {
|
||||
write!(f, "<")?;
|
||||
f.write_joined(parameters_to_write, ", ")?;
|
||||
|
@ -465,7 +467,7 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
}
|
||||
}
|
||||
Ty::AssociatedType(type_alias, parameters) => {
|
||||
TyKind::AssociatedType(type_alias, parameters) => {
|
||||
let trait_ = match type_alias.lookup(f.db.upcast()).container {
|
||||
AssocContainerId::TraitId(it) => it,
|
||||
_ => panic!("not an associated type"),
|
||||
|
@ -488,11 +490,11 @@ impl HirDisplay for Ty {
|
|||
projection_ty.hir_fmt(f)?;
|
||||
}
|
||||
}
|
||||
Ty::ForeignType(type_alias) => {
|
||||
TyKind::ForeignType(type_alias) => {
|
||||
let type_alias = f.db.type_alias_data(*type_alias);
|
||||
write!(f, "{}", type_alias.name)?;
|
||||
}
|
||||
Ty::OpaqueType(opaque_ty_id, parameters) => {
|
||||
TyKind::OpaqueType(opaque_ty_id, parameters) => {
|
||||
match opaque_ty_id {
|
||||
&OpaqueTyId::ReturnTypeImplTrait(func, idx) => {
|
||||
let datas =
|
||||
|
@ -511,7 +513,7 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
}
|
||||
}
|
||||
Ty::Closure(.., substs) => {
|
||||
TyKind::Closure(.., substs) => {
|
||||
let sig = substs[0].callable_sig(f.db);
|
||||
if let Some(sig) = sig {
|
||||
if sig.params().is_empty() {
|
||||
|
@ -535,7 +537,7 @@ impl HirDisplay for Ty {
|
|||
write!(f, "{{closure}}")?;
|
||||
}
|
||||
}
|
||||
Ty::Placeholder(id) => {
|
||||
TyKind::Placeholder(id) => {
|
||||
let generics = generics(f.db.upcast(), id.parent);
|
||||
let param_data = &generics.params.types[id.local_id];
|
||||
match param_data.provenance {
|
||||
|
@ -553,12 +555,12 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
}
|
||||
}
|
||||
Ty::BoundVar(idx) => write!(f, "?{}.{}", idx.debruijn.depth(), idx.index)?,
|
||||
Ty::Dyn(predicates) => {
|
||||
TyKind::BoundVar(idx) => write!(f, "?{}.{}", idx.debruijn.depth(), idx.index)?,
|
||||
TyKind::Dyn(predicates) => {
|
||||
write_bounds_like_dyn_trait_with_prefix("dyn", predicates, f)?;
|
||||
}
|
||||
Ty::Alias(AliasTy::Projection(p_ty)) => p_ty.hir_fmt(f)?,
|
||||
Ty::Alias(AliasTy::Opaque(opaque_ty)) => {
|
||||
TyKind::Alias(AliasTy::Projection(p_ty)) => p_ty.hir_fmt(f)?,
|
||||
TyKind::Alias(AliasTy::Opaque(opaque_ty)) => {
|
||||
match opaque_ty.opaque_ty_id {
|
||||
OpaqueTyId::ReturnTypeImplTrait(func, idx) => {
|
||||
let datas =
|
||||
|
@ -574,7 +576,7 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
};
|
||||
}
|
||||
Ty::Unknown => {
|
||||
TyKind::Unknown => {
|
||||
if f.display_target.is_source_code() {
|
||||
return Err(HirDisplayError::DisplaySourceCodeError(
|
||||
DisplaySourceCodeError::UnknownType,
|
||||
|
@ -582,7 +584,7 @@ impl HirDisplay for Ty {
|
|||
}
|
||||
write!(f, "{{unknown}}")?;
|
||||
}
|
||||
Ty::InferenceVar(..) => write!(f, "_")?,
|
||||
TyKind::InferenceVar(..) => write!(f, "_")?,
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue