rust: a question mark operator is a conditional exit (#1113)

A question mark operator `?` may exit the current function the same way a `return`
will. It must be counted in the "nexits" statistics.
This commit is contained in:
Samuel Tardieu 2024-09-13 10:12:52 +02:00 коммит произвёл GitHub
Родитель e0a5c03a3e
Коммит b0350016d1
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
1 изменённых файлов: 18 добавлений и 1 удалений

Просмотреть файл

@ -156,7 +156,7 @@ impl Exit for TsxCode {
impl Exit for RustCode {
fn compute(node: &Node, stats: &mut Stats) {
if matches!(node.kind_id().into(), Rust::ReturnExpression)
if matches!(node.kind_id().into(), Rust::ReturnExpression | Rust::QMARK)
|| Self::is_func(node) && node.child_by_field_name("return_type").is_some()
{
stats.exit += 1;
@ -222,6 +222,23 @@ mod tests {
});
}
#[test]
fn rust_question_mark() {
check_metrics::<RustParser>("let _ = a? + b? + c?;", "foo.rs", |metric| {
// 0 functions
insta::assert_json_snapshot!(
metric.nexits,
@r###"
{
"sum": 3.0,
"average": null,
"min": 3.0,
"max": 3.0
}"###
);
});
}
#[test]
fn c_no_exit() {
check_metrics::<CppParser>("int a = 42;", "foo.c", |metric| {