Skip to content

Commit e7244e8

Browse files
bors[bot]Veykril
andauthored
Merge #10739
10739: internal: Simplify r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <[email protected]>
2 parents b2bce38 + dea9730 commit e7244e8

File tree

3 files changed

+33
-26
lines changed

3 files changed

+33
-26
lines changed

crates/hir/src/semantics.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -897,13 +897,13 @@ impl<'db> SemanticsImpl<'db> {
897897
}
898898

899899
fn scope(&self, node: &SyntaxNode) -> SemanticsScope<'db> {
900-
let sa = self.analyze(node);
901-
SemanticsScope { db: self.db, file_id: sa.file_id, resolver: sa.resolver }
900+
let SourceAnalyzer { file_id, resolver, .. } = self.analyze(node);
901+
SemanticsScope { db: self.db, file_id, resolver }
902902
}
903903

904904
fn scope_at_offset(&self, node: &SyntaxNode, offset: TextSize) -> SemanticsScope<'db> {
905-
let sa = self.analyze_with_offset(node, offset);
906-
SemanticsScope { db: self.db, file_id: sa.file_id, resolver: sa.resolver }
905+
let SourceAnalyzer { file_id, resolver, .. } = self.analyze_with_offset(node, offset);
906+
SemanticsScope { db: self.db, file_id, resolver }
907907
}
908908

909909
fn scope_for_def(&self, def: Trait) -> SemanticsScope<'db> {
@@ -924,9 +924,11 @@ impl<'db> SemanticsImpl<'db> {
924924
fn analyze(&self, node: &SyntaxNode) -> SourceAnalyzer {
925925
self.analyze_impl(node, None)
926926
}
927+
927928
fn analyze_with_offset(&self, node: &SyntaxNode, offset: TextSize) -> SourceAnalyzer {
928929
self.analyze_impl(node, Some(offset))
929930
}
931+
930932
fn analyze_impl(&self, node: &SyntaxNode, offset: Option<TextSize>) -> SourceAnalyzer {
931933
let _p = profile::span("Semantics::analyze_impl");
932934
let node = self.find_file(node.clone());

crates/hir_ty/src/method_resolution.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use hir_def::{
1313
};
1414
use hir_expand::name::Name;
1515
use rustc_hash::{FxHashMap, FxHashSet};
16+
use stdx::never;
1617

1718
use crate::{
1819
autoderef,
@@ -334,7 +335,7 @@ pub fn def_crates(
334335
}};
335336
}
336337

337-
let mod_to_crate_ids = |module: ModuleId| Some(std::iter::once(module.krate()).collect());
338+
let mod_to_crate_ids = |module: ModuleId| Some(iter::once(module.krate()).collect());
338339

339340
let lang_item_targets = match ty.kind(&Interner) {
340341
TyKind::Adt(AdtId(def_id), _) => {
@@ -533,9 +534,16 @@ fn iterate_method_candidates_with_autoref(
533534
name: Option<&Name>,
534535
mut callback: &mut dyn FnMut(&Canonical<Ty>, AssocItemId) -> ControlFlow<()>,
535536
) -> ControlFlow<()> {
537+
let (receiver_ty, rest) = match deref_chain.split_first() {
538+
Some((rec, rest)) => (rec.clone(), rest),
539+
None => {
540+
never!("received empty deref-chain");
541+
return ControlFlow::Break(());
542+
}
543+
};
536544
iterate_method_candidates_by_receiver(
537-
&deref_chain[0],
538-
&deref_chain[1..],
545+
&receiver_ty,
546+
&rest,
539547
db,
540548
env.clone(),
541549
krate,
@@ -546,8 +554,8 @@ fn iterate_method_candidates_with_autoref(
546554
)?;
547555

548556
let refed = Canonical {
549-
binders: deref_chain[0].binders.clone(),
550-
value: TyKind::Ref(Mutability::Not, static_lifetime(), deref_chain[0].value.clone())
557+
binders: receiver_ty.binders.clone(),
558+
value: TyKind::Ref(Mutability::Not, static_lifetime(), receiver_ty.value.clone())
551559
.intern(&Interner),
552560
};
553561

@@ -564,9 +572,8 @@ fn iterate_method_candidates_with_autoref(
564572
)?;
565573

566574
let ref_muted = Canonical {
567-
binders: deref_chain[0].binders.clone(),
568-
value: TyKind::Ref(Mutability::Mut, static_lifetime(), deref_chain[0].value.clone())
569-
.intern(&Interner),
575+
binders: receiver_ty.binders,
576+
value: TyKind::Ref(Mutability::Mut, static_lifetime(), receiver_ty.value).intern(&Interner),
570577
};
571578

572579
iterate_method_candidates_by_receiver(
@@ -596,7 +603,7 @@ fn iterate_method_candidates_by_receiver(
596603
// We're looking for methods with *receiver* type receiver_ty. These could
597604
// be found in any of the derefs of receiver_ty, so we have to go through
598605
// that.
599-
for self_ty in std::iter::once(receiver_ty).chain(rest_of_deref_chain) {
606+
for self_ty in iter::once(receiver_ty).chain(rest_of_deref_chain) {
600607
iterate_inherent_methods(
601608
self_ty,
602609
db,
@@ -609,7 +616,7 @@ fn iterate_method_candidates_by_receiver(
609616
)?
610617
}
611618

612-
for self_ty in std::iter::once(receiver_ty).chain(rest_of_deref_chain) {
619+
for self_ty in iter::once(receiver_ty).chain(rest_of_deref_chain) {
613620
iterate_trait_method_candidates(
614621
self_ty,
615622
db,
@@ -671,8 +678,7 @@ fn iterate_trait_method_candidates(
671678
}
672679
_ => Vec::new(),
673680
};
674-
let traits =
675-
inherent_trait.chain(env_traits.into_iter()).chain(traits_in_scope.iter().copied());
681+
let traits = inherent_trait.chain(env_traits).chain(traits_in_scope.iter().copied());
676682

677683
'traits: for t in traits {
678684
let data = db.trait_data(t);
@@ -800,7 +806,7 @@ fn iterate_inherent_methods(
800806
) -> ControlFlow<()> {
801807
let impls_for_self_ty = filter_inherent_impls_for_self_ty(impls, &self_ty.value);
802808
for &impl_def in impls_for_self_ty {
803-
for &item in db.impl_data(impl_def).items.iter() {
809+
for &item in &db.impl_data(impl_def).items {
804810
if !is_valid_candidate(
805811
db,
806812
env.clone(),

crates/ide_completion/src/context.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -350,29 +350,28 @@ impl<'a> CompletionContext<'a> {
350350
impl<'a> CompletionContext<'a> {
351351
pub(super) fn new(
352352
db: &'a RootDatabase,
353-
position: FilePosition,
353+
position @ FilePosition { file_id, offset }: FilePosition,
354354
config: &'a CompletionConfig,
355355
) -> Option<CompletionContext<'a>> {
356356
let _p = profile::span("CompletionContext::new");
357357
let sema = Semantics::new(db);
358358

359-
let original_file = sema.parse(position.file_id);
359+
let original_file = sema.parse(file_id);
360360

361361
// Insert a fake ident to get a valid parse tree. We will use this file
362362
// to determine context, though the original_file will be used for
363363
// actual completion.
364364
let file_with_fake_ident = {
365-
let parse = db.parse(position.file_id);
366-
let edit = Indel::insert(position.offset, "intellijRulezz".to_string());
365+
let parse = db.parse(file_id);
366+
let edit = Indel::insert(offset, "intellijRulezz".to_string());
367367
parse.reparse(&edit).tree()
368368
};
369369
let fake_ident_token =
370-
file_with_fake_ident.syntax().token_at_offset(position.offset).right_biased().unwrap();
370+
file_with_fake_ident.syntax().token_at_offset(offset).right_biased().unwrap();
371371

372-
let original_token =
373-
original_file.syntax().token_at_offset(position.offset).left_biased()?;
372+
let original_token = original_file.syntax().token_at_offset(offset).left_biased()?;
374373
let token = sema.descend_into_macros_single(original_token.clone());
375-
let scope = sema.scope_at_offset(&token, position.offset);
374+
let scope = sema.scope_at_offset(&token, offset);
376375
let krate = scope.krate();
377376
let mut locals = vec![];
378377
scope.process_all_names(&mut |name, scope| {
@@ -408,7 +407,7 @@ impl<'a> CompletionContext<'a> {
408407
ctx.expand_and_fill(
409408
original_file.syntax().clone(),
410409
file_with_fake_ident.syntax().clone(),
411-
position.offset,
410+
offset,
412411
fake_ident_token,
413412
);
414413
Some(ctx)

0 commit comments

Comments
 (0)