From 4dbac01d20f3c9fedf99e8ca23129a0bfccb50ba Mon Sep 17 00:00:00 2001 From: Simon Lindgren Date: Thu, 26 Jul 2012 09:31:00 +0200 Subject: [PATCH] [CodeActions] Fix bugs in ConvertToInitializerAction. --- .../ConvertToInitializerAction.cs | 11 +++--- .../StatementsToInitializerConverter.cs | 2 +- .../ConvertToInitializerTests.cs | 35 ++++++++++++++++--- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/ConvertToInitializerAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/ConvertToInitializerAction.cs index 293591f28c..bfb2485411 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/ConvertToInitializerAction.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/ConvertToInitializerAction.cs @@ -58,10 +58,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring if (initializerRR == null) return null; IList statements = GetNodes(context.GetNode()); - if (statements.Count == 0) - return null; var converter = new StatementsToInitializerConverter(context); var newInitializer = converter.ConvertToInitializer(initializer, ref statements); + if (statements.Count == 0) + return null; return MakeAction(context, initializer, newInitializer, statements); } @@ -70,15 +70,16 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring var expression = expressionStatement.Expression as AssignmentExpression; if (expression == null) return null; + if (!(expression.Right is ObjectCreateExpression)) + return null; var expressionResolveResult = context.Resolve(expression.Left); - var variableResolveResult = expressionResolveResult as LocalResolveResult; if (!(expressionResolveResult is LocalResolveResult) && !(expressionResolveResult is MemberResolveResult)) return null; IList statements = GetNodes(context.GetNode()); - if (statements.Count == 0) - return null; var converter = new StatementsToInitializerConverter(context); var newExpression = converter.ConvertToInitializer(expression, ref statements); + if (statements.Count == 0) + return null; return MakeAction(context, expression, newExpression, statements); } diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs index 74834d2869..f0a4396d57 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs @@ -325,7 +325,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring if (resolveResult == null) continue; var initializerPath = InitializerPath.FromResolveResult(resolveResult); - if (initializers.ContainsKey(initializerPath)) + if (initializerPath != null && initializers.ContainsKey(initializerPath)) return true; } return false; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs index a86b52369b..02d5259da1 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs @@ -485,7 +485,7 @@ class TestClass }" ); } - + [Test] public void StopsAtUnresolvableAssignmentTarget() { @@ -501,7 +501,17 @@ class TestClass Variable.Nested = new TestClass(); } }" - ); + ); + } + + [Test] + public void NoActionForSingleStepInitializers() + { + TestWrongContext(baseText + @" + var variable = new Test$Class (); + var s = string.Empty; + } +}"); } [Test] @@ -518,7 +528,7 @@ class TestClass }" ); } - + [Test] public void IgnoresSingleCreation() { @@ -529,8 +539,23 @@ class TestClass { var variable = new $TestClass(); } -}" - ); +}"); + } + + [Test] + public void DoesNotCrashOnDeclarationInitializedToVariable() + { + TestWrongContext(@" +class TestClass +{ + void F() + { + var s = """"; + s$ = ""2""; + // And another statement to make the converter even try + s = """"; + } +}"); } } }