From db0df32ad67c46091ed92d77d9d0cf5802193212 Mon Sep 17 00:00:00 2001 From: Giovanni Bassi Date: Tue, 9 Aug 2016 01:23:50 -0300 Subject: [PATCH] Enable fields to be disposed when using member access expression Fixes #795 --- .../DisposableFieldNotDisposedAnalyzer.cs | 1 - .../Usage/DisposableFieldNotDisposedTests.cs | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/CSharp/CodeCracker/Usage/DisposableFieldNotDisposedAnalyzer.cs b/src/CSharp/CodeCracker/Usage/DisposableFieldNotDisposedAnalyzer.cs index e38d7959d..2e625e04d 100644 --- a/src/CSharp/CodeCracker/Usage/DisposableFieldNotDisposedAnalyzer.cs +++ b/src/CSharp/CodeCracker/Usage/DisposableFieldNotDisposedAnalyzer.cs @@ -96,7 +96,6 @@ private static bool CallsDisposeOnField(IFieldSymbol fieldSymbol, MethodDeclarat var memberAccess = (MemberAccessExpressionSyntax)invocation.Expression; if (memberAccess?.Name == null) return false; if (memberAccess.Name.Identifier.ToString() != "Dispose" || memberAccess.Name.Arity != 0) return false; - if (!memberAccess.Expression.IsKind(SyntaxKind.IdentifierName)) return false; return fieldSymbol.Equals(semanticModel.GetSymbolInfo(memberAccess.Expression).Symbol); }); return hasDisposeCall; diff --git a/test/CSharp/CodeCracker.Test/Usage/DisposableFieldNotDisposedTests.cs b/test/CSharp/CodeCracker.Test/Usage/DisposableFieldNotDisposedTests.cs index 123a05cb5..ba84e4bc6 100644 --- a/test/CSharp/CodeCracker.Test/Usage/DisposableFieldNotDisposedTests.cs +++ b/test/CSharp/CodeCracker.Test/Usage/DisposableFieldNotDisposedTests.cs @@ -210,6 +210,30 @@ public void Dispose() { } await VerifyCSharpHasNoDiagnosticsAsync(source); } + [Fact] + public async Task WhenAFieldThatImplementsIDisposableIsDisposedWithThisDoesNotCreateDiagnostic() + { + const string source = @" + using System; + namespace ConsoleApplication1 + { + class TypeName : IDisposable + { + private D field = D.Create(); + public void Dispose() + { + this.field.Dispose(); + } + } + class D : IDisposable + { + public static D Create() => new D(); + public void Dispose() { } + } + }"; + await VerifyCSharpHasNoDiagnosticsAsync(source); + } + [Fact] public async Task WhenAFieldThatImplementsIDisposableIsDisposedThroughImplicitImplementationDoesNotCreateDiagnostic() {