Browse Source

[CodeActions] ConvertToInitializer: Handle collections with Add() calls taking multiple arguments.

newNRvisualizers
Simon Lindgren 13 years ago
parent
commit
88d89e7f98
  1. 25
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs
  2. 36
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs

25
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs

@ -146,25 +146,30 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
var invocationResolveResult = context.Resolve(invocationExpression) as InvocationResolveResult; var invocationResolveResult = context.Resolve(invocationExpression) as InvocationResolveResult;
if (invocationResolveResult == null) if (invocationResolveResult == null)
return false; return false;
if (invocationResolveResult.Member.Name != "Add" || invocationResolveResult.Arguments.Count != 1) if (invocationResolveResult.Member.Name != "Add")
return false; return false;
var targetResult = invocationResolveResult.TargetResult; var targetResult = invocationResolveResult.TargetResult;
if (targetResult is MemberResolveResult) if (targetResult is MemberResolveResult)
return false; return false;
var argument = invocationExpression.Arguments.First();
var argumentLocalResolveResult = context.Resolve(argument) as LocalResolveResult; ArrayInitializerExpression tuple = new ArrayInitializerExpression();
if (argumentLocalResolveResult != null) { foreach (var argument in invocationExpression.Arguments) {
var initializerPath = InitializerPath.FromResolveResult(argumentLocalResolveResult); var argumentLocalResolveResult = context.Resolve(argument) as LocalResolveResult;
argument = initializers [initializerPath]; if (argumentLocalResolveResult != null) {
ReplacementNodeHelper.AddReplacementAnnotation(argument, expressionStatement); var initializerPath = InitializerPath.FromResolveResult(argumentLocalResolveResult);
} else { if (initializerPath == null || !initializers.ContainsKey(initializerPath))
argument = ReplacementNodeHelper.CloneWithReplacementAnnotation(argument, expressionStatement); return false;
tuple.Elements.Add(initializers[initializerPath]);
} else {
tuple.Elements.Add(argument.Clone());
}
} }
ReplacementNodeHelper.AddReplacementAnnotation(tuple, expressionStatement);
var targetPath = InitializerPath.FromResolveResult(targetResult); var targetPath = InitializerPath.FromResolveResult(targetResult);
InsertImplicitInitializersForPath(targetPath); InsertImplicitInitializersForPath(targetPath);
var targetInitializer = initializers [targetPath]; var targetInitializer = initializers [targetPath];
AddToInitializer(targetInitializer, argument); AddToInitializer(targetInitializer, tuple);
return true; return true;
} }

36
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs

@ -77,10 +77,9 @@ class TestClass
Property = ""Value"" Property = ""Value""
}; };
} }
}" }");
);
} }
[Test] [Test]
public void SimpleCollection() public void SimpleCollection()
{ {
@ -95,8 +94,32 @@ class TestClass
""string2"" ""string2""
}; };
} }
}" }");
); }
[Test]
public void MultiElementCollection()
{
Test<ConvertToInitializerAction>(baseText + @"
var tc0 = new TestClass();
var collection = new System.Collections.Generic.Dictionary$<string, TestClass> ();
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<string> () {
{""string1"", new TestClass() { Property = ""tc1""}},
{""string2"", new TestClass() { Property = ""tc2""}}
};
collection.Add(""string0"", tc0);
}
}");
} }
[Test] [Test]
@ -126,8 +149,7 @@ class TestClass
} }
}; };
} }
}" }");
);
} }
[Test] [Test]

Loading…
Cancel
Save