Skip to content

Commit 4cd8a7c

Browse files
committed
Added XML docs copying from fields to generated properties
1 parent 8b708f6 commit 4cd8a7c

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

Microsoft.Toolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.SyntaxReceiver.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,16 @@ public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
3434
if (context.Node is FieldDeclarationSyntax { AttributeLists: { Count: > 0 } } fieldDeclaration &&
3535
context.SemanticModel.Compilation.GetTypeByMetadataName("Microsoft.Toolkit.Mvvm.ComponentModel.ObservablePropertyAttribute") is INamedTypeSymbol attributeSymbol)
3636
{
37+
SyntaxTriviaList leadingTrivia = fieldDeclaration.GetLeadingTrivia();
38+
3739
foreach (VariableDeclaratorSyntax variableDeclarator in fieldDeclaration.Declaration.Variables)
3840
{
3941
if (context.SemanticModel.GetDeclaredSymbol(variableDeclarator) is IFieldSymbol fieldSymbol &&
4042
fieldSymbol.GetAttributes().FirstOrDefault(a => SymbolEqualityComparer.Default.Equals(a.AttributeClass, attributeSymbol)) is AttributeData attributeData &&
4143
attributeData.ApplicationSyntaxReference is SyntaxReference syntaxReference &&
4244
syntaxReference.GetSyntax() is AttributeSyntax attributeSyntax)
4345
{
44-
this.gatheredInfo.Add(new Item(variableDeclarator, fieldSymbol, attributeSyntax, attributeData));
46+
this.gatheredInfo.Add(new Item(leadingTrivia, variableDeclarator, fieldSymbol, attributeSyntax, attributeData));
4547
}
4648
}
4749
}
@@ -50,11 +52,13 @@ attributeData.ApplicationSyntaxReference is SyntaxReference syntaxReference &&
5052
/// <summary>
5153
/// A model for a group of item representing a discovered type to process.
5254
/// </summary>
55+
/// <param name="LeadingTrivia">The leading trivia for the field declaration.</param>
5356
/// <param name="FieldDeclarator">The <see cref="VariableDeclaratorSyntax"/> instance for the target field variable declaration.</param>
5457
/// <param name="FieldSymbol">The <see cref="IFieldSymbol"/> instance for <paramref name="FieldDeclarator"/>.</param>
5558
/// <param name="AttributeSyntax">The <see cref="AttributeSyntax"/> instance for the target attribute over <paramref name="FieldDeclarator"/>.</param>
5659
/// <param name="AttributeData">The <see cref="AttributeData"/> instance for <paramref name="AttributeSyntax"/>.</param>
5760
public sealed record Item(
61+
SyntaxTriviaList LeadingTrivia,
5862
VariableDeclaratorSyntax FieldDeclarator,
5963
IFieldSymbol FieldSymbol,
6064
AttributeSyntax AttributeSyntax,

Microsoft.Toolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ private static void OnExecute(
7171
var classDeclarationSyntax =
7272
ClassDeclaration(classDeclarationSymbol.Name)
7373
.WithModifiers(classDeclaration.Modifiers)
74-
.AddMembers(items.Select(static item => CreatePropertyDeclaration(item.FieldSymbol)).ToArray());
74+
.AddMembers(items.Select(static item => CreatePropertyDeclaration(item.LeadingTrivia, item.FieldSymbol)).ToArray());
7575

7676
TypeDeclarationSyntax typeDeclarationSyntax = classDeclarationSyntax;
7777

@@ -112,10 +112,11 @@ private static void OnExecute(
112112
/// <summary>
113113
/// Creates a <see cref="PropertyDeclarationSyntax"/> instance for a specified field.
114114
/// </summary>
115+
/// <param name="leadingTrivia">The leading trivia for the field to process.</param>
115116
/// <param name="fieldSymbol">The input <see cref="IFieldSymbol"/> instance to process.</param>
116117
/// <returns>A generated <see cref="PropertyDeclarationSyntax"/> instance for the input field.</returns>
117118
[Pure]
118-
private static PropertyDeclarationSyntax CreatePropertyDeclaration(IFieldSymbol fieldSymbol)
119+
private static PropertyDeclarationSyntax CreatePropertyDeclaration(SyntaxTriviaList leadingTrivia, IFieldSymbol fieldSymbol)
119120
{
120121
// Get the field type and the target property name
121122
string
@@ -152,6 +153,7 @@ private static PropertyDeclarationSyntax CreatePropertyDeclaration(IFieldSymbol
152153

153154
// Construct the generated property as follows:
154155
//
156+
// <FIELD_TRIVIA>
155157
// [DebuggerNonUserCode]
156158
// [ExcludeFromCodeCoverage]
157159
// public <FIELD_TYPE> <PROPERTY_NAME>
@@ -172,6 +174,7 @@ private static PropertyDeclarationSyntax CreatePropertyDeclaration(IFieldSymbol
172174
.AddAttributeLists(
173175
AttributeList(SingletonSeparatedList(Attribute(IdentifierName("DebuggerNonUserCode")))),
174176
AttributeList(SingletonSeparatedList(Attribute(IdentifierName("ExcludeFromCodeCoverage")))))
177+
.WithLeadingTrivia(leadingTrivia)
175178
.AddModifiers(Token(SyntaxKind.PublicKeyword))
176179
.AddAccessorListAccessors(
177180
AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)

UnitTests/UnitTests.NetCore/Mvvm/Test_ObservablePropertyAttribute.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public void Test_ObservablePropertyAttribute_Events()
5252

5353
public partial class SampleModel : ObservableObject
5454
{
55+
/// <summary>
56+
/// This is a sample data field within <see cref="SampleModel"/> of type <see cref="int"/>.
57+
/// </summary>
5558
[ObservableProperty]
5659
private int data;
5760
}

0 commit comments

Comments
 (0)