Browse Source

[CodeActions] Fix bugs in ConvertToInitializer.

newNRvisualizers
Simon Lindgren 13 years ago
parent
commit
522d6c6cbd
  1. 17
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs
  2. 44
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs

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

@ -159,7 +159,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
var initializerPath = InitializerPath.FromResolveResult(argumentLocalResolveResult); var initializerPath = InitializerPath.FromResolveResult(argumentLocalResolveResult);
if (initializerPath == null || !initializers.ContainsKey(initializerPath)) if (initializerPath == null || !initializers.ContainsKey(initializerPath))
return false; return false;
tuple.Elements.Add(initializers[initializerPath]); // Add a clone, since we do not yet know if this is where the initializer will be used
var initializerClone = initializers[initializerPath].Clone();
tuple.Elements.Add(initializerClone);
} else { } else {
tuple.Elements.Add(argument.Clone()); tuple.Elements.Add(argument.Clone());
} }
@ -167,6 +169,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
ReplacementNodeHelper.AddReplacementAnnotation(tuple, expressionStatement); ReplacementNodeHelper.AddReplacementAnnotation(tuple, expressionStatement);
var targetPath = InitializerPath.FromResolveResult(targetResult); var targetPath = InitializerPath.FromResolveResult(targetResult);
if (targetPath == null || !initializers.ContainsKey(targetPath))
return false;
InsertImplicitInitializersForPath(targetPath); InsertImplicitInitializersForPath(targetPath);
var targetInitializer = initializers [targetPath]; var targetInitializer = initializers [targetPath];
AddToInitializer(targetInitializer, tuple); AddToInitializer(targetInitializer, tuple);
@ -196,13 +200,15 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
var rightResolveResult = context.Resolve(initializer) as LocalResolveResult; var rightResolveResult = context.Resolve(initializer) as LocalResolveResult;
if (rightResolveResult != null) { if (rightResolveResult != null) {
var rightPath = InitializerPath.FromResolveResult(rightResolveResult); var rightPath = InitializerPath.FromResolveResult(rightResolveResult);
if (rightPath != null && initializers.ContainsKey(rightPath)) {
var rightInitializer = initializers [rightPath]; var rightInitializer = initializers [rightPath];
if (rightInitializer != null) { ReplacementNodeHelper.AddReplacementAnnotation(rightInitializer, node);
rightInitializer.AddAnnotation(new ReplacementNodeAnnotation() { ReplacedNode = node });
initializers.Remove(rightPath); initializers.Remove(rightPath);
initializers [variablePath] = rightInitializer; initializers [variablePath] = rightInitializer;
if (rightPath == mainInitializerPath) {
mainInitializerPath = variablePath; mainInitializerPath = variablePath;
} }
}
} else { } else {
initializers [variablePath] = ReplacementNodeHelper.CloneWithReplacementAnnotation(initializer, node); initializers [variablePath] = ReplacementNodeHelper.CloneWithReplacementAnnotation(initializer, node);
} }
@ -223,7 +229,6 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
var rightResolveResult = context.Resolve(right) as LocalResolveResult; var rightResolveResult = context.Resolve(right) as LocalResolveResult;
var leftResolveResult = context.Resolve(left); var leftResolveResult = context.Resolve(left);
var leftPath = InitializerPath.FromResolveResult(leftResolveResult);
Expression initializer; Expression initializer;
if (rightResolveResult != null) { if (rightResolveResult != null) {
var rightPath = InitializerPath.FromResolveResult(rightResolveResult); var rightPath = InitializerPath.FromResolveResult(rightResolveResult);
@ -235,6 +240,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
} else { } else {
initializer = right.Clone(); initializer = right.Clone();
} }
var leftPath = InitializerPath.FromResolveResult(leftResolveResult);
if (leftPath == null) {
return false;
}
// Move replacement annotations over, in case this is the second assignment // Move replacement annotations over, in case this is the second assignment
// to the same variable. // to the same variable.
AddOldAnnotationsToInitializer(leftPath, initializer); AddOldAnnotationsToInitializer(leftPath, initializer);

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

@ -152,6 +152,25 @@ class TestClass
}"); }");
} }
[Test]
public void UnknownTargetForAdd()
{
Test<ConvertToInitializerAction>(baseText + @"
var collection = new System.Collections.Generic.List<string> ();
var item $= new TestClass ();
item.Property = ""Value1"";
collection.Add(item);
}
}", baseText + @"
var collection = new System.Collections.Generic.List<string> ();
var item = new TestClass() {
Property = ""Value1""
};
collection.Add(item);
}
}");
}
[Test] [Test]
public void ObjectContainingCollections() public void ObjectContainingCollections()
{ {
@ -479,8 +498,7 @@ class TestClass
Nested = new TestClass() Nested = new TestClass()
}; };
} }
}" }");
);
} }
[Test] [Test]
@ -496,8 +514,26 @@ class TestClass
Property = ""Value"" Property = ""Value""
}; };
} }
}" }");
); }
[Test]
public void FinalVariableAssignmentOfOtherInitializer()
{
Test<ConvertToInitializerAction>(baseText + @"
var tc $= new TestClass ();
tc.Property = ""Value"";
var _variable = new TestClass ();
var variable = _variable;
}
}", baseText + @"
var tc = new TestClass () {
Property = ""Value""
};
var _variable = new Test$Class ();
var variable = _variable;
}
}");
} }
[Test] [Test]

Loading…
Cancel
Save