Skip to content

Commit faaa3fc

Browse files
committed
Promote visibility of members in all templates
We were only promoting members in templates whose declaring types explicitly specified a visibility modifier. Fixes #457
1 parent 718e8f7 commit faaa3fc

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

src/Microsoft.Windows.CsWin32/Generator.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3707,19 +3707,20 @@ private MemberDeclarationSyntax ElevateVisibility(MemberDeclarationSyntax member
37073707
{
37083708
if (this.Visibility == SyntaxKind.PublicKeyword)
37093709
{
3710-
int indexOfInternal = member.Modifiers.IndexOf(SyntaxKind.InternalKeyword);
3710+
MemberDeclarationSyntax publicMember = member;
3711+
int indexOfInternal = publicMember.Modifiers.IndexOf(SyntaxKind.InternalKeyword);
37113712
if (indexOfInternal >= 0)
37123713
{
3713-
MemberDeclarationSyntax publicMember = member.WithModifiers(member.Modifiers.Replace(member.Modifiers[indexOfInternal], TokenWithSpace(this.Visibility)));
3714-
3715-
// Apply change recursively.
3716-
if (publicMember is TypeDeclarationSyntax memberContainer)
3717-
{
3718-
publicMember = memberContainer.WithMembers(List(memberContainer.Members.Select(this.ElevateVisibility)));
3719-
}
3714+
publicMember = publicMember.WithModifiers(publicMember.Modifiers.Replace(publicMember.Modifiers[indexOfInternal], TokenWithSpace(this.Visibility)));
3715+
}
37203716

3721-
return publicMember;
3717+
// Apply change recursively.
3718+
if (publicMember is TypeDeclarationSyntax memberContainer)
3719+
{
3720+
publicMember = memberContainer.WithMembers(List(memberContainer.Members.Select(this.ElevateVisibility)));
37223721
}
3722+
3723+
return publicMember;
37233724
}
37243725

37253726
return member;

test/Microsoft.Windows.CsWin32.Tests/GeneratorTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,45 @@ public void SimplestMethod(string tfm)
118118
}
119119
}
120120

121+
[Theory]
122+
[PairwiseData]
123+
public void TemplateProvidedMembersMatchVisibilityWithContainingType_Methods(bool generatePublic)
124+
{
125+
this.generator = this.CreateGenerator(new GeneratorOptions { Public = generatePublic });
126+
Assert.True(this.generator.TryGenerate("HRESULT", CancellationToken.None));
127+
this.CollectGeneratedCode(this.generator);
128+
this.AssertNoDiagnostics();
129+
130+
MethodDeclarationSyntax? generatedMethod = this.FindGeneratedMethod("ThrowOnFailure").Single();
131+
SyntaxKind expectedVisibility = generatePublic ? SyntaxKind.PublicKeyword : SyntaxKind.InternalKeyword;
132+
Assert.True(generatedMethod.Modifiers.Any(expectedVisibility));
133+
}
134+
135+
[Theory]
136+
[PairwiseData]
137+
public void TemplateProvidedMembersMatchVisibilityWithContainingType_OtherMemberTypes(bool generatePublic)
138+
{
139+
this.generator = this.CreateGenerator(new GeneratorOptions { Public = generatePublic });
140+
Assert.True(this.generator.TryGenerate("PCSTR", CancellationToken.None));
141+
this.CollectGeneratedCode(this.generator);
142+
this.AssertNoDiagnostics();
143+
144+
StructDeclarationSyntax? pcstrType = (StructDeclarationSyntax?)this.FindGeneratedType("PCSTR").Single();
145+
SyntaxKind expectedVisibility = generatePublic ? SyntaxKind.PublicKeyword : SyntaxKind.InternalKeyword;
146+
147+
// Assert fields
148+
Assert.Contains(pcstrType?.Members.OfType<FieldDeclarationSyntax>(), f => f.Declaration.Variables.Any(v => v.Identifier.ValueText == "Value") && f.Modifiers.Any(expectedVisibility));
149+
150+
// Assert properties
151+
Assert.Contains(pcstrType?.Members.OfType<PropertyDeclarationSyntax>(), p => p.Identifier.ValueText == "Length" && p.Modifiers.Any(expectedVisibility));
152+
153+
// Assert constructors
154+
Assert.All(pcstrType?.Members.OfType<ConstructorDeclarationSyntax>(), c => c.Modifiers.Any(expectedVisibility));
155+
156+
// Assert that private members remain private.
157+
Assert.Contains(pcstrType?.Members.OfType<PropertyDeclarationSyntax>(), p => p.Identifier.ValueText == "DebuggerDisplay" && p.Modifiers.Any(SyntaxKind.PrivateKeyword));
158+
}
159+
121160
[Fact]
122161
public void SupportedOSPlatform_AppearsOnFriendlyOverloads()
123162
{

0 commit comments

Comments
 (0)