From f31aa291ae01c7b1b66b338c7e1c6edff3a786b4 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 27 Jan 2013 17:32:10 +0100 Subject: [PATCH] ParameterCanBeDemotedIssue: Remove 'ConstructHasLocalIndependentTyping' This fixes false positives when the parameter is used within lambdas passed to generic methods (e.g. LINQ). --- .../TypeCriteriaCollector.cs | 25 +-------- .../ParameterCanBeDemotedTests.cs | 53 +++++++------------ 2 files changed, 21 insertions(+), 57 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/TypeCriteriaCollector.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/TypeCriteriaCollector.cs index 3fe71b4d07..f42d55c675 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/TypeCriteriaCollector.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ParameterCanBeDemotedIssue/TypeCriteriaCollector.cs @@ -185,30 +185,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring void CheckForCriterion(Expression expression, IVariable variable) { - if (ConstructHasLocalIndependentTyping(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; + AddCriterion(variable, new IsTypeCriterion(context.GetExpectedType(expression))); } class ConjunctionCriteria : ITypeCriterion diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedTests.cs index b7dec0b42c..843b1eb359 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ParameterCanBeDemotedIssue/ParameterCanBeDemotedTests.cs @@ -423,22 +423,7 @@ class Test }"; TestRefactoringContext context; var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context); - Assert.AreEqual(1, 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 arg) where T : IA - { - } -}"); + Assert.AreEqual(0, issues.Count); } [Test] @@ -459,23 +444,7 @@ class Test }"; TestRefactoringContext context; var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context); - Assert.AreEqual(1, 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) - { - } -}"); + Assert.AreEqual(0, issues.Count); } [Test] @@ -936,6 +905,24 @@ class Test : TestBase } }", 0); } + + [Test] + public void DoNotDemoteStringComparisonToReferenceComparison_WithinLambda() + { + Test(@"using System; using System.Linq; using System.Collections.Generic; +class Test +{ + IEnumerable users; + User GetUser (String id) + { + return users.Where(u => u.Name == id).SingleOrDefault(); + } +} +class User { + public string Name; +} +", 0); + } } }