diff --git a/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs b/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs index 27fd4e48f..ac1aa03d9 100644 --- a/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs +++ b/ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs @@ -1004,8 +1004,10 @@ public override CSharpSyntaxNode VisitQueryExpression(VBSyntax.QueryExpressionSy var vbFromClause = node.Clauses.OfType().Single(); var fromClauseSyntax = ConvertFromClauseSyntax(vbFromClause); var vbGroupClause = node.Clauses.OfType().SingleOrDefault(); - var vbSelectClause = node.Clauses.OfType().Single(); - var selectClauseSyntax = ConvertSelectClauseSyntax(vbSelectClause); + var vbSelectClause = node.Clauses.OfType().SingleOrDefault(); + var selectClauseSyntax = vbSelectClause != null + ? ConvertSelectClauseSyntax(vbSelectClause) + : CreateDefaultSelectClause(fromClauseSyntax); var alreadyConverted = new VBSyntax.QueryClauseSyntax[] { vbFromClause, vbGroupClause, vbSelectClause }; var vbBodyClauses = node.Clauses; SelectOrGroupClauseSyntax selectOrGroup = null; @@ -1041,6 +1043,11 @@ private SelectClauseSyntax ConvertSelectClauseSyntax(VBSyntax.SelectClauseSyntax ); } + private static SelectClauseSyntax CreateDefaultSelectClause(FromClauseSyntax fromClauseSyntax) + { + return SyntaxFactory.SelectClause(SyntaxFactory.IdentifierName(fromClauseSyntax.Identifier)); + } + private QueryClauseSyntax ConvertQueryBodyClause(VBSyntax.QueryClauseSyntax node) { return node.TypeSwitch( diff --git a/ICSharpCode.CodeConverter/VB/CommentConvertingNodesVisitor.cs b/ICSharpCode.CodeConverter/VB/CommentConvertingNodesVisitor.cs index 3df950a77..33100836f 100644 --- a/ICSharpCode.CodeConverter/VB/CommentConvertingNodesVisitor.cs +++ b/ICSharpCode.CodeConverter/VB/CommentConvertingNodesVisitor.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis.VisualBasic; using VbSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax; using CsSyntax = Microsoft.CodeAnalysis.CSharp.Syntax; +using SyntaxFactory = Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory; namespace ICSharpCode.CodeConverter.VB { @@ -26,5 +27,12 @@ public override VisualBasicSyntaxNode DefaultVisit(SyntaxNode node) { return TriviaConverter.PortConvertedTrivia(node, _wrappedVisitor.Visit(node)); } + + public override VisualBasicSyntaxNode VisitAttributeList(CsSyntax.AttributeListSyntax node) + { + var convertedNode = _wrappedVisitor.Visit(node) + .WithPrependedLeadingTrivia(SyntaxFactory.EndOfLineTrivia(Environment.NewLine)); + return TriviaConverter.PortConvertedTrivia(node, convertedNode); + } } } \ No newline at end of file diff --git a/Tests/CSharp/ExpressionTests.cs b/Tests/CSharp/ExpressionTests.cs index 3dbc1957c..868b2aba7 100644 --- a/Tests/CSharp/ExpressionTests.cs +++ b/Tests/CSharp/ExpressionTests.cs @@ -592,6 +592,24 @@ join p in products on c equals p.Category into ps }"); } + [Fact] + public void Linq5() + { + TestConversionVisualBasicToCSharp(@"Private Shared Function FindPicFilePath(picId As String) As String + For Each FileInfo As FileInfo In From FileInfo1 In AList Where FileInfo1.Name.Substring(0, 6) = picId + Return FileInfo.FullName + Next + Return String.Empty +End Function", @"private static string FindPicFilePath(string picId) +{ + foreach (FileInfo FileInfo in from FileInfo1 in AList + where FileInfo1.Name.Substring(0, 6) == picId + select FileInfo1) + return FileInfo.FullName; + return string.Empty; +}"); + } + [Fact] public void PartiallyQualifiedName() { diff --git a/Tests/VB/MemberTests.cs b/Tests/VB/MemberTests.cs index 522eba6e2..e8840a2fe 100644 --- a/Tests/VB/MemberTests.cs +++ b/Tests/VB/MemberTests.cs @@ -187,6 +187,21 @@ End Property End Class"); } + [Fact] + public void TestPropertyWithAttribute() + { + TestConversionCSharpToVisualBasic( + @"class TestClass +{ + [DatabaseGenerated(DatabaseGeneratedOption.None)] + int value { get; set; } +}", @"Class TestClass + + Private Property value As Integer +End Class +"); + } + [Fact] public void TestConstructor() {