Skip to content

Commit 6181102

Browse files
committed
fix: use Semantics to judge whether a func is marked as #[test]
1 parent 1bd21e9 commit 6181102

File tree

1 file changed

+17
-36
lines changed

1 file changed

+17
-36
lines changed

crates/ide-db/src/search.rs

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@ use memchr::memmem::Finder;
1515
use nohash_hasher::IntMap;
1616
use once_cell::unsync::Lazy;
1717
use parser::SyntaxKind;
18-
use syntax::{
19-
ast::{self, HasAttrs as _},
20-
match_ast, AstNode, AstToken, SyntaxElement, TextRange, TextSize,
21-
};
18+
use syntax::{ast, match_ast, AstNode, AstToken, SyntaxElement, TextRange, TextSize};
2219
use triomphe::Arc;
2320

2421
use crate::{
@@ -747,7 +744,7 @@ impl<'a> FindUsages<'a> {
747744
let reference = FileReference {
748745
range,
749746
name: FileReferenceNode::NameRef(name_ref.clone()),
750-
category: ReferenceCategory::new(&def, name_ref),
747+
category: ReferenceCategory::new(self.sema, &def, name_ref),
751748
};
752749
sink(file_id, reference)
753750
}
@@ -763,7 +760,7 @@ impl<'a> FindUsages<'a> {
763760
let reference = FileReference {
764761
range,
765762
name: FileReferenceNode::NameRef(name_ref.clone()),
766-
category: ReferenceCategory::new(&def, name_ref),
763+
category: ReferenceCategory::new(self.sema, &def, name_ref),
767764
};
768765
sink(file_id, reference)
769766
}
@@ -773,7 +770,7 @@ impl<'a> FindUsages<'a> {
773770
let reference = FileReference {
774771
range,
775772
name: FileReferenceNode::NameRef(name_ref.clone()),
776-
category: ReferenceCategory::new(&def, name_ref),
773+
category: ReferenceCategory::new(self.sema, &def, name_ref),
777774
};
778775
sink(file_id, reference)
779776
} else {
@@ -787,10 +784,10 @@ impl<'a> FindUsages<'a> {
787784
let local = Definition::Local(local);
788785
let access = match self.def {
789786
Definition::Field(_) if field == self.def => {
790-
ReferenceCategory::new(&field, name_ref)
787+
ReferenceCategory::new(self.sema, &field, name_ref)
791788
}
792789
Definition::Local(_) if local == self.def => {
793-
ReferenceCategory::new(&local, name_ref)
790+
ReferenceCategory::new(self.sema, &local, name_ref)
794791
}
795792
_ => return false,
796793
};
@@ -875,8 +872,12 @@ fn def_to_ty(sema: &Semantics<'_, RootDatabase>, def: &Definition) -> Option<hir
875872
}
876873

877874
impl ReferenceCategory {
878-
fn new(def: &Definition, r: &ast::NameRef) -> Option<ReferenceCategory> {
879-
if is_name_ref_in_test(r) {
875+
fn new(
876+
sema: &Semantics<'_, RootDatabase>,
877+
def: &Definition,
878+
r: &ast::NameRef,
879+
) -> Option<ReferenceCategory> {
880+
if is_name_ref_in_test(sema, r) {
880881
return Some(ReferenceCategory::Test);
881882
}
882883

@@ -919,29 +920,9 @@ fn is_name_ref_in_import(name_ref: &ast::NameRef) -> bool {
919920
.map_or(false, |it| it.kind() == SyntaxKind::USE_TREE)
920921
}
921922

922-
fn is_name_ref_in_test(name_ref: &ast::NameRef) -> bool {
923-
let mode = name_ref.syntax().ancestors().find_map(|node| {
924-
match_ast! {
925-
match node {
926-
ast::Fn(f) => {
927-
let attrs = f.attrs();
928-
let mut is_test = false;
929-
for attr in attrs {
930-
if attr.to_string() == "#[test]" {
931-
is_test = true;
932-
break;
933-
}
934-
}
935-
if is_test {
936-
Some(ReferenceCategory::Test)
937-
}
938-
else {
939-
None
940-
}
941-
},
942-
_ => None
943-
}
944-
}
945-
});
946-
mode.is_some()
923+
fn is_name_ref_in_test(sema: &Semantics<'_, RootDatabase>, name_ref: &ast::NameRef) -> bool {
924+
name_ref.syntax().ancestors().any(|node| match ast::Fn::cast(node) {
925+
Some(it) => sema.to_def(&it).map_or(false, |func| func.is_test(sema.db)),
926+
None => false,
927+
})
947928
}

0 commit comments

Comments
 (0)