Fix completion of HashMap::new

The `ty` function in code_model returned the type with placeholders for type
parameters. That's nice for printing, but not good for completion, because
placeholders won't unify with anything else: So the type we got for `HashMap`
was `HashMap<K, V, T>`, which doesn't unify with `HashMap<?, ?, RandomState>`,
so the `new` method wasn't shown.

Now we instead return `HashMap<{unknown}, {unknown}, {unknown}>`, which does
unify with the impl type. Maybe we should just expose this properly as variables
though, i.e. we'd return something like `exists<type, type, type> HashMap<?0,
?1, ?2>` (in Chalk notation). It'll make the API more complicated, but harder to
misuse. (And it would handle cases like `type TypeAlias<T> = HashMap<T, T>` more
correctly.)
This commit is contained in:
Florian Diebold 2020-03-13 11:45:58 +01:00
parent 02b44006b8
commit d6195fa21f
5 changed files with 62 additions and 6 deletions

View file

@ -64,7 +64,7 @@ impl FunctionSignature {
.fields(db)
.into_iter()
.map(|field: hir::StructField| {
let ty = field.ty(db);
let ty = field.signature_ty(db);
format!("{}", ty.display(db))
})
.collect();
@ -102,7 +102,7 @@ impl FunctionSignature {
.into_iter()
.map(|field: hir::StructField| {
let name = field.name(db);
let ty = field.ty(db);
let ty = field.signature_ty(db);
format!("{}: {}", name, ty.display(db))
})
.collect();