Skip to content

Commit 5a8fd0b

Browse files
committed
Update [ICommand] generator for Task<T> returns
1 parent bf4b5f6 commit 5a8fd0b

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

CommunityToolkit.Mvvm.SourceGenerators/Input/ICommandGenerator.Execute.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,9 @@ public static (string FieldName, string PropertyName) GetGeneratedFieldAndProper
309309
{
310310
string propertyName = methodSymbol.Name;
311311

312-
if (methodSymbol.ReturnType.HasFullyQualifiedName("global::System.Threading.Tasks.Task") &&
313-
methodSymbol.Name.EndsWith("Async"))
312+
if (methodSymbol.Name.EndsWith("Async") &&
313+
(methodSymbol.ReturnType.HasFullyQualifiedName("global::System.Threading.Tasks.Task") ||
314+
methodSymbol.ReturnType.InheritsFromFullyQualifiedName("global::System.Threading.Tasks.Task")))
314315
{
315316
propertyName = propertyName.Substring(0, propertyName.Length - "Async".Length);
316317
}
@@ -372,7 +373,9 @@ private static bool TryMapCommandTypesFromMethod(
372373
return true;
373374
}
374375

375-
if (methodSymbol.ReturnType.HasFullyQualifiedName("global::System.Threading.Tasks.Task"))
376+
// Map all Task-returning methods
377+
if (methodSymbol.ReturnType.HasFullyQualifiedName("global::System.Threading.Tasks.Task") ||
378+
methodSymbol.ReturnType.InheritsFromFullyQualifiedName("global::System.Threading.Tasks.Task"))
376379
{
377380
// Map <void, Task> to IAsyncRelayCommand, AsyncRelayCommand, Func<Task>
378381
if (methodSymbol.Parameters.Length == 0)

CommunityToolkit.Mvvm/Input/Attributes/ICommandAttribute.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,15 @@ namespace CommunityToolkit.Mvvm.Input;
5151
/// <code>
5252
/// Task Method();
5353
/// Task Method(CancellationToken);
54+
/// Task&lt;T&gt; Method();
55+
/// Task&lt;T&gt; Method(CancellationToken);
5456
/// </code>
5557
/// Will both generate an <see cref="IAsyncRelayCommand"/> property (using an <see cref="AsyncRelayCommand{T}"/> instance).
5658
/// <code>
5759
/// Task Method(T?);
5860
/// Task Method(T?, CancellationToken);
61+
/// Task&lt;T&gt; Method(T?);
62+
/// Task&lt;T&gt; Method(T?, CancellationToken);
5963
/// </code>
6064
/// Will both generate an <see cref="IAsyncRelayCommand{T}"/> property (using an <see cref="AsyncRelayCommand{T}"/> instance).
6165
/// </para>

0 commit comments

Comments
 (0)