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);
}
}