diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs index 70977b7191..c0e093d26f 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs @@ -146,25 +146,30 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring var invocationResolveResult = context.Resolve(invocationExpression) as InvocationResolveResult; if (invocationResolveResult == null) return false; - if (invocationResolveResult.Member.Name != "Add" || invocationResolveResult.Arguments.Count != 1) + if (invocationResolveResult.Member.Name != "Add") return false; var targetResult = invocationResolveResult.TargetResult; if (targetResult is MemberResolveResult) return false; - var argument = invocationExpression.Arguments.First(); - var argumentLocalResolveResult = context.Resolve(argument) as LocalResolveResult; - if (argumentLocalResolveResult != null) { - var initializerPath = InitializerPath.FromResolveResult(argumentLocalResolveResult); - argument = initializers [initializerPath]; - ReplacementNodeHelper.AddReplacementAnnotation(argument, expressionStatement); - } else { - argument = ReplacementNodeHelper.CloneWithReplacementAnnotation(argument, expressionStatement); + + ArrayInitializerExpression tuple = new ArrayInitializerExpression(); + foreach (var argument in invocationExpression.Arguments) { + var argumentLocalResolveResult = context.Resolve(argument) as LocalResolveResult; + if (argumentLocalResolveResult != null) { + var initializerPath = InitializerPath.FromResolveResult(argumentLocalResolveResult); + if (initializerPath == null || !initializers.ContainsKey(initializerPath)) + return false; + tuple.Elements.Add(initializers[initializerPath]); + } else { + tuple.Elements.Add(argument.Clone()); + } } + ReplacementNodeHelper.AddReplacementAnnotation(tuple, expressionStatement); var targetPath = InitializerPath.FromResolveResult(targetResult); InsertImplicitInitializersForPath(targetPath); var targetInitializer = initializers [targetPath]; - AddToInitializer(targetInitializer, argument); + AddToInitializer(targetInitializer, tuple); return true; } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs index 9092a1ee1e..2c18486cb7 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs @@ -77,10 +77,9 @@ class TestClass Property = ""Value"" }; } -}" - ); +}"); } - + [Test] public void SimpleCollection() { @@ -95,8 +94,32 @@ class TestClass ""string2"" }; } -}" - ); +}"); + } + + [Test] + public void MultiElementCollection() + { + Test(baseText + @" + var tc0 = new TestClass(); + var collection = new System.Collections.Generic.Dictionary$ (); + var tc1 = new TestClass(); + tc1.Property = ""tc1""; + collection.Add(""string1"", tc1); + var tc2 = new TestClass(); + tc2.Property = ""tc2""; + collection.Add(""string2"", tc2); + collection.Add(""string0"", tc0); + } +}", baseText + @" + var tc0 = new TestClass(); + var collection = new System.Collections.Generic.Dictionary () { + {""string1"", new TestClass() { Property = ""tc1""}}, + {""string2"", new TestClass() { Property = ""tc2""}} + }; + collection.Add(""string0"", tc0); + } +}"); } [Test] @@ -126,8 +149,7 @@ class TestClass } }; } -}" - ); +}"); } [Test]