SearchScope GetSearchScopeForMethod(IMethod method)
{
Type specialNodeType;
switch (method.Name) {
case "Add":
specialNodeType = typeof(ArrayInitializerExpression);
break;
case "Where":
specialNodeType = typeof(QueryWhereClause);
break;
case "Select":
specialNodeType = typeof(QuerySelectClause);
break;
case "SelectMany":
specialNodeType = typeof(QueryFromClause);
break;
case "Join":
case "GroupJoin":
specialNodeType = typeof(QueryJoinClause);
break;
case "OrderBy":
case "OrderByDescending":
case "ThenBy":
case "ThenByDescending":
specialNodeType = typeof(QueryOrdering);
break;
case "GroupBy":
specialNodeType = typeof(QueryGroupClause);
break;
case "Invoke":
if (method.DeclaringTypeDefinition != null && method.DeclaringTypeDefinition.Kind == TypeKind.Delegate)
specialNodeType = typeof(InvocationExpression);
else
specialNodeType = null;
break;
case "GetEnumerator":
case "MoveNext":
specialNodeType = typeof(ForeachStatement);
break;
case "GetAwaiter":
case "GetResult":
case "OnCompleted":
case "UnsafeOnCompleted":
specialNodeType = typeof(UnaryOperatorExpression);
break;
default:
specialNodeType = null;
break;
}
// Use searchTerm only if specialNodeType==null
string searchTerm = (specialNodeType == null) ? method.Name : null;
return new SearchScope(
searchTerm,
delegate (ICompilation compilation) {
IMethod imported = compilation.Import(method);
if (imported != null)
return new FindMethodReferences(imported, specialNodeType);
else
return null;
});
}