ArchiMetrics.CodeReview.Rules.Semantic.HiddenTypeDependencyRule.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 Task<EvaluationResult> EvaluateImpl(SyntaxNode node, SemanticModel semanticModel, Solution solution)
		{
			var methodDeclaration = (MethodDeclarationSyntax)node;
			if (methodDeclaration.Body == null)
			{
				return Task.FromResult<EvaluationResult>(null);
			}

			var descendantNodes = methodDeclaration.Body.DescendantNodes().AsArray();
			var genericParameterTypes =
				descendantNodes.OfType<TypeArgumentListSyntax>()
					.SelectMany(x => x.Arguments.Select(y => semanticModel.GetSymbolInfo(y).Symbol));
			var symbolInfo = semanticModel.GetDeclaredSymbol(node);
			var containingType = symbolInfo.ContainingType;
			var fieldTypes = containingType.GetMembers()
				.OfType<IFieldSymbol>()
				.Select(x => x.Type)
				.AsArray();
			var usedTypes = genericParameterTypes.Concat(fieldTypes)
				.WhereNotNull()
				.DistinctBy(x => x.ToDisplayString());
			var parameterTypes =
				methodDeclaration.ParameterList.Parameters.Select(x => semanticModel.GetSymbolInfo(x.Type).Symbol)
					.Concat(new[] { semanticModel.GetSymbolInfo(methodDeclaration.ReturnType).Symbol })
					.WhereNotNull()
					.DistinctBy(x => x.ToDisplayString())
					.AsArray();

			var parameterAssemblies = parameterTypes.Select(x => x.ContainingAssembly).AsArray();

			var locals = usedTypes.Except(parameterTypes);
			if (locals.Any(x =>
				x.ContainingAssembly == null || 
				(!x.ContainingAssembly.Equals(semanticModel.Compilation.Assembly)
				&& !parameterAssemblies.Contains(x.ContainingAssembly) 
				&& !SystemAssemblyPrefixes.Any(y => x.ContainingAssembly.Name.StartsWith(y)))))
			{
				return Task.FromResult(
					new EvaluationResult
					{
						Snippet = node.ToFullString()
					});
			}

			return Task.FromResult((EvaluationResult)null);
		}
	}
HiddenTypeDependencyRule