From 68dad00039521de9a9faae7b72e6b5ac0b0401e2 Mon Sep 17 00:00:00 2001 From: giovannitangredi Date: Thu, 2 Dec 2021 15:08:11 +0100 Subject: [PATCH 1/2] Add fields closures_sum and functions_sum , refactored code to be complaint with the changes --- src/metrics/nom.rs | 106 ++++++++++++++++++++++++++++----------------- src/spaces.rs | 5 ++- 2 files changed, 70 insertions(+), 41 deletions(-) diff --git a/src/metrics/nom.rs b/src/metrics/nom.rs index 13eb0a2fe..1b01bc6f3 100644 --- a/src/metrics/nom.rs +++ b/src/metrics/nom.rs @@ -7,20 +7,31 @@ use crate::checker::Checker; use crate::*; /// The `Nom` metric suite. -#[derive(Default, Clone, Debug)] +#[derive(Clone, Debug)] pub struct Stats { functions: usize, closures: usize, + functions_sum: usize, + closures_sum: usize, +} +impl Default for Stats { + fn default() -> Self { + Self { + functions: 0, + closures: 0, + functions_sum: 0, + closures_sum: 0, + } + } } - impl Serialize for Stats { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut st = serializer.serialize_struct("nom", 3)?; - st.serialize_field("functions", &self.functions())?; - st.serialize_field("closures", &self.closures())?; + st.serialize_field("functions", &self.functions_sum())?; + st.serialize_field("closures", &self.closures_sum())?; st.serialize_field("total", &self.total())?; st.end() } @@ -33,8 +44,8 @@ impl fmt::Display for Stats { "functions: {}, \ closures: {}, \ total: {}", - self.functions(), - self.closures(), + self.functions_sum(), + self.closures_sum(), self.total(), ) } @@ -43,8 +54,8 @@ impl fmt::Display for Stats { impl Stats { /// Merges a second `Nom` metric suite into the first one pub fn merge(&mut self, other: &Stats) { - self.functions += other.functions; - self.closures += other.closures; + self.functions_sum += other.functions_sum; + self.closures_sum += other.closures_sum; } /// Counts the number of function definitions in a scope @@ -60,11 +71,28 @@ impl Stats { self.closures as f64 } + /// Return the sum metric for functions + #[inline(always)] + pub fn functions_sum(&self) -> f64 { + // Only function definitions are considered, not general declarations + self.functions_sum as f64 + } + + /// Return the sum metric for closures + #[inline(always)] + pub fn closures_sum(&self) -> f64 { + self.closures_sum as f64 + } + /// Returns the total number of function definitions and /// closures in a scope #[inline(always)] pub fn total(&self) -> f64 { - self.functions() + self.closures() + self.functions_sum() + self.closures_sum() + } + pub fn compute_sum(&mut self) { + self.functions_sum += self.functions; + self.closures_sum += self.closures; } } @@ -115,8 +143,8 @@ mod tests { PythonParser, nom, [ - (functions, 3, usize), - (closures, 1, usize), + (functions_sum, 3, usize), + (closures_sum, 1, usize), (total, 4, usize) ] ); @@ -132,8 +160,8 @@ mod tests { RustParser, nom, [ - (functions, 2, usize), - (closures, 1, usize), + (functions_sum, 2, usize), + (closures_sum, 1, usize), (total, 3, usize) ] ); @@ -151,8 +179,8 @@ mod tests { CppParser, nom, [ - (functions, 1, usize), - (closures, 0, usize), + (functions_sum, 1, usize), + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -170,8 +198,8 @@ mod tests { CppParser, nom, [ - (functions, 2, usize), - (closures, 1, usize), + (functions_sum, 2, usize), + (closures_sum, 1, usize), (total, 3, usize) ] ); @@ -197,8 +225,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 3, usize), // f, foo, bar - (closures, 1, usize), // return function () + (functions_sum, 3, usize), // f, foo, bar + (closures_sum, 1, usize), // return function () (total, 4, usize) ] ); @@ -214,8 +242,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), // test_safe_mode - (closures, 0, usize), + (functions_sum, 1, usize), // test_safe_mode + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -229,8 +257,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), - (closures, 0, usize), + (functions_sum, 1, usize), + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -246,8 +274,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), - (closures, 0, usize), + (functions_sum, 1, usize), + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -263,8 +291,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), - (closures, 0, usize), + (functions_sum, 1, usize), + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -282,8 +310,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), - (closures, 0, usize), + (functions_sum, 1, usize), + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -301,8 +329,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 0, usize), - (closures, 2, usize), + (functions_sum, 0, usize), + (closures_sum, 2, usize), (total, 2, usize) ] ); @@ -318,8 +346,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), // add - (closures, 1, usize), // materials.map + (functions_sum, 1, usize), // add + (closures_sum, 1, usize), // materials.map (total, 2, usize) ] ); @@ -333,8 +361,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 1, usize), - (closures, 0, usize), + (functions_sum, 1, usize), + (closures_sum, 0, usize), (total, 1, usize) ] ); @@ -348,8 +376,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 0, usize), - (closures, 1, usize), + (functions_sum, 0, usize), + (closures_sum, 1, usize), (total, 1, usize) ] ); @@ -365,8 +393,8 @@ mod tests { JavascriptParser, nom, [ - (functions, 0, usize), - (closures, 1, usize), + (functions_sum, 0, usize), + (closures_sum, 1, usize), (total, 1, usize) ] ); diff --git a/src/spaces.rs b/src/spaces.rs index b6327cda5..c38206efb 100644 --- a/src/spaces.rs +++ b/src/spaces.rs @@ -181,8 +181,8 @@ fn compute_halstead_and_mi(state: &mut State) { #[inline(always)] fn compute_averages(state: &mut State) { - let nom_functions = state.space.metrics.nom.functions() as usize; - let nom_closures = state.space.metrics.nom.closures() as usize; + let nom_functions = state.space.metrics.nom.functions_sum() as usize; + let nom_closures = state.space.metrics.nom.closures_sum() as usize; let nom_total = state.space.metrics.nom.total() as usize; // Cognitive average state.space.metrics.cognitive.finalize(nom_total); @@ -201,6 +201,7 @@ fn compute_minmax(state: &mut State) { state.space.metrics.nexits.compute_minmax(); state.space.metrics.cognitive.compute_minmax(); state.space.metrics.nargs.compute_minmax(); + state.space.metrics.nom.compute_sum(); } fn finalize(state_stack: &mut Vec, diff_level: usize) { From aa44422edf1f0a43ff0e9e0e703357790040e03c Mon Sep 17 00:00:00 2001 From: giovannitangredi Date: Thu, 2 Dec 2021 18:03:12 +0100 Subject: [PATCH 2/2] Add minimum and maximum implementation for Nom metric --- rust-code-analysis-web/src/web/server.rs | 10 +- src/metrics/nom.rs | 148 ++++++++++++++++++++--- src/spaces.rs | 2 +- 3 files changed, 136 insertions(+), 24 deletions(-) diff --git a/rust-code-analysis-web/src/web/server.rs b/rust-code-analysis-web/src/web/server.rs index d5d90617b..ba902501e 100644 --- a/rust-code-analysis-web/src/web/server.rs +++ b/rust-code-analysis-web/src/web/server.rs @@ -650,7 +650,7 @@ mod tests { "n1": 2.0, "volume": 4.754_887_502_163_468}, "loc": {"cloc": 1.0, "ploc": 2.0, "lloc": 1.0, "sloc": 4.0, "blank": 1.0}, - "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0}, + "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0, "closures_min": 0.0, "closures_max": 0.0, "functions_min": 0.0, "functions_max": 1.0}, "mi": {"mi_original": 139.974_331_558_152_1, "mi_sei": 161.414_455_240_662_22, "mi_visual_studio": 81.856_334_244_533_39}}, @@ -677,7 +677,7 @@ mod tests { "n1": 2.0, "volume": 4.754_887_502_163_468}, "loc": {"cloc": 0.0, "ploc": 2.0, "lloc": 1.0, "sloc": 2.0, "blank": 0.0}, - "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0}, + "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0, "closures_min": 0.0, "closures_max": 0.0, "functions_min": 1.0, "functions_max": 1.0}, "mi": {"mi_original": 151.433_315_883_223_23, "mi_sei": 142.873_061_717_489_78, "mi_visual_studio": 88.557_494_668_551_6}}, @@ -730,7 +730,7 @@ mod tests { "n1": 2.0, "volume": 4.754_887_502_163_468}, "loc": {"cloc": 0.0, "ploc": 2.0, "lloc": 1.0, "sloc": 2.0, "blank": 0.0}, - "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0}, + "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0, "closures_min": 0.0, "closures_max": 0.0, "functions_min": 0.0, "functions_max": 1.0}, "mi": {"mi_original": 151.203_315_883_223_2, "mi_sei": 142.643_061_717_489_76, "mi_visual_studio": 88.422_991_744_574_97}}, @@ -779,7 +779,7 @@ mod tests { "n1": 2.0, "volume": 4.754_887_502_163_468}, "loc": {"cloc": 0.0, "ploc": 2.0, "lloc": 1.0, "sloc": 2.0, "blank": 0.0}, - "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0}, + "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0, "closures_min": 0.0, "closures_max": 0.0, "functions_min": 0.0, "functions_max": 1.0}, "mi": {"mi_original": 151.203_315_883_223_2, "mi_sei": 142.643_061_717_489_76, "mi_visual_studio": 88.422_991_744_574_97}}, @@ -806,7 +806,7 @@ mod tests { "n1": 2.0, "volume": 4.754_887_502_163_468}, "loc": {"cloc": 0.0, "ploc": 2.0, "lloc": 1.0, "sloc": 2.0, "blank": 0.0}, - "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0}, + "nom": {"functions": 1.0, "closures": 0.0, "total": 1.0, "closures_min": 0.0, "closures_max": 0.0, "functions_min": 1.0, "functions_max": 1.0}, "mi": {"mi_original": 151.433_315_883_223_23, "mi_sei": 142.873_061_717_489_78, "mi_visual_studio": 88.557_494_668_551_6}}, diff --git a/src/metrics/nom.rs b/src/metrics/nom.rs index 1b01bc6f3..7ee3628eb 100644 --- a/src/metrics/nom.rs +++ b/src/metrics/nom.rs @@ -13,6 +13,10 @@ pub struct Stats { closures: usize, functions_sum: usize, closures_sum: usize, + functions_min: usize, + functions_max: usize, + closures_min: usize, + closures_max: usize, } impl Default for Stats { fn default() -> Self { @@ -21,6 +25,10 @@ impl Default for Stats { closures: 0, functions_sum: 0, closures_sum: 0, + functions_min: usize::MAX, + functions_max: 0, + closures_min: usize::MAX, + closures_max: 0, } } } @@ -29,10 +37,14 @@ impl Serialize for Stats { where S: Serializer, { - let mut st = serializer.serialize_struct("nom", 3)?; + let mut st = serializer.serialize_struct("nom", 7)?; st.serialize_field("functions", &self.functions_sum())?; st.serialize_field("closures", &self.closures_sum())?; st.serialize_field("total", &self.total())?; + st.serialize_field("functions_min", &self.functions_min())?; + st.serialize_field("functions_max", &self.functions_max())?; + st.serialize_field("closures_min", &self.closures_min())?; + st.serialize_field("closures_max", &self.closures_max())?; st.end() } } @@ -43,10 +55,18 @@ impl fmt::Display for Stats { f, "functions: {}, \ closures: {}, \ - total: {}", + total: {} \ + functions_min: {} \ + functions_max: {} \ + closures_min: {} \ + closures_max: {}", self.functions_sum(), self.closures_sum(), self.total(), + self.functions_min(), + self.functions_max(), + self.closures_min(), + self.closures_max(), ) } } @@ -54,6 +74,10 @@ impl fmt::Display for Stats { impl Stats { /// Merges a second `Nom` metric suite into the first one pub fn merge(&mut self, other: &Stats) { + self.functions_min = self.functions_min.min(other.functions_min); + self.functions_max = self.functions_max.max(other.functions_max); + self.closures_min = self.closures_min.min(other.closures_min); + self.closures_max = self.closures_max.max(other.closures_max); self.functions_sum += other.functions_sum; self.closures_sum += other.closures_sum; } @@ -84,13 +108,41 @@ impl Stats { self.closures_sum as f64 } + /// Counts the number of function definitions in a scope + #[inline(always)] + pub fn functions_min(&self) -> f64 { + // Only function definitions are considered, not general declarations + self.functions_min as f64 + } + + /// Counts the number of closures in a scope + #[inline(always)] + pub fn closures_min(&self) -> f64 { + self.closures_min as f64 + } + /// Counts the number of function definitions in a scope + #[inline(always)] + pub fn functions_max(&self) -> f64 { + // Only function definitions are considered, not general declarations + self.functions_max as f64 + } + + /// Counts the number of closures in a scope + #[inline(always)] + pub fn closures_max(&self) -> f64 { + self.closures_max as f64 + } /// Returns the total number of function definitions and /// closures in a scope #[inline(always)] pub fn total(&self) -> f64 { self.functions_sum() + self.closures_sum() } - pub fn compute_sum(&mut self) { + pub fn compute_minmax(&mut self) { + self.functions_min = self.functions_min.min(self.functions); + self.functions_max = self.functions_max.max(self.functions); + self.closures_min = self.closures_min.min(self.closures); + self.closures_max = self.closures_max.max(self.closures); self.functions_sum += self.functions; self.closures_sum += self.closures; } @@ -145,7 +197,11 @@ mod tests { [ (functions_sum, 3, usize), (closures_sum, 1, usize), - (total, 4, usize) + (total, 4, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -162,7 +218,11 @@ mod tests { [ (functions_sum, 2, usize), (closures_sum, 1, usize), - (total, 3, usize) + (total, 3, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -181,7 +241,11 @@ mod tests { [ (functions_sum, 1, usize), (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -200,7 +264,11 @@ mod tests { [ (functions_sum, 2, usize), (closures_sum, 1, usize), - (total, 3, usize) + (total, 3, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -227,7 +295,11 @@ mod tests { [ (functions_sum, 3, usize), // f, foo, bar (closures_sum, 1, usize), // return function () - (total, 4, usize) + (total, 4, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -244,7 +316,11 @@ mod tests { [ (functions_sum, 1, usize), // test_safe_mode (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -259,7 +335,11 @@ mod tests { [ (functions_sum, 1, usize), (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -276,7 +356,11 @@ mod tests { [ (functions_sum, 1, usize), (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -293,7 +377,11 @@ mod tests { [ (functions_sum, 1, usize), (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -312,7 +400,11 @@ mod tests { [ (functions_sum, 1, usize), (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -331,7 +423,11 @@ mod tests { [ (functions_sum, 0, usize), (closures_sum, 2, usize), - (total, 2, usize) + (total, 2, usize), + (functions_max, 0, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -348,7 +444,11 @@ mod tests { [ (functions_sum, 1, usize), // add (closures_sum, 1, usize), // materials.map - (total, 2, usize) + (total, 2, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -363,7 +463,11 @@ mod tests { [ (functions_sum, 1, usize), (closures_sum, 0, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 1, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 0, usize), ] ); } @@ -378,7 +482,11 @@ mod tests { [ (functions_sum, 0, usize), (closures_sum, 1, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 0, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } @@ -395,7 +503,11 @@ mod tests { [ (functions_sum, 0, usize), (closures_sum, 1, usize), - (total, 1, usize) + (total, 1, usize), + (functions_max, 0, usize), + (functions_min, 0, usize), + (closures_min, 0, usize), + (closures_max, 1, usize), ] ); } diff --git a/src/spaces.rs b/src/spaces.rs index c38206efb..cb41dbca2 100644 --- a/src/spaces.rs +++ b/src/spaces.rs @@ -201,7 +201,7 @@ fn compute_minmax(state: &mut State) { state.space.metrics.nexits.compute_minmax(); state.space.metrics.cognitive.compute_minmax(); state.space.metrics.nargs.compute_minmax(); - state.space.metrics.nom.compute_sum(); + state.space.metrics.nom.compute_minmax(); } fn finalize(state_stack: &mut Vec, diff_level: usize) {