diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index b7f1737f48..03aaedc283 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -373,7 +373,6 @@ - @@ -381,6 +380,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SetterDoesNotUseValueParameterIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ValueParameterUnusedIssue.cs similarity index 71% rename from ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SetterDoesNotUseValueParameterIssue.cs rename to ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ValueParameterUnusedIssue.cs index 22bd546403..220d905b9c 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/SetterDoesNotUseValueParameterIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ValueParameterUnusedIssue.cs @@ -32,11 +32,11 @@ using System.Threading; namespace ICSharpCode.NRefactory.CSharp.Refactoring { - [IssueDescription("Property or indexer setter does not use the value parameter", - Description = "Warns about property or indexer setters that do not use the value parameter.", + [IssueDescription("The value parameter is not used in a context where is should be", + Description = "Warns about property or indexer setters and event adders or removers that do not use the value parameter.", Category = IssueCategories.CodeQualityIssues, Severity = Severity.Warning)] - public class SetterDoesNotUseValueParameterIssue : ICodeIssueProvider + public class ValueParameterUnusedIssue : ICodeIssueProvider { public IEnumerable GetIssues(BaseRefactoringContext context) { @@ -47,21 +47,29 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { readonly BaseRefactoringContext context; - public GatherVisitor(BaseRefactoringContext context, SetterDoesNotUseValueParameterIssue inspector) : base (context) + public GatherVisitor(BaseRefactoringContext context, ValueParameterUnusedIssue inspector) : base (context) { this.context = context; } public override void VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration) { - FindIssuesInNode(indexerDeclaration.Setter.Body); + FindIssuesInNode(indexerDeclaration.Setter, indexerDeclaration.Setter.Body); } public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) { var body = propertyDeclaration.Setter.Body; if (!body.IsNull) - FindIssuesInNode(body); + FindIssuesInNode(propertyDeclaration.Setter, body); + } + + public override void VisitCustomEventDeclaration(CustomEventDeclaration eventDeclaration) + { + var addAccessor = eventDeclaration.AddAccessor; + FindIssuesInNode(addAccessor, addAccessor.Body, "add accessor"); + var removeAccessor = eventDeclaration.RemoveAccessor; + FindIssuesInNode(removeAccessor, removeAccessor.Body, "remove accessor"); } CompilationUnit compilationUnit; @@ -72,7 +80,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring base.VisitCompilationUnit(unit); } - void FindIssuesInNode(AstNode node) + void FindIssuesInNode(AstNode anchor, AstNode node, string accessorName = "setter") { var variable = context.GetResolverStateBefore(node).LocalVariables .Where(v => v.Name == "value").FirstOrDefault(); @@ -86,7 +94,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring }, CancellationToken.None); if(!referenceFound) - AddIssue(node, context.TranslateString("The setter does not use the 'value' parameter")); + AddIssue(anchor, context.TranslateString("The " + accessorName + " does not use the 'value' parameter")); } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SetterDoesNotUseValueParameterTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ValueParameterUnusedTests.cs similarity index 75% rename from ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SetterDoesNotUseValueParameterTests.cs rename to ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ValueParameterUnusedTests.cs index e651db9b1f..83bfd35a5c 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/SetterDoesNotUseValueParameterTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ValueParameterUnusedTests.cs @@ -30,7 +30,7 @@ using ICSharpCode.NRefactory.CSharp.CodeActions; namespace ICSharpCode.NRefactory.CSharp.CodeIssues { - public class SetterDoesNotUseValueParameterTests : InspectionActionTestBase + public class ValueParameterUnusedTests : InspectionActionTestBase { [Test] public void TestPropertySetter() @@ -50,7 +50,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues } }"; TestRefactoringContext context; - var issues = GetIssues(new SetterDoesNotUseValueParameterIssue(), input, out context); + var issues = GetIssues(new ValueParameterUnusedIssue(), input, out context); Assert.AreEqual(1, issues.Count); } @@ -66,10 +66,29 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues } }"; TestRefactoringContext context; - var issues = GetIssues(new SetterDoesNotUseValueParameterIssue(), input, out context); + var issues = GetIssues(new ValueParameterUnusedIssue(), input, out context); Assert.AreEqual(1, issues.Count); } + [Test] + public void TestMatchingEventAdder() + { + var input = @"class A +{ + delegate void TestEventHandler (); + event TestEventHandler EventTested + { + add { + } + remove { + } + } +}"; + TestRefactoringContext context; + var issues = GetIssues(new ValueParameterUnusedIssue(), input, out context); + Assert.AreEqual(2, issues.Count); + } + [Test] public void TestNonMatchingIndexerSetter() { @@ -83,7 +102,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues } }"; TestRefactoringContext context; - var issues = GetIssues(new SetterDoesNotUseValueParameterIssue(), input, out context); + var issues = GetIssues(new ValueParameterUnusedIssue(), input, out context); Assert.AreEqual(0, issues.Count); } @@ -95,7 +114,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues string Property { set; } }"; TestRefactoringContext context; - var issues = GetIssues(new SetterDoesNotUseValueParameterIssue(), input, out context); + var issues = GetIssues(new ValueParameterUnusedIssue(), input, out context); Assert.AreEqual(0, issues.Count); } @@ -107,7 +126,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues string Property { get; } }"; TestRefactoringContext context; - var issues = GetIssues(new SetterDoesNotUseValueParameterIssue(), input, out context); + var issues = GetIssues(new ValueParameterUnusedIssue(), input, out context); Assert.AreEqual(0, issues.Count); } } diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index c584b2ef25..b9196ce2d0 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -271,13 +271,13 @@ - +