protected override EvaluationResult EvaluateImpl(SyntaxNode node)
{
var classDeclaration = (ClassDeclarationSyntax)node;
if (classDeclaration.BaseList != null && classDeclaration.BaseList.Types.Any(t => (t.Type is IdentifierNameSyntax) && ((IdentifierNameSyntax)t.Type).Identifier.ValueText.Contains("IDisposable")))
{
var methods = classDeclaration.ChildNodes().OfType<MethodDeclarationSyntax>()
.Where(m => m.Identifier.ValueText == "Dispose")
.Where(m =>
{
var predefinedType = SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.BoolKeyword));
return m.ParameterList.Parameters.Count == 0
|| (m.ParameterList.Parameters.Count == 1 && m.ParameterList.Parameters[0].Type.EquivalentTo(predefinedType));
}).AsArray();
var destructor = classDeclaration
.ChildNodes()
.OfType<DestructorDeclarationSyntax>()
.FirstOrDefault(d => d.Body.ChildNodes().Any(InvokesDispose));
if (methods.Length < 2 || destructor == null)
{
return new EvaluationResult
{
Snippet = node.ToFullString()
};
}
}
return null;
}