Skip to content

Commit

Permalink
Add test and make it pass
Browse files Browse the repository at this point in the history
  • Loading branch information
louis-z committed Mar 9, 2023
1 parent c6352bf commit b8351d8
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ static void AnalyzeOperation(OperationAnalysisContext context, IMethodSymbol con
switch (conditionalOperation.WhenTrue.Children.First())
{
case IInvocationOperation childInvocationOperation:
if (childInvocationOperation.TargetMethod.OriginalDefinition.Equals(remove1Param, SymbolEqualityComparer.Default) ||
childInvocationOperation.TargetMethod.OriginalDefinition.Equals(remove2Param, SymbolEqualityComparer.Default))
if ((childInvocationOperation.TargetMethod.OriginalDefinition.Equals(remove1Param, SymbolEqualityComparer.Default) ||
childInvocationOperation.TargetMethod.OriginalDefinition.Equals(remove2Param, SymbolEqualityComparer.Default)) &&
AreInvocationsOnSameInstance(childInvocationOperation, invocationOperation))
{
additionalLocation.Add(childInvocationOperation.Syntax.Parent.GetLocation());
context.ReportDiagnostic(invocationOperation.CreateDiagnostic(Rule, additionalLocations: additionalLocation.ToImmutable(), null));
Expand All @@ -101,7 +102,7 @@ static void AnalyzeOperation(OperationAnalysisContext context, IMethodSymbol con
.FirstOrDefault(op => op.TargetMethod.OriginalDefinition.Equals(remove1Param, SymbolEqualityComparer.Default) ||
op.TargetMethod.OriginalDefinition.Equals(remove2Param, SymbolEqualityComparer.Default));

if (nestedInvocationOperation != null)
if (nestedInvocationOperation != null && AreInvocationsOnSameInstance(nestedInvocationOperation, invocationOperation))
{
additionalLocation.Add(nestedInvocationOperation.Syntax.Parent.GetLocation());
context.ReportDiagnostic(invocationOperation.CreateDiagnostic(Rule, additionalLocations: additionalLocation.ToImmutable(), null));
Expand All @@ -114,6 +115,23 @@ static void AnalyzeOperation(OperationAnalysisContext context, IMethodSymbol con
}
}

static bool AreInvocationsOnSameInstance(IInvocationOperation invocationOp1, IInvocationOperation invocationOp2)
{
return GetInstance(invocationOp1.Instance) == GetInstance(invocationOp2.Instance);

static ISymbol? GetInstance(IOperation op)
{
return op switch
{
IFieldReferenceOperation fieldRefOp => fieldRefOp.Member,
IPropertyReferenceOperation propRefOp => propRefOp.Member,
IParameterReferenceOperation paramRefOp => paramRefOp.Parameter,
ILocalReferenceOperation localRefOp => localRefOp.Local,
_ => null,
};
}
}

static bool TryGetDictionaryTypeAndMethods(Compilation compilation, [NotNullWhen(true)] out IMethodSymbol? containsKey,
[NotNullWhen(true)] out IMethodSymbol? remove1Param, out IMethodSymbol? remove2Param)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Testing;
using Test.Utilities;
using Xunit;

using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
Expand Down Expand Up @@ -353,6 +354,7 @@ End Class

await VerifyVB.VerifyCodeFixAsync(source, fixedSource);
}

[Fact]
public async Task NegatedCondition_ReportsDiagnostic_VB()
{
Expand Down Expand Up @@ -391,6 +393,59 @@ End Class

await VerifyVB.VerifyAnalyzerAsync(source);
}

[Fact]
[WorkItem(6377, "https://github.com/dotnet/roslyn-analyzers/issues/6377")]
public async Task ContainsKeyIsCalledOnDifferentInstance_NoDiagnostic_CS()
{
string source = CSUsings + CSNamespaceAndClassStart + @"
private readonly Dictionary<string, string> DictionaryField1 = new Dictionary<string, string>();
private readonly Dictionary<string, string> DictionaryField2 = new Dictionary<string, string>();
public Dictionary<string, string> DictionaryProperty1 { get; } = new Dictionary<string, string>();
public MyClass()
{
if (DictionaryField2.ContainsKey(""Key""))
DictionaryField1.Remove(""Key"");
if (!DictionaryField1.ContainsKey(""Key""))
{
DictionaryField2.Remove(""Key"");
}
if (DictionaryProperty1.ContainsKey(""Key""))
DictionaryField1.Remove(""Key"");
if (!DictionaryField1.ContainsKey(""Key""))
{
DictionaryProperty1.Remove(""Key"");
}
var myDictionaryLocal4 = new Dictionary<string, string>();
if (myDictionaryLocal4.ContainsKey(""Key""))
DictionaryField1.Remove(""Key"");
if (!DictionaryField1.ContainsKey(""Key""))
{
myDictionaryLocal4.Remove(""Key"");
}
}
private void RemoveItem(Dictionary<string, string> dictionaryParam)
{
if (dictionaryParam.ContainsKey(""Key""))
DictionaryField1.Remove(""Key"");
if (!DictionaryField1.ContainsKey(""Key""))
{
dictionaryParam.Remove(""Key"");
}
}" + CSNamespaceAndClassEnd;

await VerifyCS.VerifyAnalyzerAsync(source);
}

#endregion

#region Helpers
Expand Down

0 comments on commit b8351d8

Please sign in to comment.