提交 aeaff1eb 编写于 作者: C CyrusNajmabadi

Fix issue when rewriting code already rewritten.

上级 2d6f5d31
......@@ -561,5 +561,39 @@ void M()
}
}", compareTokens: false);
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsReplacePropertyWithMethods)]
public async Task ReplaceReadInsideWrite1()
{
await TestAsync(
@"class C
{
int [||]Prop { get; set; }
void M()
{
Prop = Prop + 1;
}
}",
@"class C
{
private int prop;
private int GetProp()
{
return this.prop;
}
private void SetProp(int value)
{
this.prop = value;
}
void M()
{
SetProp(GetProp() + 1);
}
}");
}
}
}
......@@ -69,6 +69,8 @@ private struct ReferenceReplacer
private readonly TExpressionSyntax _expression;
private readonly CancellationToken _cancellationToken;
private readonly Func<ReferenceReplacer, SyntaxNode, TExpressionSyntax> getRightHandSideOfParent;
public ReferenceReplacer(
AbstractReplacePropertyWithMethodsService<TIdentifierNameSyntax, TExpressionSyntax, TStatementSyntax> service,
SemanticModel semanticModel,
......@@ -98,6 +100,8 @@ private struct ReferenceReplacer
{
_expression = _expression.Parent as TExpressionSyntax;
}
getRightHandSideOfParent = (replacer, parent) => (TExpressionSyntax)replacer._syntaxFacts.GetRightHandSideOfAssignment(parent);
}
private SyntaxGenerator Generator => _editor.Generator;
......@@ -125,8 +129,9 @@ public void Do()
{
// We're only being written to here. This is safe to replace with a call to the
// setter.
var replacer = this;
ReplaceWrite(
writeValue: (TExpressionSyntax)_syntaxFacts.GetRightHandSideOfAssignment(_expression.Parent),
getWriteValue: getRightHandSideOfParent,
keepTrivia: true,
conflictMessage: null);
}
......@@ -178,13 +183,30 @@ private void ReplaceRead(bool keepTrivia, string conflictMessage)
bool keepTrivia,
string conflictMessage)
{
var writeExpression = GetWriteExpression(writeValue, keepTrivia, conflictMessage);
if (_expression.Parent is TStatementSyntax)
{
writeExpression = Generator.ExpressionStatement(writeExpression);
}
ReplaceWrite((_1, _2) => writeValue, keepTrivia, conflictMessage);
}
_editor.ReplaceNode(_expression.Parent, writeExpression);
private void ReplaceWrite(
Func<ReferenceReplacer, SyntaxNode, TExpressionSyntax> getWriteValue,
bool keepTrivia,
string conflictMessage)
{
var replacer = this;
// Call this overload so we can see this node after already replacing any
// references in the writing side of it.
_editor.ReplaceNode(_expression.Parent,
(parent, generator) =>
{
var writeValue = getWriteValue(replacer, parent);
var writeExpression = replacer.GetWriteExpression(writeValue, keepTrivia, conflictMessage);
if (replacer._expression.Parent is TStatementSyntax)
{
writeExpression = replacer.Generator.ExpressionStatement(writeExpression);
}
return writeExpression;
});
}
private TExpressionSyntax GetReadExpression(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册