in resharper/resharper-unity/src/Unity/Utils/UnityComponentRelatedExpressionFinder.cs [46:142]
private IEnumerable<IReferenceExpression> GetRelatedExpressionsInner([NotNull] ITreeNode scope, [CanBeNull] ITreeNode from = null)
{
var descendants = scope.ThisAndDescendants();
while (descendants.MoveNext())
{
var current = descendants.Current;
if (current == from)
isFound = true;
switch (current)
{
case ICSharpClosure _:
descendants.SkipThisNode();
break;
case IInvocationExpression invocationExpression:
descendants.SkipThisNode();
var argumentList = invocationExpression.ArgumentList;
if (argumentList != null)
{
foreach (var re in GetRelatedExpressionsInner(argumentList, from))
{
if (isFound)
yield return re;
}
}
var invokedExpression = invocationExpression.InvokedExpression;
foreach (var re in GetRelatedExpressionsInner(invokedExpression, from))
{
if (isFound)
yield return re;
}
continue;
case IAssignmentExpression assignmentExpression:
descendants.SkipThisNode();
var source = assignmentExpression.Source;
if (source != null)
{
foreach (var re in GetRelatedExpressionsInner(source, from))
{
if (isFound)
yield return re;
}
}
var dest = assignmentExpression.Dest;
if (dest != null)
{
foreach (var re in GetRelatedExpressionsInner(dest, from))
{
if (isFound)
yield return re;
}
}
continue;
case IReferenceExpression referenceExpression:
var currentNodeDeclaredElement = referenceExpression.Reference.Resolve().DeclaredElement as IClrDeclaredElement;
var currentNodeContainingType = currentNodeDeclaredElement?.GetContainingType();
switch (currentNodeDeclaredElement)
{
case IField _:
case IProperty _:
var qualifier = referenceExpression.QualifierExpression as IReferenceExpression;
if (!ReComparer.Equals(ComponentReferenceExpression, qualifier))
continue;
if (currentNodeContainingType == null)
continue;
if (!ContainingType.Equals(currentNodeContainingType))
continue;
break;
case IMethod method:
if (currentNodeContainingType == null ||
!ContainingType.Equals(currentNodeContainingType))
{
if (!myIgnoreNotComponentInvocations && isFound)
{
yield return referenceExpression;
}
continue;
}
break;
default:
continue;
}
if (isFound && !IsReferenceExpressionNotRelated(referenceExpression, currentNodeDeclaredElement, currentNodeContainingType) )
yield return referenceExpression;
break;
}
}
}