ArchiMetrics.CodeReview.Rules.Semantic.LackOfCohesionOfMethodsRule.EvaluateImpl C# (CSharp) Method

EvaluateImpl() protected method

protected EvaluateImpl ( Microsoft.CodeAnalysis.SyntaxNode node, Microsoft.CodeAnalysis.SemanticModel semanticModel, Microsoft.CodeAnalysis.Solution solution ) : Task
node Microsoft.CodeAnalysis.SyntaxNode
semanticModel Microsoft.CodeAnalysis.SemanticModel
solution Microsoft.CodeAnalysis.Solution
return Task
		protected override async Task<EvaluationResult> EvaluateImpl(SyntaxNode node, SemanticModel semanticModel, Solution solution)
		{
			var classDeclaration = (ClassDeclarationSyntax)node;
			var symbol = (ITypeSymbol)ModelExtensions.GetDeclaredSymbol(semanticModel, classDeclaration);
			var members = symbol.GetMembers();

			var memberCount = members.Count(x => MemberKinds.Contains(x.Kind));
			if (memberCount < _threshold)
			{
				return null;
			}

			var fields = members.Where(x => x.Kind == SymbolKind.Field).AsArray();
			var fieldCount = fields.Length;

			if (fieldCount < _threshold)
			{
				return null;
			}

			var references = await Task.WhenAll(fields.Select(solution.FindReferences)).ConfigureAwait(false);
			var sumFieldUsage = (double)references.Sum(r => r.Locations.Count());

			var lcomhs = (memberCount - (sumFieldUsage / fieldCount)) / (memberCount - 1);
			if (lcomhs < 1)
			{
				return null;
			}

			var snippet = node.ToFullString();
			return new EvaluationResult
				   {
					   Snippet = snippet
				   };
		}
	}
LackOfCohesionOfMethodsRule