@@ -375,7 +375,8 @@ impl ChangeClassifier {
375375 evidence,
376376 alternatives : Vec :: new ( ) ,
377377 complexity_score : target_signature
378- . map ( |s| s. complexity_metrics . cyclomatic_complexity as f64 )
378+ . and_then ( |s| s. complexity_metrics . as_ref ( ) )
379+ . map ( |m| m. cyclomatic_complexity as f64 )
379380 . unwrap_or ( 1.0 ) ,
380381 } ,
381382 secondary_types : Vec :: new ( ) ,
@@ -430,7 +431,8 @@ impl ChangeClassifier {
430431 evidence,
431432 alternatives : Vec :: new ( ) ,
432433 complexity_score : source_signature
433- . map ( |s| s. complexity_metrics . cyclomatic_complexity as f64 )
434+ . and_then ( |s| s. complexity_metrics . as_ref ( ) )
435+ . map ( |m| m. cyclomatic_complexity as f64 )
434436 . unwrap_or ( 1.0 ) ,
435437 } ,
436438 secondary_types : Vec :: new ( ) ,
@@ -588,8 +590,12 @@ impl ChangeClassifier {
588590 } ) ;
589591
590592 // Analyze complexity changes
591- let complexity_change = tgt_sig. complexity_metrics . cyclomatic_complexity as f64
592- - src_sig. complexity_metrics . cyclomatic_complexity as f64 ;
593+ let complexity_change = if let ( Some ( tgt_metrics) , Some ( src_metrics) ) =
594+ ( & tgt_sig. complexity_metrics , & src_sig. complexity_metrics ) {
595+ tgt_metrics. cyclomatic_complexity as f64 - src_metrics. cyclomatic_complexity as f64
596+ } else {
597+ 0.0
598+ } ;
593599
594600 if complexity_change. abs ( ) > 0.1 {
595601 characteristics. push ( ChangeCharacteristic {
@@ -780,15 +786,19 @@ impl ChangeClassifier {
780786 weight_sum += 0.1 ;
781787
782788 // Complexity similarity (weight: 0.2)
783- let complexity_sim = {
784- let c1 = sig1. complexity_metrics . cyclomatic_complexity as f64 ;
785- let c2 = sig2. complexity_metrics . cyclomatic_complexity as f64 ;
786- let max_complexity = c1. max ( c2) ;
787- if max_complexity == 0.0 {
788- 1.0
789- } else {
790- 1.0 - ( c1 - c2) . abs ( ) / max_complexity
789+ let complexity_sim = match ( & sig1. complexity_metrics , & sig2. complexity_metrics ) {
790+ ( Some ( m1) , Some ( m2) ) => {
791+ let c1 = m1. cyclomatic_complexity as f64 ;
792+ let c2 = m2. cyclomatic_complexity as f64 ;
793+ let max_complexity = c1. max ( c2) ;
794+ if max_complexity == 0.0 {
795+ 1.0
796+ } else {
797+ 1.0 - ( c1 - c2) . abs ( ) / max_complexity
798+ }
791799 }
800+ ( None , None ) => 1.0 ,
801+ _ => 0.5 , // One has metrics, other doesn't
792802 } ;
793803 total_score += complexity_sim * 0.2 ;
794804 weight_sum += 0.2 ;
0 commit comments