Browse Source

Merge pull request #42 from sharpmonkey/master

VB.Net to C# conversion bugs
pull/41/merge
Siegfried Oleg Pammer 12 years ago
parent
commit
4f1262eca9
  1. 69
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs
  2. 41
      src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs

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

@ -2401,6 +2401,53 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
return null; return null;
} }
public override object TrackedVisitXmlMemberAccessExpression(XmlMemberAccessExpression xmlMemberAccessExpression, object data)
{
var parentAsAssignment = xmlMemberAccessExpression.Parent as AssignmentExpression;
var xmlMemberAccessExpressionOnLeftOfAssignment = parentAsAssignment != null && parentAsAssignment.Left == xmlMemberAccessExpression;
// only output identifier expression if we are not overriding assignment with method call
if(!(xmlMemberAccessExpression.AxisType == XmlAxisType.Attribute && xmlMemberAccessExpressionOnLeftOfAssignment))
xmlMemberAccessExpression.TargetObject.AcceptVisitor(this, data);
switch (xmlMemberAccessExpression.AxisType)
{
case XmlAxisType.Element:
outputFormatter.PrintToken(Tokens.Dot);
outputFormatter.PrintText("Elements(\"");
outputFormatter.PrintText(xmlMemberAccessExpression.Identifier);
outputFormatter.PrintText("\")");
break;
case XmlAxisType.Attribute:
if (!xmlMemberAccessExpressionOnLeftOfAssignment)
{
outputFormatter.PrintToken(Tokens.Dot);
outputFormatter.PrintText("Attribute(\"");
outputFormatter.PrintText(xmlMemberAccessExpression.Identifier);
outputFormatter.PrintText("\").Value");
}
else
{
// we need to convert assignment to method call
return AstBuilder.ExpressionBuilder.Call(
xmlMemberAccessExpression.TargetObject,
"SetAttributeValue",
new PrimitiveExpression(xmlMemberAccessExpression.Identifier),
parentAsAssignment.Right);
}
break;
case XmlAxisType.Descendents:
outputFormatter.PrintToken(Tokens.Dot);
outputFormatter.PrintText("Descendants(\"");
outputFormatter.PrintText(xmlMemberAccessExpression.Identifier);
outputFormatter.PrintText("\")");
break;
default:
throw new Exception("Invalid value for XmlAxisType");
}
return null;
}
public override object TrackedVisitIdentifierExpression(IdentifierExpression identifierExpression, object data) public override object TrackedVisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
{ {
outputFormatter.PrintIdentifier(identifierExpression.Identifier); outputFormatter.PrintIdentifier(identifierExpression.Identifier);
@ -2472,7 +2519,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public override object TrackedVisitAssignmentExpression(AssignmentExpression assignmentExpression, object data) public override object TrackedVisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
{ {
TrackVisit(assignmentExpression.Left, data); var overrideExpression = TrackVisit(assignmentExpression.Left, data) as InvocationExpression;
if (overrideExpression != null)
{
TrackVisit(overrideExpression, data);
return null;
}
if (this.prettyPrintOptions.AroundAssignmentParentheses) { if (this.prettyPrintOptions.AroundAssignmentParentheses) {
outputFormatter.Space(); outputFormatter.Space();
} }
@ -3188,8 +3240,21 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
return selectClause.Projection.AcceptVisitor(this, data); return selectClause.Projection.AcceptVisitor(this, data);
} }
public override object TrackedVisitQueryExpressionWhereClause(QueryExpressionWhereClause whereClause, object data) public override object TrackedVisitQueryExpressionSelectVBClause(QueryExpressionSelectVBClause queryExpressionSelectVBClause, object data)
{
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Select);
outputFormatter.Space();
foreach (var v in queryExpressionSelectVBClause.Variables)
{
v.AcceptVisitor(this, data);
}
return null;
}
public override object TrackedVisitQueryExpressionWhereClause(QueryExpressionWhereClause whereClause, object data)
{ {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Where); outputFormatter.PrintToken(Tokens.Where);
outputFormatter.Space(); outputFormatter.Space();
return whereClause.Condition.AcceptVisitor(this, data); return whereClause.Condition.AcceptVisitor(this, data);

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

@ -914,6 +914,47 @@ static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.Stat
@"var xml = new XElement(""A"", ""\"""");"); @"var xml = new XElement(""A"", ""\"""");");
} }
[Test]
public void XmlLINQDescendants()
{
TestStatement(@"Dim element = someXml...<somename>",
@"var element = someXml.Descendants(""somename"");");
}
[Test]
public void XmlLINQElements()
{
TestStatement(@"Dim element = someXml.<somename>",
@"var element = someXml.Elements(""somename"");");
}
[Test]
public void XmlLINQAttribute()
{
TestStatement(@"Dim value = someXml.@attr",
@"var value = someXml.Attribute(""attr"").Value;");
}
[Test]
public void XmlLINQAttributeSetConstant()
{
TestStatement(@"someElement.@someAttr = 8",
@"someElement.SetAttributeValue(""someAttr"", 8);");
}
[Test]
public void XmlLINQAttributeSetExpression()
{
TestStatement(@"someElement.@someAttr = string.Format(""{0}"", 19)",
@"someElement.SetAttributeValue(""someAttr"", string.Format(""{0}"", 19));");
}
[Test]
public void LinqQueryWhereSelect()
{
TestStatement(@"Dim value = From value In values Where value = ""someValue"" Select value",
@"var value = from value in values where value == ""someValue"" select value;");
}
[Test] [Test]
public void SD2_1500a() public void SD2_1500a()
{ {

Loading…
Cancel
Save