diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs index f0a4396d57..9eb7f36391 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs @@ -221,16 +221,20 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring Expression initializer; if (rightResolveResult != null) { var rightPath = InitializerPath.FromResolveResult(rightResolveResult); - initializer = initializers [rightPath]; - initializer.AddReplacementAnnotation(node); + if (initializers.ContainsKey(rightPath)) { + initializer = initializers [rightPath]; + } else { + initializer = right.Clone(); + } } else { - initializer = right.CloneWithReplacementAnnotation(node); + initializer = right.Clone(); } var leftResolveResult = context.Resolve(left); var leftPath = InitializerPath.FromResolveResult(leftResolveResult); AddOldAnnotationsToInitializer(leftPath, initializer); if (leftResolveResult is LocalResolveResult) { + AstNodeExtensions.AddReplacementAnnotation(initializer, node); initializers [leftPath] = initializer; return true; } @@ -242,13 +246,16 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring var parentKey = leftPath.GetParentPath(); var member = leftPath.MemberPath.Last(); - InsertImplicitInitializersForPath(parentKey); + var success = InsertImplicitInitializersForPath(parentKey); + if (!success) + return false; var parentInitializer = initializers [parentKey]; AddToInitializer(parentInitializer, comments.ToArray()); comments.Clear(); AddToInitializer(parentInitializer, new NamedExpression(member.Name, initializer)); + AstNodeExtensions.AddReplacementAnnotation(initializer, node); initializers [leftPath] = initializer; return true; } @@ -336,18 +343,24 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring return initializers.Any(item => item.Key.VariableRoot.Equals(variable)); } - void InsertImplicitInitializersForPath(InitializerPath path) + bool InsertImplicitInitializersForPath(InitializerPath path) { if (initializers.ContainsKey(path)) - return; + return true; + + if (path.MemberPath.Count == 0) + return false; var parentPath = path.GetParentPath(); - InsertImplicitInitializersForPath(parentPath); + var success = InsertImplicitInitializersForPath(parentPath); + if (!success) + return false; var parentInitializer = initializers [parentPath]; var initializer = new ArrayInitializerExpression(); var namedExpression = new NamedExpression(path.MemberPath [path.MemberPath.Count - 1].Name, initializer); AddToInitializer(parentInitializer, namedExpression); initializers [path] = initializer; + return true; } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs index 02d5259da1..9092a1ee1e 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs @@ -394,6 +394,55 @@ class TestClass ); } + [Test] + public void HandlesIrrelevantAccessesAtTheEnd() + { + Test(baseText + @" + var tc = new TestClass(); + tc.Property = ""1""; + var tc$2 = new TestClass(); + tc2.Property = ""2""; + tc2.Nested = new TestClass(); + tc2.Nested.Property = ""3""; + tc.Nested = tc2; + } +}", baseText + @" + var tc = new TestClass(); + tc.Property = ""1""; + var tc2 = new TestClass() { + Property = ""2"", + Nested = new TestClass() { + Property = ""3"" + } + }; + tc.Nested = tc2; + } +}"); + } + + [Test] + public void HandlesAssignmentWhereRightExpressionIsNotVisited() + { + Test(baseText + @" + var tc = new TestClass(); + tc.Property = ""1""; + var tc$2 = new TestClass(); + tc2.Property = ""2""; + tc2.Nested = tc; + tc.Nested = tc2; + } +}", baseText + @" + var tc = new TestClass(); + tc.Property = ""1""; + var tc2 = new TestClass() { + Property = ""2"", + Nested = tc + }; + tc.Nested = tc2; + } +}"); + } + [Test] public void HandlesAssignmentToExistingVariable() {