Skip to content

Commit 4c7528c

Browse files
Fix issue with extra Title property on Attribute not being setup properly from construction of attribute in source generator
1 parent 549c6a1 commit 4c7528c

File tree

2 files changed

+52
-12
lines changed

2 files changed

+52
-12
lines changed

common/CommunityToolkit.Labs.Core.SourceGenerators/GeneratorExtensions.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,30 @@ public static bool HasFullyQualifiedName(this ISymbol symbol, string name)
141141

142142
return parameterTypedConstant.Value;
143143
}
144+
145+
//// From: https://github.com/CommunityToolkit/dotnet/blob/e6e09406745e2262f7946bcf8089a8f0ec4e074a/src/CommunityToolkit.Mvvm.SourceGenerators/Extensions/AttributeDataExtensions.cs#L67
146+
/// <summary>
147+
/// Tries to get a given named argument value from an <see cref="AttributeData"/> instance, if present.
148+
/// </summary>
149+
/// <typeparam name="T">The type of argument to check.</typeparam>
150+
/// <param name="attributeData">The target <see cref="AttributeData"/> instance to check.</param>
151+
/// <param name="name">The name of the argument to check.</param>
152+
/// <param name="value">The resulting argument value, if present.</param>
153+
/// <returns>Whether or not <paramref name="attributeData"/> contains an argument named <paramref name="name"/> with a valid value.</returns>
154+
public static bool TryGetNamedArgument<T>(this AttributeData attributeData, string name, out T? value)
155+
{
156+
foreach (KeyValuePair<string, TypedConstant> properties in attributeData.NamedArguments)
157+
{
158+
if (properties.Key == name)
159+
{
160+
value = (T?)properties.Value.Value;
161+
162+
return true;
163+
}
164+
}
165+
166+
value = default;
167+
168+
return false;
169+
}
144170
}

common/CommunityToolkit.Labs.Core.SourceGenerators/ToolkitSampleMetadataGenerator.Sample.cs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,33 @@ void Execute(IncrementalValuesProvider<ISymbol> types, bool skipDiagnostics = fa
5858
var generatedPaneOptions = allAttributeData
5959
.Select(static (x, _) =>
6060
{
61-
if (x.Item2.TryReconstructAs<ToolkitSampleBoolOptionAttribute>() is ToolkitSampleBoolOptionAttribute boolOptionAttribute)
62-
return (x.Item1, (ToolkitSampleOptionBaseAttribute)boolOptionAttribute);
63-
64-
if (x.Item2.TryReconstructAs<ToolkitSampleMultiChoiceOptionAttribute>() is ToolkitSampleMultiChoiceOptionAttribute multiChoiceOptionAttribute)
65-
return (x.Item1, (ToolkitSampleOptionBaseAttribute)multiChoiceOptionAttribute);
66-
67-
if (x.Item2.TryReconstructAs<ToolkitSampleNumericOptionAttribute>() is ToolkitSampleNumericOptionAttribute numericOptionAttribute)
68-
return (x.Item1, (ToolkitSampleOptionBaseAttribute)numericOptionAttribute);
61+
(ISymbol Symbol, ToolkitSampleOptionBaseAttribute Attribute) item = default;
6962

70-
if (x.Item2.TryReconstructAs<ToolkitSampleTextOptionAttribute>() is ToolkitSampleTextOptionAttribute textOptionAttribute)
71-
return (x.Item1, (ToolkitSampleOptionBaseAttribute)textOptionAttribute);
72-
73-
return default;
63+
// Try and get base attribute of whatever sample attribute types we support.
64+
if (x.Item2.TryReconstructAs<ToolkitSampleBoolOptionAttribute>() is ToolkitSampleBoolOptionAttribute boolOptionAttribute)
65+
{
66+
item = (x.Item1, boolOptionAttribute);
67+
}
68+
else if (x.Item2.TryReconstructAs<ToolkitSampleMultiChoiceOptionAttribute>() is ToolkitSampleMultiChoiceOptionAttribute multiChoiceOptionAttribute)
69+
{
70+
item = (x.Item1, multiChoiceOptionAttribute);
71+
}
72+
else if (x.Item2.TryReconstructAs<ToolkitSampleNumericOptionAttribute>() is ToolkitSampleNumericOptionAttribute numericOptionAttribute)
73+
{
74+
item = (x.Item1, numericOptionAttribute);
75+
}
76+
else if (x.Item2.TryReconstructAs<ToolkitSampleTextOptionAttribute>() is ToolkitSampleTextOptionAttribute textOptionAttribute)
77+
{
78+
item = (x.Item1, textOptionAttribute);
79+
}
80+
81+
// Add extra property data, like Title back to Attribute
82+
if (item.Attribute != null && x.Item2.TryGetNamedArgument(nameof(ToolkitSampleOptionBaseAttribute.Title), out string? title) && !string.IsNullOrWhiteSpace(title))
83+
{
84+
item.Attribute.Title = title;
85+
}
86+
87+
return item;
7488
})
7589
.Where(static x => x != default)
7690
.Collect();

0 commit comments

Comments
 (0)