diff --git a/src/Moq.Analyzers/Analyzers/SetupSetAnalyzer.cs b/src/Moq.Analyzers/Analyzers/SetupSetAnalyzer.cs index 4eab583..a51eb8c 100644 --- a/src/Moq.Analyzers/Analyzers/SetupSetAnalyzer.cs +++ b/src/Moq.Analyzers/Analyzers/SetupSetAnalyzer.cs @@ -48,13 +48,13 @@ private static void Analyze(SyntaxNodeAnalysisContext context) var methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpression, context.CancellationToken); - // Check if not obsolete extension - if (moqSymbols.IsObsoleteMockExtension(methodSymbol.Symbol)) + // Check if SetupSet() method. + if (!moqSymbols.IsSetupSetMethod(methodSymbol.Symbol)) { return; } - // Check is Setup() method. + // Check is SetupSet() method. if (!moqSymbols.IsSetupSetMethodWithoutGenericArgument(methodSymbol.Symbol)) { var nameSyntax = ((MemberAccessExpressionSyntax)invocationExpression.Expression).Name; diff --git a/src/Moq.Analyzers/MoqSymbols.cs b/src/Moq.Analyzers/MoqSymbols.cs index f0e90fa..818d846 100644 --- a/src/Moq.Analyzers/MoqSymbols.cs +++ b/src/Moq.Analyzers/MoqSymbols.cs @@ -45,7 +45,7 @@ internal sealed class MoqSymbols private readonly Lazy setupSetMethodWithoutGenericArgument; - private readonly Lazy obsoleteExtensionsClass; + private readonly Lazy> setupSetMethods; private MoqSymbols(INamedTypeSymbol mockGenericClass, Compilation compilation) { @@ -57,7 +57,6 @@ private MoqSymbols(INamedTypeSymbol mockGenericClass, Compilation compilation) this.isAnyTypeClass = new Lazy(() => compilation.GetTypeByMetadataName("Moq.It+IsAnyType")!); this.isAnyMethod = new Lazy(() => compilation.GetTypeByMetadataName("Moq.It")!.GetMembers("IsAny").Single()); this.verifiesInterface = new Lazy(() => compilation.GetTypeByMetadataName("Moq.Language.IVerifies")!); - this.obsoleteExtensionsClass = new Lazy(() => compilation.GetTypeByMetadataName("Moq.ObsoleteMockExtensions")!); this.setupMethods = new Lazy>(() => mockGenericClass.GetMembers("Setup").Concat(setupConditionResultInterface.Value.GetMembers("Setup")).OfType().ToArray()); this.mockBehaviorStrictField = new Lazy(() => this.mockBehaviorEnum.Value.GetMembers("Strict").First()); @@ -73,7 +72,9 @@ private MoqSymbols(INamedTypeSymbol mockGenericClass, Compilation compilation) this.mockOfMethods = new Lazy>(() => mockGenericClass.BaseType!.GetMembers("Of").Where(m => m.IsStatic).OfType().ToArray()); this.mockConstructorWithFactory = new Lazy(() => mockGenericClass.Constructors.Single(c => c.Parameters.Length == 2 && c.Parameters[0].Type.Name == "Expression")); + this.setupSetMethodWithoutGenericArgument = new Lazy(() => mockGenericClass.GetMembers("SetupSet").OfType().Single(c => c.TypeArguments.Length == 1)); + this.setupSetMethods = new Lazy>(() => mockGenericClass.GetMembers("SetupSet").OfType().ToArray()); } public static MoqSymbols? FromCompilation(Compilation compilation) @@ -128,22 +129,27 @@ public bool IsMock(ISymbol? symbol) return true; } - public bool IsObsoleteMockExtension(ISymbol? symbol) + public bool IsSetupMethod(ISymbol? symbol) { if (symbol is null) { return false; } - if (!SymbolEqualityComparer.Default.Equals(symbol.ContainingType, this.obsoleteExtensionsClass.Value)) + var originalDefinition = symbol.OriginalDefinition; + + foreach (var setupMethod in this.setupMethods.Value) { - return false; + if (SymbolEqualityComparer.Default.Equals(originalDefinition, setupMethod)) + { + return true; + } } - return true; + return false; } - public bool IsSetupMethod(ISymbol? symbol) + public bool IsSetupProtectedMethod(ISymbol? symbol) { if (symbol is null) { @@ -152,9 +158,9 @@ public bool IsSetupMethod(ISymbol? symbol) var originalDefinition = symbol.OriginalDefinition; - foreach (var setupMethod in this.setupMethods.Value) + foreach (var setupProtectedMethod in this.setupProtectedMethods.Value) { - if (SymbolEqualityComparer.Default.Equals(originalDefinition, setupMethod)) + if (SymbolEqualityComparer.Default.Equals(originalDefinition, setupProtectedMethod)) { return true; } @@ -163,7 +169,7 @@ public bool IsSetupMethod(ISymbol? symbol) return false; } - public bool IsSetupProtectedMethod(ISymbol? symbol) + public bool IsSetupSetMethod(ISymbol? symbol) { if (symbol is null) { @@ -172,9 +178,9 @@ public bool IsSetupProtectedMethod(ISymbol? symbol) var originalDefinition = symbol.OriginalDefinition; - foreach (var setupProtectedMethod in this.setupProtectedMethods.Value) + foreach (var setupSetMethod in this.setupSetMethods.Value) { - if (SymbolEqualityComparer.Default.Equals(originalDefinition, setupProtectedMethod)) + if (SymbolEqualityComparer.Default.Equals(originalDefinition, setupSetMethod)) { return true; } diff --git a/tests/Moq.Analyzers.Tests/Analyzers/SetupSetAnalyzerTest.cs b/tests/Moq.Analyzers.Tests/Analyzers/SetupSetAnalyzerTest.cs index 75f2267..f8868cb 100644 --- a/tests/Moq.Analyzers.Tests/Analyzers/SetupSetAnalyzerTest.cs +++ b/tests/Moq.Analyzers.Tests/Analyzers/SetupSetAnalyzerTest.cs @@ -26,6 +26,9 @@ public void TestMethod() var mock1 = new Mock(); mock1.SetupSet(i => i.TestProperty = 1234); mock1.SetupSet(i => i.TestProperty); // Ignored because Obsolete by Moq + + var s = ""The string""; + s.ToString(); // Invocation should be ignored } } @@ -53,6 +56,9 @@ public void TestMethod() { var mock1 = new Mock(); mock1.[|SetupSet|](i => i.TestProperty = 1234); + + var s = ""The string""; + s.ToString(); // Invocation should be ignored } }