private IEnumerable <MemberMetric> CalculateMemberMetrics(IEnumerable <MemberNode> nodes) { foreach (MemberNode memberNode in nodes) { SyntaxNode syntaxNode = memberNode.SyntaxNode; MemberMetricKind memberMetricKind = MemberMetricsCalculator.GetMemberMetricKind(memberNode); IHalsteadMetrics halsteadMetric = (new HalsteadAnalyzer()).Calculate(memberNode); if (halsteadMetric == null) { continue; } MemberMetric memberMetric = new MemberMetric() { Name = memberNode.DisplayName, CodeFile = memberNode.CodeFile, LineNumber = memberNode.LineNumber, Halstead = halsteadMetric, Kind = memberMetricKind }; MemberMetric memberMetric1 = memberMetric; foreach (Func <MemberNode, MetricResult> action in memberNodeActions) { memberMetric.AddMetricResult(action(memberNode)); } foreach (Func <SyntaxNode, MetricResult> action in syntaxNodeActions) { memberMetric.AddMetricResult(action(syntaxNode)); } memberMetric.AddMetricResult(CalculateMaintainablityIndex(halsteadMetric, memberMetric)); //memberMetric.AddMetricResult(CalculateNumberOfDeliveredBugs(halsteadMetric)); yield return(memberMetric); } }
private MetricResult CalculateMaintainablityIndex(IHalsteadMetrics halsteadMetrics, MemberMetric metric) { double linesOfCode = metric.GetMetricsByName(MetricNames.LinesOfCode).Value.Value; double cyclomatic = metric.GetMetricsByName(MetricNames.CyclomaticComplexity).Value.Value; double num1 = 1; if (linesOfCode == 0) { num1 = 100; } else { double?volume = halsteadMetrics.GetVolume(); double num = 1; if (volume.HasValue) { num = Math.Log(volume.Value); } num1 = (171 - 5.2 * num - 0.23 * cyclomatic - 16.2 * Math.Log(linesOfCode)) * 100 / 171; } return(new MetricResult { Name = MetricNames.MaintainabilityIndex, Value = Math.Round(Math.Max(0, num1)) }); }