Browse Source

[CodeIssues] Fixed unused parameters for methods used as delegates and

event handlers.
newNRvisualizers
Mike Krüger 13 years ago
parent
commit
a50b205d6b
  1. 45
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableNotUsedIssues/ParameterNotUsedIssue.cs
  2. 16
      ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterNotUsedIssueTests.cs

45
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/VariableNotUsedIssues/ParameterNotUsedIssue.cs

@ -28,6 +28,8 @@ using ICSharpCode.NRefactory.Semantics;
using System.Linq; using System.Linq;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using System.Collections.Generic; using System.Collections.Generic;
using ICSharpCode.NRefactory.CSharp.Resolver;
using System;
namespace ICSharpCode.NRefactory.CSharp.Refactoring namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
@ -41,15 +43,48 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
#region ICodeIssueProvider implementation #region ICodeIssueProvider implementation
public IEnumerable<CodeIssue> GetIssues(BaseRefactoringContext context) public IEnumerable<CodeIssue> GetIssues(BaseRefactoringContext context)
{ {
return new GatherVisitor (context).GetIssues (); var delegateVisitor = new GetDelgateUsagesVisitor (context);
context.RootNode.AcceptVisitor (delegateVisitor);
return new GatherVisitor (context, delegateVisitor).GetIssues ();
} }
#endregion #endregion
// Collect all methods that are used as delegate
class GetDelgateUsagesVisitor : DepthFirstAstVisitor
{
BaseRefactoringContext ctx;
public readonly List<IMethod> UsedMethods = new List<IMethod> ();
public GetDelgateUsagesVisitor(BaseRefactoringContext ctx)
{
this.ctx = ctx;
}
public override void VisitIdentifierExpression(IdentifierExpression identifierExpression)
{
var mgr = ctx.Resolve (identifierExpression) as MethodGroupResolveResult;
if (mgr != null)
UsedMethods.AddRange (mgr.Methods);
base.VisitIdentifierExpression(identifierExpression);
}
public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression)
{
var mgr = ctx.Resolve (memberReferenceExpression) as MethodGroupResolveResult;
if (mgr != null)
UsedMethods.AddRange (mgr.Methods);
base.VisitMemberReferenceExpression(memberReferenceExpression);
}
}
class GatherVisitor : GatherVisitorBase class GatherVisitor : GatherVisitorBase
{ {
public GatherVisitor (BaseRefactoringContext ctx) GetDelgateUsagesVisitor usedDelegates;
public GatherVisitor (BaseRefactoringContext ctx, GetDelgateUsagesVisitor usedDelegates)
: base (ctx) : base (ctx)
{ {
this.usedDelegates = usedDelegates;
} }
public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration) public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
@ -66,8 +101,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return; return;
if (member.ImplementedInterfaceMembers.Any ()) if (member.ImplementedInterfaceMembers.Any ())
return; return;
if (usedDelegates.UsedMethods.Any (m => m.Region.Begin == methodDeclaration.StartLocation))
base.VisitMethodDeclaration(methodDeclaration); return;
foreach (var parameter in methodDeclaration.Parameters)
parameter.AcceptVisitor (this);
} }
public override void VisitParameterDeclaration (ParameterDeclaration parameterDeclaration) public override void VisitParameterDeclaration (ParameterDeclaration parameterDeclaration)

16
ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterNotUsedIssueTests.cs

@ -114,5 +114,21 @@ class TestClass {
}"; }";
Test<ParameterNotUsedIssue> (input, 0); Test<ParameterNotUsedIssue> (input, 0);
} }
[Test]
public void TestMethodUsedAsDelegateMethod ()
{
var input = @"using System;
class TestClass {
public event EventHandler FooEvt;
void TestMethod ()
{
FooEvt += FooBar;
}
void FooBar (object sender, EventArgs e) {}
}";
Test<ParameterNotUsedIssue> (input, 0);
}
} }
} }

Loading…
Cancel
Save