Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 8273535

Browse files
committed
handle VB.Net to CS conversion set attribute Axis syntax; replace assignment with call
1 parent 8a9b312 commit 8273535

2 files changed

Lines changed: 38 additions & 2 deletions

File tree

src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2403,6 +2403,11 @@ public override object TrackedVisitInvocationExpression(InvocationExpression inv
24032403

24042404
public override object TrackedVisitXmlMemberAccessExpression(XmlMemberAccessExpression xmlMemberAccessExpression, object data)
24052405
{
2406+
var parentAsAssignment = xmlMemberAccessExpression.Parent as AssignmentExpression;
2407+
var xmlMemberAccessExpressionOnLeftOfAssignment = parentAsAssignment != null && parentAsAssignment.Left == xmlMemberAccessExpression;
2408+
2409+
// only output identifier expression if we are not overriding assignment with method call
2410+
if(!(xmlMemberAccessExpression.AxisType == XmlAxisType.Attribute && xmlMemberAccessExpressionOnLeftOfAssignment))
24062411
xmlMemberAccessExpression.TargetObject.AcceptVisitor(this, data);
24072412

24082413
switch (xmlMemberAccessExpression.AxisType)
@@ -2414,10 +2419,22 @@ public override object TrackedVisitXmlMemberAccessExpression(XmlMemberAccessExpr
24142419
outputFormatter.PrintText("\")");
24152420
break;
24162421
case XmlAxisType.Attribute:
2422+
if (!xmlMemberAccessExpressionOnLeftOfAssignment)
2423+
{
24172424
outputFormatter.PrintToken(Tokens.Dot);
24182425
outputFormatter.PrintText("Attribute(\"");
24192426
outputFormatter.PrintText(xmlMemberAccessExpression.Identifier);
24202427
outputFormatter.PrintText("\").Value");
2428+
}
2429+
else
2430+
{
2431+
// we need to convert assignment to method call
2432+
return AstBuilder.ExpressionBuilder.Call(
2433+
xmlMemberAccessExpression.TargetObject,
2434+
"SetAttributeValue",
2435+
new PrimitiveExpression(xmlMemberAccessExpression.Identifier),
2436+
parentAsAssignment.Right);
2437+
}
24212438
break;
24222439
case XmlAxisType.Descendents:
24232440
outputFormatter.PrintToken(Tokens.Dot);
@@ -2502,7 +2519,12 @@ public override object TrackedVisitUnaryOperatorExpression(UnaryOperatorExpressi
25022519

25032520
public override object TrackedVisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
25042521
{
2505-
TrackVisit(assignmentExpression.Left, data);
2522+
var overrideExpression = TrackVisit(assignmentExpression.Left, data) as InvocationExpression;
2523+
if (overrideExpression != null)
2524+
{
2525+
TrackVisit(overrideExpression, data);
2526+
return null;
2527+
}
25062528
if (this.prettyPrintOptions.AroundAssignmentParentheses) {
25072529
outputFormatter.Space();
25082530
}

src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,6 @@ public void XmlEntityReference2()
913913
TestStatement(@"Dim xml = <A>&quot;</A>",
914914
@"var xml = new XElement(""A"", ""\"""");");
915915
}
916-
917916

918917
[Test]
919918
public void XmlLINQDescendants()
@@ -935,12 +934,27 @@ public void XmlLINQAttribute()
935934
@"var value = someXml.Attribute(""attr"").Value;");
936935
}
937936

937+
[Test]
938+
public void XmlLINQAttributeSetConstant()
939+
{
940+
TestStatement(@"someElement.@someAttr = 8",
941+
@"someElement.SetAttributeValue(""someAttr"", 8);");
942+
}
943+
944+
[Test]
945+
public void XmlLINQAttributeSetExpression()
946+
{
947+
TestStatement(@"someElement.@someAttr = string.Format(""{0}"", 19)",
948+
@"someElement.SetAttributeValue(""someAttr"", string.Format(""{0}"", 19));");
949+
}
950+
938951
[Test]
939952
public void LinqQueryWhereSelect()
940953
{
941954
TestStatement(@"Dim value = From value In values Where value = ""someValue"" Select value",
942955
@"var value = from value in values where value == ""someValue"" select value;");
943956
}
957+
944958
[Test]
945959
public void SD2_1500a()
946960
{

0 commit comments

Comments
 (0)