Browse Source

ParameterCanBeDemotedIssue: Remove 'ConstructHasLocalIndependentTyping'

This fixes false positives when the parameter is used within lambdas passed to generic methods (e.g. LINQ).
pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
f31aa291ae
  1. 25
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/TypeCriteriaCollector.cs
  2. 53
      ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedTests.cs

25
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/TypeCriteriaCollector.cs

@ -185,30 +185,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
void CheckForCriterion(Expression expression, IVariable variable) void CheckForCriterion(Expression expression, IVariable variable)
{ {
if (ConstructHasLocalIndependentTyping(expression)) { AddCriterion(variable, new IsTypeCriterion(context.GetExpectedType(expression)));
AddCriterion(variable, new IsTypeCriterion(context.GetExpectedType(expression)));
}
}
bool ConstructHasLocalIndependentTyping(AstNode astNode)
{
// TODO: Implement this thing correctly
var parent = astNode.Parent;
while (!(parent is InvocationExpression || parent is ObjectCreateExpression || parent is Statement))
parent = parent.Parent;
if (parent is InvocationExpression || parent is ObjectCreateExpression) {
var resolveResult = context.Resolve(parent) as InvocationResolveResult;
if (resolveResult == null)
return true;
var specializedMember = resolveResult.Member as SpecializedMethod;
return specializedMember == null || specializedMember.TypeParameters.Count == 0;
}
var initializer = parent as VariableDeclarationStatement;
if (initializer != null) {
return initializer.Type.GetText() != "var";
}
return true;
} }
class ConjunctionCriteria : ITypeCriterion class ConjunctionCriteria : ITypeCriterion

53
ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedTests.cs

@ -423,22 +423,7 @@ class Test
}"; }";
TestRefactoringContext context; TestRefactoringContext context;
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context); var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
Assert.AreEqual(1, issues.Count); Assert.AreEqual(0, issues.Count);
var issue = issues [0];
Assert.AreEqual(1, issue.Actions.Count);
CheckFix(context, issues [0], baseInput + @"
class Test
{
void F(IA b)
{
Generic (b);
}
void Generic<T> (T arg) where T : IA
{
}
}");
} }
[Test] [Test]
@ -459,23 +444,7 @@ class Test
}"; }";
TestRefactoringContext context; TestRefactoringContext context;
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context); var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
Assert.AreEqual(1, issues.Count); Assert.AreEqual(0, issues.Count);
var issue = issues [0];
Assert.AreEqual(1, issue.Actions.Count);
CheckFix(context, issues [0], baseInput + @"
class Test
{
void Foo (IA b)
{
var b2 = b;
Foo (b2);
}
void Foo (IA a)
{
}
}");
} }
[Test] [Test]
@ -936,6 +905,24 @@ class Test : TestBase
} }
}", 0); }", 0);
} }
[Test]
public void DoNotDemoteStringComparisonToReferenceComparison_WithinLambda()
{
Test<ParameterCanBeDemotedIssue>(@"using System; using System.Linq; using System.Collections.Generic;
class Test
{
IEnumerable<User> users;
User GetUser (String id)
{
return users.Where(u => u.Name == id).SingleOrDefault();
}
}
class User {
public string Name;
}
", 0);
}
} }
} }

Loading…
Cancel
Save