Skip to content

Commit 342e919

Browse files
VB->C# convert region names in common cases - #15
1 parent 8a05f9e commit 342e919

4 files changed

Lines changed: 67 additions & 2 deletions

File tree

CodeConverter/Util/SyntaxNodeExtensions.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using CompilationUnitSyntax = Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax;
1414
using CSharpExtensions = Microsoft.CodeAnalysis.CSharp.CSharpExtensions;
1515
using VBSyntaxFactory = Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory;
16+
using VBSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax;
1617
using VBSyntaxKind = Microsoft.CodeAnalysis.VisualBasic.SyntaxKind;
1718
using CSSyntaxKind = Microsoft.CodeAnalysis.CSharp.SyntaxKind;
1819
using FieldDeclarationSyntax = Microsoft.CodeAnalysis.CSharp.Syntax.FieldDeclarationSyntax;
@@ -369,6 +370,8 @@ public static IEnumerable<SyntaxTrivia> ConvertTrivia(this IReadOnlyCollection<S
369370

370371
private static IEnumerable<SyntaxTrivia> ConvertVBTrivia(SyntaxTrivia t)
371372
{
373+
var endOfLine = SyntaxFactory.EndOfLine(Environment.NewLine);
374+
372375
if (t.IsKind(VBSyntaxKind.CommentTrivia)) {
373376
yield return SyntaxFactory.SyntaxTrivia(CSSyntaxKind.SingleLineCommentTrivia, $"// {t.GetCommentText()}");
374377
yield break;
@@ -394,6 +397,19 @@ private static IEnumerable<SyntaxTrivia> ConvertVBTrivia(SyntaxTrivia t)
394397
yield break;
395398
}
396399

400+
if (t.HasStructure && t.GetStructure() is VBSyntax.RegionDirectiveTriviaSyntax rdts) {
401+
var regionDirective = SyntaxFactory.RegionDirectiveTrivia(true);
402+
var regionKeyword = regionDirective.RegionKeyword.WithTrailingTrivia(SyntaxFactory.Space);
403+
var endOfDirectiveToken = regionDirective.EndOfDirectiveToken.WithLeadingTrivia(SyntaxFactory.PreprocessingMessage(rdts.Name.Text.Trim('"'))).WithTrailingTrivia(endOfLine);
404+
yield return SyntaxFactory.Trivia(regionDirective.WithRegionKeyword(regionKeyword).WithEndOfDirectiveToken(endOfDirectiveToken));
405+
yield break;
406+
}
407+
408+
if (t.IsKind(VBSyntaxKind.EndRegionDirectiveTrivia)) {
409+
yield return SyntaxFactory.Trivia(SyntaxFactory.EndRegionDirectiveTrivia(true).WithTrailingTrivia(endOfLine));
410+
yield break;
411+
}
412+
397413
//Each of these would need its own method to recreate for C# with the right structure probably so let's just warn about them for now.
398414
var convertedKind = t.GetCSKind();
399415
yield return convertedKind.HasValue

Tests/CSharp/TriviaTests.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,48 @@ public void Deposit(int Item, bool ColaOnly, bool MonteCarloLogActive, Func<bool
5454
}
5555
}");
5656
}
57+
58+
[Fact]
59+
public async Task Issue15_NestedRegionsAsync()
60+
{
61+
await TestConversionVisualBasicToCSharpAsync(
62+
@"#Region ""Whole File""
63+
#Region ""Nested""
64+
Imports System
65+
66+
#Region ""Class""
67+
Module Program
68+
#Region ""Inside Class""
69+
Sub Main(args As String())
70+
#Region ""Inside Method""
71+
Console.WriteLine(""Hello World!"")
72+
#End Region
73+
End Sub
74+
#End Region
75+
End Module
76+
#End Region
77+
#End Region
78+
#End Region
79+
",
80+
@"#region Whole File
81+
#region Nested
82+
using System;
83+
84+
#region Class
85+
internal static partial class Program
86+
{
87+
#region Inside Class
88+
public static void Main(string[] args)
89+
{
90+
#region Inside Method
91+
Console.WriteLine(""Hello World!"");
92+
#endregion
93+
}
94+
#endregion
95+
}
96+
#endregion
97+
#endregion
98+
#endregion");
99+
}
57100
}
58101
}

Tests/TestData/MultiFileCharacterization/VBToCSResults/ConvertVbLibraryOnly/VbLibrary/My Project/Settings.Designer.cs

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tests/TestData/MultiFileCharacterization/VBToCSResults/ConvertWholeSolution/VbLibrary/My Project/Settings.Designer.cs

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)