Skip to content
This repository was archived by the owner on Jul 12, 2022. It is now read-only.

Commit 2dbd20c

Browse files
committed
Fix VB Module Sub New
Members of a Module are implicitly Shared. Hence a Sub New is really a static constructor and hence can't have a modifier. closes #84
1 parent 2a41e29 commit 2dbd20c

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

src/Microsoft.DotNet.CodeFormatting.Tests/Rules/ExplicitVisibilityRuleTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,28 @@ End Sub
825825
Verify(text, expected, runFormatter: false, languageName: LanguageNames.VisualBasic);
826826
}
827827

828+
/// <summary>
829+
/// Members of a Module are implicitly Shared hence New here is a static ctor and cannot have
830+
/// any visibility modifiers.
831+
/// </summary>
832+
[Fact]
833+
public void ConstructorOnModules()
834+
{
835+
var text = @"
836+
Module M
837+
Sub New()
838+
End Sub
839+
End Module";
840+
841+
var expected = @"
842+
Friend Module M
843+
Sub New()
844+
End Sub
845+
End Module";
846+
847+
Verify(text, expected, runFormatter: false, languageName: LanguageNames.VisualBasic);
848+
}
849+
828850
[Fact]
829851
public void InterfaceMembers()
830852
{

src/Microsoft.DotNet.CodeFormatting/Rules/ExplicitVisibilityRule.VisualBasic.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ private sealed class VisualBasicVisibilityRewriter : VisualBasicSyntaxRewriter
2121
private readonly Document _document;
2222
private readonly CancellationToken _cancellationToken;
2323
private SemanticModel _semanticModel;
24+
private bool _inModule;
2425

2526
internal VisualBasicVisibilityRewriter(Document document, CancellationToken cancellationToken)
2627
{
@@ -69,7 +70,17 @@ public override SyntaxNode VisitInterfaceBlock(InterfaceBlockSyntax originalNode
6970

7071
public override SyntaxNode VisitModuleBlock(ModuleBlockSyntax node)
7172
{
72-
node = (ModuleBlockSyntax)base.VisitModuleBlock(node);
73+
var savedInModule = _inModule;
74+
try
75+
{
76+
_inModule = true;
77+
node = (ModuleBlockSyntax)base.VisitModuleBlock(node);
78+
}
79+
finally
80+
{
81+
_inModule = savedInModule;
82+
}
83+
7384
var begin = (ModuleStatementSyntax)EnsureVisibility(
7485
node.ModuleStatement,
7586
node.ModuleStatement.ModuleKeyword,
@@ -110,7 +121,7 @@ public override SyntaxNode VisitMethodStatement(MethodStatementSyntax node)
110121

111122
public override SyntaxNode VisitSubNewStatement(SubNewStatementSyntax node)
112123
{
113-
if (node.Modifiers.Any(x => x.IsKind(SyntaxKind.SharedKeyword)))
124+
if (node.Modifiers.Any(x => x.IsKind(SyntaxKind.SharedKeyword)) || _inModule)
114125
{
115126
return node;
116127
}

0 commit comments

Comments
 (0)