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 @@ -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;
}

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

@ -77,10 +77,9 @@ class TestClass @@ -77,10 +77,9 @@ class TestClass
Property = ""Value""
};
}
}"
);
}");
}
[Test]
public void SimpleCollection()
{
@ -95,8 +94,32 @@ class TestClass @@ -95,8 +94,32 @@ class TestClass
""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]
@ -126,8 +149,7 @@ class TestClass @@ -126,8 +149,7 @@ class TestClass
}
};
}
}"
);
}");
}
[Test]

Loading…
Cancel
Save