introduce completion presentation

This module should remove completion rendering boilerplate from the
"brains" of completion engine.
This commit is contained in:
Aleksey Kladov 2019-02-24 18:51:38 +03:00
parent 67528c4b39
commit d0a261468e
5 changed files with 42 additions and 33 deletions

View file

@ -55,7 +55,7 @@ pub use self::{
ids::{HirFileId, MacroCallId, MacroCallLoc, HirInterner},
macros::{MacroDef, MacroInput, MacroExpansion},
nameres::{ItemMap, PerNs, Namespace},
ty::Ty,
ty::{Ty, Substs},
impl_block::{ImplBlock, ImplItem},
docs::{Docs, Documentation},
adt::AdtDef,

View file

@ -1,5 +1,6 @@
mod completion_item;
mod completion_context;
mod presentation;
mod complete_dot;
mod complete_struct_literal;

View file

@ -1,7 +1,6 @@
use hir::{Ty, AdtDef, Docs};
use hir::{Ty, AdtDef};
use crate::completion::{CompletionContext, Completions, CompletionItem, CompletionItemKind};
use crate::completion::completion_item::CompletionKind;
use crate::completion::{CompletionContext, Completions, CompletionItem, CompletionItemKind, CompletionKind};
/// Complete dot accesses, i.e. fields or methods (currently only fields).
pub(super) fn complete_dot(acc: &mut Completions, ctx: &CompletionContext) {
@ -29,15 +28,7 @@ fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: Ty)
match def_id {
AdtDef::Struct(s) => {
for field in s.fields(ctx.db) {
CompletionItem::new(
CompletionKind::Reference,
ctx.source_range(),
field.name(ctx.db).to_string(),
)
.kind(CompletionItemKind::Field)
.detail(field.ty(ctx.db).subst(substs).to_string())
.set_documentation(field.docs(ctx.db))
.add_to(acc);
acc.add_field(CompletionKind::Reference, ctx, field, substs);
}
}
@ -47,14 +38,7 @@ fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: Ty)
}
Ty::Tuple(fields) => {
for (i, ty) in fields.iter().enumerate() {
CompletionItem::new(
CompletionKind::Reference,
ctx.source_range(),
i.to_string(),
)
.kind(CompletionItemKind::Field)
.detail(ty.to_string())
.add_to(acc);
acc.add_pos_field(CompletionKind::Reference, ctx, i, ty);
}
}
_ => {}

View file

@ -1,7 +1,6 @@
use hir::{Ty, AdtDef, Docs};
use hir::{Ty, AdtDef};
use crate::completion::{CompletionContext, Completions, CompletionItem, CompletionItemKind};
use crate::completion::completion_item::CompletionKind;
use crate::completion::{CompletionContext, Completions, CompletionKind};
/// Complete fields in fields literals.
pub(super) fn complete_struct_literal(acc: &mut Completions, ctx: &CompletionContext) {
@ -23,15 +22,7 @@ pub(super) fn complete_struct_literal(acc: &mut Completions, ctx: &CompletionCon
match adt {
AdtDef::Struct(s) => {
for field in s.fields(ctx.db) {
CompletionItem::new(
CompletionKind::Reference,
ctx.source_range(),
field.name(ctx.db).to_string(),
)
.kind(CompletionItemKind::Field)
.detail(field.ty(ctx.db).subst(substs).to_string())
.set_documentation(field.docs(ctx.db))
.add_to(acc);
acc.add_field(CompletionKind::Reference, ctx, field, substs);
}
}

View file

@ -0,0 +1,33 @@
//! This modules takes care of rendering various defenitions as completion items.
use hir::Docs;
use crate::completion::{Completions, CompletionKind, CompletionItemKind, CompletionContext, CompletionItem};
impl Completions {
pub(crate) fn add_field(
&mut self,
kind: CompletionKind,
ctx: &CompletionContext,
field: hir::StructField,
substs: &hir::Substs,
) {
CompletionItem::new(kind, ctx.source_range(), field.name(ctx.db).to_string())
.kind(CompletionItemKind::Field)
.detail(field.ty(ctx.db).subst(substs).to_string())
.set_documentation(field.docs(ctx.db))
.add_to(self);
}
pub(crate) fn add_pos_field(
&mut self,
kind: CompletionKind,
ctx: &CompletionContext,
field: usize,
ty: &hir::Ty,
) {
CompletionItem::new(kind, ctx.source_range(), field.to_string())
.kind(CompletionItemKind::Field)
.detail(ty.to_string())
.add_to(self);
}
}