예제 #1
0
        public async Task <ITypeMetric> CalculateFrom(TypeDeclarationSyntaxInfo typeNode, IEnumerable <IMemberMetric> metrics)
        {
            var memberMetrics = metrics.AsArray();
            var type          = typeNode.Syntax;
            var symbol        = Model.GetDeclaredSymbol(type);
            var documentation = await _documentationFactory.Create(symbol, CancellationToken.None);

            var metricKind           = GetMetricKind(type);
            var source               = CalculateClassCoupling(type, memberMetrics);
            var depthOfInheritance   = CalculateDepthOfInheritance(type);
            var cyclomaticComplexity = memberMetrics.Sum(x => x.CyclomaticComplexity);
            var linesOfCode          = memberMetrics.Sum(x => x.LinesOfCode);
            var maintainabilityIndex = CalculateAveMaintainabilityIndex(memberMetrics);
            var afferentCoupling     = await CalculateAfferentCoupling(type);

            var efferentCoupling = GetEfferentCoupling(type, symbol);
            var instability      = (double)efferentCoupling / (efferentCoupling + afferentCoupling);
            var modifier         = GetAccessModifier(type.Modifiers);

            return(new TypeMetric(
                       symbol.IsAbstract,
                       metricKind,
                       modifier,
                       memberMetrics,
                       linesOfCode,
                       cyclomaticComplexity,
                       maintainabilityIndex,
                       depthOfInheritance,
                       source,
                       type.GetName(),
                       afferentCoupling,
                       efferentCoupling,
                       instability,
                       documentation));
        }
예제 #2
0
        private async Task <IMemberMetric> CalculateMemberMetric(SyntaxNode syntaxNode)
        {
            var analyzer               = new HalsteadAnalyzer();
            var halsteadMetrics        = analyzer.Calculate(syntaxNode);
            var memberName             = _nameResolver.TryResolveMemberSignatureString(syntaxNode);
            var source                 = CalculateClassCoupling(syntaxNode);
            var complexity             = CalculateCyclomaticComplexity(syntaxNode);
            var linesOfCode            = CalculateLinesOfCode(syntaxNode);
            var sourceLinesOfCode      = CalculateSourceLinesOfCode(syntaxNode);
            var numberOfParameters     = CalculateNumberOfParameters(syntaxNode);
            var numberOfLocalVariables = CalculateNumberOfLocalVariables(syntaxNode);
            var maintainabilityIndex   = CalculateMaintainablityIndex(complexity, linesOfCode, halsteadMetrics);
            var afferentCoupling       = await CalculateAfferentCoupling(syntaxNode).ConfigureAwait(false);

            var location   = syntaxNode.GetLocation();
            var lineNumber = location.GetLineSpan().StartLinePosition.Line;
            var filePath   = location.SourceTree == null ? string.Empty : location.SourceTree.FilePath;

            filePath = filePath.GetPathRelativeTo(_rootFolder);
            var accessModifier = GetAccessModifier(syntaxNode);
            IMemberDocumentation documentation = null;

            if (syntaxNode.SyntaxTree == Model.SyntaxTree)
            {
                var symbol = Model.GetDeclaredSymbol(syntaxNode);
                documentation = await _documentationFactory.Create(symbol, CancellationToken.None);
            }

            return(new MemberMetric(filePath,
                                    accessModifier,
                                    halsteadMetrics,
                                    lineNumber,
                                    linesOfCode,
                                    sourceLinesOfCode,
                                    maintainabilityIndex,
                                    complexity,
                                    memberName,
                                    source.AsArray(),
                                    numberOfParameters,
                                    numberOfLocalVariables,
                                    afferentCoupling,
                                    documentation));
        }