Skip to content

Commit 7888eb0

Browse files
committed
improve implementation for AttributeDeclarationOptions.OmitInaccessibleMembersInNullStateAttribute
1 parent a520f95 commit 7888eb0

File tree

2 files changed

+34
-19
lines changed

2 files changed

+34
-19
lines changed

src/Smdn.Reflection.ReverseGenerating/Smdn.Reflection.ReverseGenerating/Generator.Attributes.cs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,31 @@ AttributeSectionFormat.Discrete or
154154

155155
var attributes = GetAttributes(attributeProvider, options.AttributeDeclaration.TypeFilter)
156156
.OrderBy(static attr => attr.GetAttributeType().FullName)
157-
.Select(attr =>
158-
(
159-
name: ConvertAttributeName(attr),
160-
args: string.Join(", ", ConvertAttributeArguments(attr))
161-
)
162-
);
157+
.Select(attr => {
158+
var omitInaccessibleMembersInNullStateAttribute =
159+
options.AttributeDeclaration.OmitInaccessibleMembersInNullStateAttribute &&
160+
IsMemberNullStateAttributeType(attr.GetAttributeType());
161+
162+
if (omitInaccessibleMembersInNullStateAttribute) {
163+
var args = ConvertAttributeArguments(attr, omitInaccessibleMembers: true).ToList();
164+
165+
var isArgsEmpty = string.Equals("MemberNotNullWhenAttribute", attr.GetAttributeType().Name, StringComparison.Ordinal)
166+
? args.Count == 1 // with no args for 'member'/'members', only arg 'returnValue'
167+
: args.Count == 0; // with no args for 'member'/'members'
168+
169+
return (
170+
name: isArgsEmpty ? null : ConvertAttributeName(attr),
171+
args: isArgsEmpty ? null : string.Join(", ", args)
172+
);
173+
}
174+
else {
175+
return (
176+
name: ConvertAttributeName(attr),
177+
args: string.Join(", ", ConvertAttributeArguments(attr, omitInaccessibleMembers: false))
178+
);
179+
}
180+
})
181+
.Where(static a => a.name is not null);
163182

164183
if (!attributes.Any())
165184
return Enumerable.Empty<string>();
@@ -240,17 +259,13 @@ string ConvertAttributeName(CustomAttributeData attr)
240259
);
241260
}
242261

243-
IEnumerable<string> ConvertAttributeArguments(CustomAttributeData attr)
262+
IEnumerable<string> ConvertAttributeArguments(CustomAttributeData attr, bool omitInaccessibleMembers)
244263
{
245-
var omitInaccessibleMembersInNullStateAttribute =
246-
options.AttributeDeclaration.OmitInaccessibleMembersInNullStateAttribute &&
247-
IsMemberNullStateAttributeType(attr.GetAttributeType());
248-
249264
foreach (var param in attr.Constructor.GetParameters()) {
250265
var arg = attr.ConstructorArguments[param.Position];
251266

252267
if (
253-
omitInaccessibleMembersInNullStateAttribute &&
268+
omitInaccessibleMembers &&
254269
string.Equals(param.Name, "member", StringComparison.Ordinal) &&
255270
arg.Value is string memberName &&
256271
!IsAccessibleMemberName(attributeProvider, memberName)
@@ -262,7 +277,7 @@ arg.Value is string memberName &&
262277
string convertedConstructorArgument;
263278

264279
if (
265-
omitInaccessibleMembersInNullStateAttribute &&
280+
omitInaccessibleMembers &&
266281
string.Equals(param.Name, "members", StringComparison.Ordinal) &&
267282
arg.Value is IEnumerable<CustomAttributeTypedArgument> members
268283
) {

tests/Smdn.Reflection.ReverseGenerating/Smdn.Reflection.ReverseGenerating.GeneratorTestCases/AttributeList.GeneratorOptions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public class NullStateAttribute {
8383
#pragma warning disable CS8774
8484
[MemberNotNull(nameof(F1))]
8585
[AttributeListTestCase(@"[MemberNotNull(""F1"")]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = false)]
86-
[AttributeListTestCase(@"[MemberNotNull]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
86+
[AttributeListTestCase(@"", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
8787
public void MemberNotNullWithNonPublicField() { }
8888

8989
[MemberNotNull(nameof(F2))]
@@ -98,7 +98,7 @@ public void MemberNotNullWithPublicField() { }
9898

9999
[MemberNotNull(nameof(P1))]
100100
[AttributeListTestCase(@"[MemberNotNull(""P1"")]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = false)]
101-
[AttributeListTestCase(@"[MemberNotNull]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
101+
[AttributeListTestCase(@"", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
102102
public void MemberNotNullWithNonPublicProperty() { }
103103

104104
[MemberNotNull(nameof(P2))]
@@ -118,15 +118,15 @@ public void MemberNotNullWithMembers() { }
118118

119119
[MemberNotNull(nameof(F1), nameof(P1))]
120120
[AttributeListTestCase(@"[MemberNotNull(new string[] { ""F1"", ""P1"" })]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = false)]
121-
[AttributeListTestCase(@"[MemberNotNull]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
121+
[AttributeListTestCase(@"", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
122122
public bool MemberNotNullWithMembersAllNonPublic()
123123
=> true;
124124
#pragma warning restore CS8774
125125

126126
#pragma warning disable CS8775
127127
[MemberNotNullWhen(true, nameof(F1))]
128128
[AttributeListTestCase(@"[MemberNotNullWhen(true, ""F1"")]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = false)]
129-
[AttributeListTestCase(@"[MemberNotNullWhen(true)]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
129+
[AttributeListTestCase(@"", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
130130
public bool MemberNotNullWhenWithNonPublicField()
131131
=> true;
132132

@@ -144,7 +144,7 @@ public bool MemberNotNullWhenWithPublicField()
144144

145145
[MemberNotNullWhen(true, nameof(P1))]
146146
[AttributeListTestCase(@"[MemberNotNullWhen(true, ""P1"")]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = false)]
147-
[AttributeListTestCase(@"[MemberNotNullWhen(true)]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
147+
[AttributeListTestCase(@"", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
148148
public bool MemberNotNullWhenWithNonPublicProperty()
149149
=> true;
150150

@@ -168,7 +168,7 @@ public bool MemberNotNullWhenWithMembers()
168168

169169
[MemberNotNullWhen(true, nameof(F1), nameof(P1))]
170170
[AttributeListTestCase(@"[MemberNotNullWhen(true, new string[] { ""F1"", ""P1"" })]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = false)]
171-
[AttributeListTestCase(@"[MemberNotNullWhen(true)]", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
171+
[AttributeListTestCase(@"", AttributeWithNamespace = false, AttributeOmitInaccessibleMembersInNullStateAttribute = true)]
172172
public bool MemberNotNullWhenWithMembersAllNonPublic()
173173
=> true;
174174
#pragma warning restore CS8775

0 commit comments

Comments
 (0)