Skip to content

Commit 8d2ab31

Browse files
committed
Improve nargs metric
Counts closures and compute the average both for functions and closures respectively over the number of functions and closures
1 parent 4e31661 commit 8d2ab31

File tree

5 files changed

+30
-22
lines changed

5 files changed

+30
-22
lines changed

rust-code-analysis-web/src/web/server.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ mod tests {
633633
"end_line": 4,
634634
"metrics": {"cyclomatic": {"sum": 2.0, "average": 1.0},
635635
"cognitive": {"sum": 0.0, "average": 0.0},
636-
"nargs": {"sum": 0.0, "average": 0.0},
636+
"nargs": {"total_functions": 0.0, "average_functions": 0.0, "total_closures": 0.0, "average_closures": 0.0, "total": 0.0, "average": 0.0},
637637
"nexits": {"sum": 0.0, "average": 0.0},
638638
"halstead": {"bugs": 0.000_942_552_557_372_941_4,
639639
"difficulty": 1.0,
@@ -660,7 +660,7 @@ mod tests {
660660
"end_line": 4,
661661
"metrics": {"cyclomatic": {"sum": 1.0, "average": 1.0},
662662
"cognitive": {"sum": 0.0, "average": 0.0},
663-
"nargs": {"sum": 0.0, "average": 0.0},
663+
"nargs": {"total_functions": 0.0, "average_functions": 0.0, "total_closures": 0.0, "average_closures": 0.0, "total": 0.0, "average": 0.0},
664664
"nexits": {"sum": 0.0, "average": 0.0},
665665
"halstead": {"bugs": 0.000_942_552_557_372_941_4,
666666
"difficulty": 1.0,
@@ -713,7 +713,7 @@ mod tests {
713713
"end_line": 2,
714714
"metrics": {"cyclomatic": {"sum": 2.0, "average": 1.0},
715715
"cognitive": {"sum": 0.0, "average": 0.0},
716-
"nargs": {"sum": 0.0, "average": 0.0},
716+
"nargs": {"total_functions": 0.0, "average_functions": 0.0, "total_closures": 0.0, "average_closures": 0.0, "total": 0.0, "average": 0.0},
717717
"nexits": {"sum": 0.0, "average": 0.0},
718718
"halstead": {"bugs": 0.000_942_552_557_372_941_4,
719719
"difficulty": 1.0,
@@ -762,7 +762,7 @@ mod tests {
762762
"end_line": 2,
763763
"metrics": {"cyclomatic": {"sum": 2.0, "average": 1.0},
764764
"cognitive": {"sum": 0.0, "average": 0.0},
765-
"nargs": {"sum": 0.0, "average": 0.0},
765+
"nargs": {"total_functions": 0.0, "average_functions": 0.0, "total_closures": 0.0, "average_closures": 0.0, "total": 0.0, "average": 0.0},
766766
"nexits": {"sum": 0.0, "average": 0.0},
767767
"halstead": {"bugs": 0.000_942_552_557_372_941_4,
768768
"difficulty": 1.0,
@@ -789,7 +789,7 @@ mod tests {
789789
"end_line": 2,
790790
"metrics": {"cyclomatic": {"sum": 1.0, "average": 1.0},
791791
"cognitive": {"sum": 0.0, "average": 0.0},
792-
"nargs": {"sum": 0.0, "average": 0.0},
792+
"nargs": {"total_functions": 0.0, "average_functions": 0.0, "total_closures": 0.0, "average_closures": 0.0, "total": 0.0, "average": 0.0},
793793
"nexits": {"sum": 0.0, "average": 0.0},
794794
"halstead": {"bugs": 0.000_942_552_557_372_941_4,
795795
"difficulty": 1.0,

src/checker.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ impl Checker for MozjsCode {
207207
mk_checker!(is_comment, Comment);
208208
mk_checker!(is_string, String, TemplateString);
209209
mk_checker!(is_call, CallExpression);
210-
211210
mk_checker!(
212211
is_func_space,
213212
Program,
@@ -351,5 +350,5 @@ impl Checker for RustCode {
351350
TraitItem,
352351
ClosureExpression
353352
);
354-
mk_checker!(is_non_arg, LPAREN, COMMA, RPAREN, AttributeItem);
353+
mk_checker!(is_non_arg, LPAREN, COMMA, RPAREN, PIPE, AttributeItem);
355354
}

src/metrics/nargs.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ mod tests {
412412
#[test]
413413
fn javascript_single_closure() {
414414
check_metrics!(
415-
"var bar = function (a, b) {return a + b};",
415+
"function (a, b) {return a + b};",
416416
"foo.js",
417417
JavascriptParser,
418418
nargs,
@@ -713,26 +713,26 @@ mod tests {
713713
fn javascript_nested_functions() {
714714
check_metrics!(
715715
"function f(a, b) {
716-
function foo(a) {
716+
function foo(a, c) {
717717
return a;
718718
}
719719
var bar = function (a, b) {return a + b};
720-
var bar1 = function (a) {return a};
720+
function (a) {return a};
721721
return bar(foo(a), a);
722722
}",
723723
"foo.js",
724724
JavascriptParser,
725725
nargs,
726726
[
727-
(fn_args, 3, usize),
728-
(closure_args, 3, usize),
729-
(nargs_total, 6, usize)
727+
(fn_args, 6, usize),
728+
(closure_args, 1, usize),
729+
(nargs_total, 7, usize)
730730
],
731731
[
732-
(fn_args_average, 1.5),
733-
(closure_args_average, 1.5),
734-
(nargs_average, 1.5)
735-
] // 2 functions + 2 lambdas = 4
732+
(fn_args_average, 2.),
733+
(closure_args_average, 1.),
734+
(nargs_average, 1.75)
735+
] // 3 functions + 1 lambdas = 4
736736
);
737737
}
738738
}

src/output/dump_metrics.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,16 +260,19 @@ fn dump_nargs(
260260
last: bool,
261261
stdout: &mut StandardStreamLock,
262262
) -> std::io::Result<()> {
263-
let pref = if last { "`- " } else { "|- " };
263+
let (pref_child, pref) = if last { (" ", "`- ") } else { ("| ", "|- ") };
264264

265265
color!(stdout, Blue);
266266
write!(stdout, "{}{}", prefix, pref)?;
267267

268268
color!(stdout, Green, true);
269-
write!(stdout, "nargs: ")?;
269+
writeln!(stdout, "nargs")?;
270270

271-
color!(stdout, White);
272-
writeln!(stdout, "{}", stats.nargs())
271+
let prefix = format!("{}{}", prefix, pref_child);
272+
dump_value("functions", stats.fn_args(), &prefix, false, stdout)?;
273+
dump_value("closures", stats.closure_args(), &prefix, false, stdout)?;
274+
dump_value("total", stats.nargs_total(), &prefix, false, stdout)?;
275+
dump_value("average", stats.nargs_average(), &prefix, true, stdout)
273276
}
274277

275278
fn dump_nexits(

src/spaces.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,19 @@ fn compute_halstead_and_mi<T: ParserTrait>(state: &mut State) {
181181

182182
#[inline(always)]
183183
fn compute_averages(state: &mut State) {
184+
let nom_functions = state.space.metrics.nom.functions() as usize;
185+
let nom_closures = state.space.metrics.nom.closures() as usize;
184186
let nom_total = state.space.metrics.nom.total() as usize;
185187
// Cognitive average
186188
state.space.metrics.cognitive.finalize(nom_total);
187189
// Nexit average
188190
state.space.metrics.nexits.finalize(nom_total);
189191
// Nargs average
190-
state.space.metrics.nargs.finalize(nom_total);
192+
state
193+
.space
194+
.metrics
195+
.nargs
196+
.finalize(nom_functions, nom_closures);
191197
}
192198

193199
fn finalize<T: ParserTrait>(state_stack: &mut Vec<State>, diff_level: usize) {

0 commit comments

Comments
 (0)