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