diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantFieldInitializerIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantFieldInitializerIssue.cs index d5bb988d92..fa952c614b 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantFieldInitializerIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantFieldInitializerIssue.cs @@ -26,6 +26,7 @@ using System.Collections.Generic; using ICSharpCode.NRefactory.PatternMatching; +using ICSharpCode.NRefactory.TypeSystem; namespace ICSharpCode.NRefactory.CSharp.Refactoring { @@ -52,7 +53,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { base.VisitFieldDeclaration (fieldDeclaration); - var defaultValueExpr = ctx.GetDefaultValueExpression (fieldDeclaration.ReturnType); + var defaultValueExpr = GetDefaultValueExpression (fieldDeclaration.ReturnType); if (defaultValueExpr == null) return; @@ -66,6 +67,54 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } } + Expression GetDefaultValueExpression (AstType astType) + { + var type = ctx.ResolveType (astType); + + if ((type.IsReferenceType ?? false) || type.Kind == TypeKind.Dynamic) + return new NullReferenceExpression (); + + var typeDefinition = type.GetDefinition (); + if (typeDefinition != null) { + switch (typeDefinition.KnownTypeCode) { + case KnownTypeCode.Boolean: + return new PrimitiveExpression (false); + + case KnownTypeCode.Char: + return new PrimitiveExpression ('\0'); + + case KnownTypeCode.SByte: + case KnownTypeCode.Byte: + case KnownTypeCode.Int16: + case KnownTypeCode.UInt16: + case KnownTypeCode.Int32: + return new PrimitiveExpression (0); + + case KnownTypeCode.Int64: + return new Choice { new PrimitiveExpression (0), new PrimitiveExpression (0L) }; + case KnownTypeCode.UInt32: + return new Choice { new PrimitiveExpression (0), new PrimitiveExpression (0U) }; + case KnownTypeCode.UInt64: + return new Choice { + new PrimitiveExpression (0), new PrimitiveExpression (0U), new PrimitiveExpression (0UL) + }; + case KnownTypeCode.Single: + return new Choice { new PrimitiveExpression (0), new PrimitiveExpression (0F) }; + case KnownTypeCode.Double: + return new Choice { + new PrimitiveExpression (0), new PrimitiveExpression (0F), new PrimitiveExpression (0D) + }; + case KnownTypeCode.Decimal: + return new Choice { new PrimitiveExpression (0), new PrimitiveExpression (0M) }; + + case KnownTypeCode.NullableOfT: + return new NullReferenceExpression (); + } + if (type.Kind == TypeKind.Struct) + return new ObjectCreateExpression (astType.Clone ()); + } + return new DefaultValueExpression (astType.Clone ()); + } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantFieldInitializerIssueTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantFieldInitializerIssueTests.cs index 9fd09b504b..13df8cc531 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantFieldInitializerIssueTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantFieldInitializerIssueTests.cs @@ -33,19 +33,37 @@ namespace ICSharpCode.NRefactory.CSharp.CodeIssues public class RedundantFieldInitializerIssueTests : InspectionActionTestBase { [Test] - public void TestRedundantNumberInitializer () + public void TestRedundantIntInitializer () { var input = @" class TestClass { int i = 0; - double d = 0; + long l = 0L; }"; var output = @" class TestClass { int i; + long l; +}"; + Test (input, 2, output); + } + + [Test] + public void TestRedundantFloatInitializer () + { + var input = @" +class TestClass +{ + double d = 0; + double d2 = 0.0; +}"; + var output = @" +class TestClass +{ double d; + double d2; }"; Test (input, 2, output); }