Browse Source

[CodeActons] Handle more edge cases in ConvertToInitializer.

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

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

@ -221,16 +221,20 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
Expression initializer; Expression initializer;
if (rightResolveResult != null) { if (rightResolveResult != null) {
var rightPath = InitializerPath.FromResolveResult(rightResolveResult); var rightPath = InitializerPath.FromResolveResult(rightResolveResult);
if (initializers.ContainsKey(rightPath)) {
initializer = initializers [rightPath]; initializer = initializers [rightPath];
initializer.AddReplacementAnnotation(node);
} else { } else {
initializer = right.CloneWithReplacementAnnotation(node); initializer = right.Clone();
}
} else {
initializer = right.Clone();
} }
var leftResolveResult = context.Resolve(left); var leftResolveResult = context.Resolve(left);
var leftPath = InitializerPath.FromResolveResult(leftResolveResult); var leftPath = InitializerPath.FromResolveResult(leftResolveResult);
AddOldAnnotationsToInitializer(leftPath, initializer); AddOldAnnotationsToInitializer(leftPath, initializer);
if (leftResolveResult is LocalResolveResult) { if (leftResolveResult is LocalResolveResult) {
AstNodeExtensions.AddReplacementAnnotation(initializer, node);
initializers [leftPath] = initializer; initializers [leftPath] = initializer;
return true; return true;
} }
@ -242,13 +246,16 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
var parentKey = leftPath.GetParentPath(); var parentKey = leftPath.GetParentPath();
var member = leftPath.MemberPath.Last(); var member = leftPath.MemberPath.Last();
InsertImplicitInitializersForPath(parentKey); var success = InsertImplicitInitializersForPath(parentKey);
if (!success)
return false;
var parentInitializer = initializers [parentKey]; var parentInitializer = initializers [parentKey];
AddToInitializer(parentInitializer, comments.ToArray()); AddToInitializer(parentInitializer, comments.ToArray());
comments.Clear(); comments.Clear();
AddToInitializer(parentInitializer, new NamedExpression(member.Name, initializer)); AddToInitializer(parentInitializer, new NamedExpression(member.Name, initializer));
AstNodeExtensions.AddReplacementAnnotation(initializer, node);
initializers [leftPath] = initializer; initializers [leftPath] = initializer;
return true; return true;
} }
@ -336,18 +343,24 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return initializers.Any(item => item.Key.VariableRoot.Equals(variable)); return initializers.Any(item => item.Key.VariableRoot.Equals(variable));
} }
void InsertImplicitInitializersForPath(InitializerPath path) bool InsertImplicitInitializersForPath(InitializerPath path)
{ {
if (initializers.ContainsKey(path)) if (initializers.ContainsKey(path))
return; return true;
if (path.MemberPath.Count == 0)
return false;
var parentPath = path.GetParentPath(); var parentPath = path.GetParentPath();
InsertImplicitInitializersForPath(parentPath); var success = InsertImplicitInitializersForPath(parentPath);
if (!success)
return false;
var parentInitializer = initializers [parentPath]; var parentInitializer = initializers [parentPath];
var initializer = new ArrayInitializerExpression(); var initializer = new ArrayInitializerExpression();
var namedExpression = new NamedExpression(path.MemberPath [path.MemberPath.Count - 1].Name, initializer); var namedExpression = new NamedExpression(path.MemberPath [path.MemberPath.Count - 1].Name, initializer);
AddToInitializer(parentInitializer, namedExpression); AddToInitializer(parentInitializer, namedExpression);
initializers [path] = initializer; initializers [path] = initializer;
return true;
} }
} }

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

@ -394,6 +394,55 @@ class TestClass
); );
} }
[Test]
public void HandlesIrrelevantAccessesAtTheEnd()
{
Test<ConvertToInitializerAction>(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<ConvertToInitializerAction>(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] [Test]
public void HandlesAssignmentToExistingVariable() public void HandlesAssignmentToExistingVariable()
{ {

Loading…
Cancel
Save