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))
            });
        }