Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit c1f6f13

Browse files
committed
Remove code duplication
1 parent 02b401b commit c1f6f13

File tree

1 file changed

+10
-89
lines changed

1 file changed

+10
-89
lines changed

crates/ide_completion/src/render.rs

Lines changed: 10 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -177,103 +177,24 @@ fn render_resolution_(
177177
let _p = profile::span("render_resolution");
178178
use hir::ModuleDef::*;
179179

180-
let db = ctx.db();
181-
let ctx = ctx.import_to_add(import_to_add);
182-
let kind = match resolution {
180+
match resolution {
181+
ScopeDef::ModuleDef(Macro(mac)) => {
182+
let ctx = ctx.import_to_add(import_to_add);
183+
return render_macro(ctx, local_name, mac);
184+
}
183185
ScopeDef::ModuleDef(Function(func)) => {
186+
let ctx = ctx.import_to_add(import_to_add);
184187
return render_fn(ctx, Some(local_name), func);
185188
}
186189
ScopeDef::ModuleDef(Variant(var)) if ctx.completion.pattern_ctx.is_none() => {
187-
if let Some(item) = render_variant_lit(ctx.clone(), Some(local_name.clone()), var, None)
188-
{
190+
let ctx = ctx.clone().import_to_add(import_to_add.clone());
191+
if let Some(item) = render_variant_lit(ctx, Some(local_name.clone()), var, None) {
189192
return item;
190193
}
191-
CompletionItemKind::SymbolKind(SymbolKind::Variant)
192-
}
193-
ScopeDef::ModuleDef(Macro(mac)) => return render_macro(ctx, local_name, mac),
194-
ScopeDef::Unknown => {
195-
let mut item = CompletionItem::new(
196-
CompletionItemKind::UnresolvedReference,
197-
ctx.source_range(),
198-
local_name.to_smol_str(),
199-
);
200-
if let Some(import_to_add) = ctx.import_to_add {
201-
item.add_import(import_to_add);
202-
}
203-
return item.build();
204-
}
205-
206-
ScopeDef::ModuleDef(Variant(_)) => CompletionItemKind::SymbolKind(SymbolKind::Variant),
207-
ScopeDef::ModuleDef(Module(..)) => CompletionItemKind::SymbolKind(SymbolKind::Module),
208-
ScopeDef::ModuleDef(Adt(adt)) => CompletionItemKind::SymbolKind(match adt {
209-
hir::Adt::Struct(_) => SymbolKind::Struct,
210-
hir::Adt::Union(_) => SymbolKind::Union,
211-
hir::Adt::Enum(_) => SymbolKind::Enum,
212-
}),
213-
ScopeDef::ModuleDef(Const(..)) => CompletionItemKind::SymbolKind(SymbolKind::Const),
214-
ScopeDef::ModuleDef(Static(..)) => CompletionItemKind::SymbolKind(SymbolKind::Static),
215-
ScopeDef::ModuleDef(Trait(..)) => CompletionItemKind::SymbolKind(SymbolKind::Trait),
216-
ScopeDef::ModuleDef(TypeAlias(..)) => CompletionItemKind::SymbolKind(SymbolKind::TypeAlias),
217-
ScopeDef::ModuleDef(BuiltinType(..)) => CompletionItemKind::BuiltinType,
218-
ScopeDef::GenericParam(param) => CompletionItemKind::SymbolKind(match param {
219-
hir::GenericParam::TypeParam(_) => SymbolKind::TypeParam,
220-
hir::GenericParam::ConstParam(_) => SymbolKind::ConstParam,
221-
hir::GenericParam::LifetimeParam(_) => SymbolKind::LifetimeParam,
222-
}),
223-
ScopeDef::Local(..) => CompletionItemKind::SymbolKind(SymbolKind::Local),
224-
ScopeDef::Label(..) => CompletionItemKind::SymbolKind(SymbolKind::Label),
225-
ScopeDef::AdtSelfType(..) | ScopeDef::ImplSelfType(..) => {
226-
CompletionItemKind::SymbolKind(SymbolKind::SelfParam)
227-
}
228-
};
229-
230-
let local_name = local_name.to_smol_str();
231-
let mut item = CompletionItem::new(kind, ctx.source_range(), local_name.clone());
232-
if let ScopeDef::Local(local) = resolution {
233-
let ty = local.ty(db);
234-
if !ty.is_unknown() {
235-
item.detail(ty.display(db).to_string());
236-
}
237-
238-
item.set_relevance(CompletionRelevance {
239-
type_match: compute_type_match(ctx.completion, &ty),
240-
exact_name_match: compute_exact_name_match(ctx.completion, &local_name),
241-
is_local: true,
242-
..CompletionRelevance::default()
243-
});
244-
245-
if let Some(ref_match) = compute_ref_match(ctx.completion, &ty) {
246-
item.ref_match(ref_match);
247-
}
248-
};
249-
250-
// Add `<>` for generic types
251-
let type_path_no_ty_args = matches!(
252-
ctx.completion.path_context,
253-
Some(PathCompletionCtx { kind: Some(PathKind::Type), has_type_args: false, .. })
254-
) && ctx.completion.config.add_call_parenthesis;
255-
if type_path_no_ty_args {
256-
if let Some(cap) = ctx.snippet_cap() {
257-
let has_non_default_type_params = match resolution {
258-
ScopeDef::ModuleDef(Adt(it)) => it.has_non_default_type_params(db),
259-
ScopeDef::ModuleDef(TypeAlias(it)) => it.has_non_default_type_params(db),
260-
_ => false,
261-
};
262-
if has_non_default_type_params {
263-
cov_mark::hit!(inserts_angle_brackets_for_generics);
264-
item.lookup_by(local_name.clone())
265-
.label(SmolStr::from_iter([&local_name, "<…>"]))
266-
.insert_snippet(cap, format!("{}<$0>", local_name));
267-
}
268194
}
195+
_ => (),
269196
}
270-
item.set_documentation(scope_def_docs(db, resolution))
271-
.set_deprecated(scope_def_is_deprecated(&ctx, resolution));
272-
273-
if let Some(import_to_add) = ctx.import_to_add {
274-
item.add_import(import_to_add);
275-
}
276-
item.build()
197+
render_resolution_simple_(ctx, local_name, import_to_add, resolution)
277198
}
278199

279200
fn render_resolution_simple_(

0 commit comments

Comments
 (0)