From fe815dc2a05c27ef5224a4253bd0840b9120c69b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 5 Oct 2012 02:09:09 +0200 Subject: [PATCH] Fixed false positive that caused a 'is operator always returns true' warning even though it returns false. (e.g. 'intVar is double') --- .../ExpressionIsAlwaysOfProvidedTypeIssue.cs | 9 ++++++++- .../ExpressionIsAlwaysOfProvidedTypeIssueTests.cs | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssue.cs index 50770b0379..4fbe64f46e 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssue.cs @@ -27,6 +27,7 @@ using System.Collections.Generic; using ICSharpCode.NRefactory.CSharp.Resolver; using ICSharpCode.NRefactory.Semantics; +using ICSharpCode.NRefactory.TypeSystem; namespace ICSharpCode.NRefactory.CSharp.Refactoring { @@ -59,7 +60,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring var providedType = ctx.ResolveType (isExpression.Type); var foundConversion = conversions.ImplicitConversion(type, providedType); - if (!foundConversion.IsValid) + if (!IsValidReferenceOrBoxingConversion(type, providedType)) return; var action = new CodeAction (ctx.TranslateString ("Compare with 'null'"), @@ -68,6 +69,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring AddIssue (isExpression, ctx.TranslateString ("Given expression is always of the provided type. " + "Consider comparing with 'null' instead"), new [] { action }); } + + bool IsValidReferenceOrBoxingConversion(IType fromType, IType toType) + { + Conversion c = conversions.ImplicitConversion(fromType, toType); + return c.IsValid && (c.IsIdentityConversion || c.IsReferenceConversion || c.IsBoxingConversion); + } } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssueTests.cs index bd7db047ff..b230d249ae 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/ExpressionIsAlwaysOfProvidedTypeIssueTests.cs @@ -90,5 +90,19 @@ class TestClass }"; Test (input, 1, output); } + + [Test] + public void IntIsNotDouble () + { + var input = @" +sealed class TestClass +{ + void TestMethod (int x) + { + if (x is double) ; + } +}"; + Test (input, 0); + } } }