protected override void Run(IInvocationExpression element, ElementProblemAnalyzerData data, IHighlightingConsumer consumer) { var methodIdentifier = element.GetSolution().GetComponent <IMoqMethodIdentifier>(); if (!methodIdentifier.IsMoqCallbackMethod(element)) { return; } var expectedTypeParameters = element.TypeArguments; if (expectedTypeParameters.Count == 0) { return; } var pointer = element.InvokedExpression; TreeNodeCollection <ICSharpArgument>?arguments = null; while (pointer != null && arguments == null && pointer.FirstChild is IInvocationExpression methodInvocation) { arguments = GetArguments(element.GetSolution(), methodInvocation); pointer = methodInvocation.InvokedExpression; } if (arguments == null) { return; } var actualTypesParameters = arguments.Value.Select(x => x.Value.Type()).ToArray(); var rule = element.GetPsiModule().GetTypeConversionRule(); if (actualTypesParameters.Length <= 0) { return; } if (expectedTypeParameters.Count != actualTypesParameters.Length) { AddWarning(element, consumer); } else { for (var i = 0; i < expectedTypeParameters.Count; i++) { var actualParameterType = actualTypesParameters[i]; var expectedParameterType = expectedTypeParameters[i]; if (!actualParameterType.Equals(expectedParameterType) && !actualParameterType.IsImplicitlyConvertibleTo(expectedParameterType, rule)) { AddWarning(element, consumer); } } } }