Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_completion/src/completions.rs')
-rw-r--r--crates/ide_completion/src/completions.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/crates/ide_completion/src/completions.rs b/crates/ide_completion/src/completions.rs
index ab442fa64b..7dbc511395 100644
--- a/crates/ide_completion/src/completions.rs
+++ b/crates/ide_completion/src/completions.rs
@@ -21,12 +21,13 @@ pub(crate) mod vis;
use std::iter;
-use hir::{db::HirDatabase, known, ScopeDef};
+use hir::{db::HirDatabase, known, HirDisplay, ScopeDef};
use ide_db::SymbolKind;
use crate::{
context::Visible,
item::Builder,
+ patterns::{ImmediateLocation, TypeAnnotation},
render::{
const_::render_const,
function::{render_fn, render_method},
@@ -34,6 +35,7 @@ use crate::{
macro_::render_macro,
pattern::{render_struct_pat, render_variant_pat},
render_field, render_resolution, render_resolution_simple, render_tuple_field,
+ render_type_inference,
type_alias::{render_type_alias, render_type_alias_with_eq},
union_literal::render_union_literal,
RenderContext,
@@ -374,3 +376,19 @@ fn enum_variants_with_paths(
}
}
}
+
+pub(crate) fn inferred_type(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
+ use TypeAnnotation::*;
+ let pat = match &ctx.completion_location {
+ Some(ImmediateLocation::TypeAnnotation(t)) => t,
+ _ => return None,
+ };
+ let x = match pat {
+ Let(pat) | FnParam(pat) => ctx.sema.type_of_pat(pat.as_ref()?),
+ Const(exp) | RetType(exp) => ctx.sema.type_of_expr(exp.as_ref()?),
+ }?
+ .adjusted();
+ let ty_string = x.display_source_code(ctx.db, ctx.module.into()).ok()?;
+ acc.add(render_type_inference(ty_string, ctx));
+ None
+}