//! HIR for references to types. Paths in these are not yet resolved. They can
//! be directly created from an ast::TypeRef, without further queries.
-use hir_expand::{name::Name, AstId, InFile};
+use hir_expand::{
+ name::{AsName, Name},
+ AstId, InFile,
+};
use std::convert::TryInto;
-use syntax::{ast, AstNode};
+use syntax::ast::{self, HasName};
use crate::{body::LowerCtx, intern::Interned, path::Path};
Array(Box<TypeRef>, ConstScalar),
Slice(Box<TypeRef>),
/// A fn pointer. Last element of the vector is the return type.
- Fn(Vec<(Option<String>, TypeRef)>, bool /*varargs*/),
+ Fn(Vec<(Option<Name>, TypeRef)>, bool /*varargs*/),
// For
ImplTrait(Vec<Interned<TypeBound>>),
DynTrait(Vec<Interned<TypeBound>>),
}
pl.params()
- .map(|p| (p.pat(), p.ty()))
.map(|it| {
- let type_ref = TypeRef::from_ast_opt(ctx, it.1);
- let name = if it.0.is_some() {
- Some(it.0.unwrap().syntax().text().to_string())
- } else {
- None
+ let type_ref = TypeRef::from_ast_opt(ctx, it.ty());
+ let name = match it.pat() {
+ Some(ast::Pat::IdentPat(it)) => Some(
+ it.name().map(|nr| nr.as_name()).unwrap_or_else(Name::missing),
+ ),
+ _ => None,
};
(name, type_ref)
})
fn go(type_ref: &TypeRef, f: &mut impl FnMut(&TypeRef)) {
f(type_ref);
match type_ref {
- TypeRef::Fn(types, _) => types.iter().for_each(|t| go(&t.1, f)),
+ TypeRef::Fn(params, _) => {
+ params.iter().for_each(|(_, param_type)| go(¶m_type, f))
+ }
TypeRef::Tuple(types) => types.iter().for_each(|t| go(t, f)),
TypeRef::RawPtr(type_ref, _)
| TypeRef::Reference(type_ref, ..)