mod chains;
mod common;
mod cpp;
mod exact;
mod file_path;
mod function_ref;
mod fuzzy;
mod method_call;
mod typed;
use crate::resolution::types::{ResolutionContext, ResolvedRef, UnresolvedRef};
use crate::types::{Language, ReferenceKind};
pub use chains::{match_dotted_call_chain, match_scoped_call_chain};
pub use common::{crosses_known_family, is_known_language_family, same_language_family};
pub use cpp::match_cpp_call_chain;
pub use exact::{match_by_exact_name, match_by_qualified_name};
pub use file_path::match_by_file_path;
pub use function_ref::match_function_ref;
pub use fuzzy::match_fuzzy;
pub use method_call::match_method_call;
pub fn match_reference(
reference: &UnresolvedRef,
context: &mut dyn ResolutionContext,
) -> Option<ResolvedRef> {
if reference.reference_kind == ReferenceKind::FunctionRef {
return match_function_ref(reference, context);
}
match_by_file_path(reference, context)
.or_else(|| match_by_qualified_name(reference, context))
.or_else(|| {
matches!(reference.language, Language::Cpp | Language::C)
.then(|| match_cpp_call_chain(reference, context))
.flatten()
})
.or_else(|| {
matches!(reference.language, Language::Php | Language::Rust)
.then(|| match_scoped_call_chain(reference, context))
.flatten()
})
.or_else(|| {
matches!(
reference.language,
Language::Java
| Language::Kotlin
| Language::CSharp
| Language::Swift
| Language::Go
| Language::Scala
| Language::Dart
| Language::ObjC
| Language::Pascal
)
.then(|| match_dotted_call_chain(reference, context))
.flatten()
})
.or_else(|| match_method_call(reference, context))
.or_else(|| match_by_exact_name(reference, context))
.or_else(|| match_fuzzy(reference, context))
}