From 89dc15437e19bc12805e8279494da4db0aafd098 Mon Sep 17 00:00:00 2001 From: Gregor Pacnik Date: Mon, 24 Jun 2013 13:26:33 +1000 Subject: [PATCH 1/3] properly handle VB.Net to CS LINQ where and select output --- .../PrettyPrinter/CSharp/CSharpOutputVisitor.cs | 17 +++++++++++++++-- .../Output/CSharp/VBNetToCSharpConverterTest.cs | 7 +++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs index 80cfbbdd336..cbbf324e9d3 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs @@ -3187,9 +3187,22 @@ public override object TrackedVisitQueryExpressionSelectClause(QueryExpressionSe outputFormatter.Space(); 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.Space(); return whereClause.Condition.AcceptVisitor(this, data); diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs index e73d4fcde03..b63df2ee0a2 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs @@ -914,6 +914,13 @@ public void XmlEntityReference2() @"var xml = new XElement(""A"", ""\"""");"); } + + [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] public void SD2_1500a() { From 8a9b312dcf5ee3148fe0e4f043246765c60f3f3d Mon Sep 17 00:00:00 2001 From: Gregor Pacnik Date: Mon, 24 Jun 2013 13:30:16 +1000 Subject: [PATCH 2/3] handle VB.Net Axis LINQ syntax to CS conversion with tests --- .../CSharp/CSharpOutputVisitor.cs | 32 ++++++++++++++++++- .../CSharp/VBNetToCSharpConverterTest.cs | 20 ++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs index cbbf324e9d3..cce25f8eb48 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs @@ -2400,7 +2400,37 @@ public override object TrackedVisitInvocationExpression(InvocationExpression inv outputFormatter.PrintToken(Tokens.CloseParenthesis); return null; } - + + public override object TrackedVisitXmlMemberAccessExpression(XmlMemberAccessExpression xmlMemberAccessExpression, object data) + { + 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: + outputFormatter.PrintToken(Tokens.Dot); + outputFormatter.PrintText("Attribute(\""); + outputFormatter.PrintText(xmlMemberAccessExpression.Identifier); + outputFormatter.PrintText("\").Value"); + 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) { outputFormatter.PrintIdentifier(identifierExpression.Identifier); diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs index b63df2ee0a2..aebb178470b 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs @@ -915,6 +915,26 @@ public void XmlEntityReference2() } + [Test] + public void XmlLINQDescendants() + { + TestStatement(@"Dim element = someXml...", + @"var element = someXml.Descendants(""somename"");"); + } + [Test] + public void XmlLINQElements() + { + TestStatement(@"Dim element = someXml.", + @"var element = someXml.Elements(""somename"");"); + } + + [Test] + public void XmlLINQAttribute() + { + TestStatement(@"Dim value = someXml.@attr", + @"var value = someXml.Attribute(""attr"").Value;"); + } + [Test] public void LinqQueryWhereSelect() { From 8273535734d734bef5af0d12b151cc6242cbf678 Mon Sep 17 00:00:00 2001 From: Gregor Pacnik Date: Mon, 24 Jun 2013 13:31:22 +1000 Subject: [PATCH 3/3] handle VB.Net to CS conversion set attribute Axis syntax; replace assignment with call --- .../CSharp/CSharpOutputVisitor.cs | 24 ++++++++++++++++++- .../CSharp/VBNetToCSharpConverterTest.cs | 16 ++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs index cce25f8eb48..263d979b9ba 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs @@ -2403,6 +2403,11 @@ public override object TrackedVisitInvocationExpression(InvocationExpression inv 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) @@ -2414,10 +2419,22 @@ public override object TrackedVisitXmlMemberAccessExpression(XmlMemberAccessExpr 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); @@ -2502,7 +2519,12 @@ public override object TrackedVisitUnaryOperatorExpression(UnaryOperatorExpressi 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) { outputFormatter.Space(); } diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs index aebb178470b..e33bfc08f7b 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/VBNetToCSharpConverterTest.cs @@ -913,7 +913,6 @@ public void XmlEntityReference2() TestStatement(@"Dim xml = "", @"var xml = new XElement(""A"", ""\"""");"); } - [Test] public void XmlLINQDescendants() @@ -935,12 +934,27 @@ public void XmlLINQAttribute() @"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] public void SD2_1500a() {