Skip to content

Commit debb78a

Browse files
authored
Support mapping <returns> to response description (#61920)
* Support mapping <returns> to response description * Add more tests
1 parent 343594e commit debb78a

8 files changed

+66
-7
lines changed

src/OpenApi/gen/XmlCommentGenerator.Emitter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
371371
}
372372
}
373373
}
374+
// Applies `<returns>` on XML comments for operation with single response value.
375+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
376+
{
377+
var response = operation.Responses.First();
378+
response.Value.Description = returns;
379+
}
380+
// Applies `<response>` on XML comments for operation with multiple response values.
374381
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
375382
{
376383
foreach (var response in operation.Responses)

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/OperationTests.MinimalApis.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public static class RouteHandlerExtensionMethods
5555
/// <description>
5656
/// A description of the action.
5757
/// </description>
58+
/// <returns>Returns the greeting.</returns>
5859
public static string Get()
5960
{
6061
return "Hello, World!";
@@ -68,17 +69,20 @@ public static string Get2(string name)
6869
}
6970
7071
/// <param name="name" example="Testy McTester">The name of the person.</param>
72+
/// <returns>Returns the greeting.</returns>
73+
/// <returns>Returns a different greeting.</returns>
7174
public static string Get3(string name)
7275
{
7376
return $"Hello, {name}!";
7477
}
7578
76-
/// <response code="404">Indicates that the value was not found.</response>
79+
/// <returns>Indicates that the value was not found.</returns>
7780
public static NotFound<string> Get4()
7881
{
7982
return TypedResults.NotFound("Not found!");
8083
}
8184
85+
/// <returns>This gets ignored.</returns>
8286
/// <response code="200">Indicates that the value is even.</response>
8387
/// <response code="201">Indicates that the value is less than 50.</response>
8488
/// <response code="404">Indicates that the value was not found.</response>
@@ -174,6 +178,7 @@ public static ValueTask<string> Get13()
174178
/// <summary>
175179
/// A summary of Get14.
176180
/// </summary>
181+
/// <returns>Returns the greeting.</returns>
177182
public static async Task<Holder<string>> Get14()
178183
{
179184
await Task.Delay(1000);
@@ -182,6 +187,7 @@ public static async Task<Holder<string>> Get14()
182187
/// <summary>
183188
/// A summary of Get15.
184189
/// </summary>
190+
/// <response code="200">Returns the greeting.</response>
185191
public static Task<Holder<string>> Get15()
186192
{
187193
return Task.FromResult(new Holder<string> { Value = "Hello, World!" });
@@ -234,6 +240,7 @@ await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
234240
var path = document.Paths["/1"].Operations[HttpMethod.Get];
235241
Assert.Equal("A summary of the action.", path.Summary);
236242
Assert.Equal("A description of the action.", path.Description);
243+
Assert.Equal("Returns the greeting.", path.Responses["200"].Description);
237244

238245
var path2 = document.Paths["/2"].Operations[HttpMethod.Get];
239246
Assert.Equal("The name of the person.", path2.Parameters[0].Description);
@@ -243,6 +250,7 @@ await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
243250
Assert.Equal("The name of the person.", path3.Parameters[0].Description);
244251
var example = Assert.IsAssignableFrom<JsonNode>(path3.Parameters[0].Example);
245252
Assert.Equal("\"Testy McTester\"", example.ToJsonString());
253+
Assert.Equal("Returns the greeting.", path3.Responses["200"].Description);
246254

247255
var path4 = document.Paths["/4"].Operations[HttpMethod.Get];
248256
var response = path4.Responses["404"];
@@ -285,9 +293,11 @@ await SnapshotTestHelper.VerifyOpenApi(compilation, document =>
285293

286294
var path14 = document.Paths["/14"].Operations[HttpMethod.Get];
287295
Assert.Equal("A summary of Get14.", path14.Summary);
296+
Assert.Equal("Returns the greeting.", path14.Responses["200"].Description);
288297

289298
var path15 = document.Paths["/15"].Operations[HttpMethod.Get];
290299
Assert.Equal("A summary of Get15.", path15.Summary);
300+
Assert.Equal("Returns the greeting.", path15.Responses["200"].Description);
291301

292302
var path16 = document.Paths["/16"].Operations[HttpMethod.Post];
293303
Assert.Equal("A summary of Post16.", path16.Summary);

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AddOpenApiTests.CanInterceptAddOpenApi#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
353353
}
354354
}
355355
}
356+
// Applies `<returns>` on XML comments for operation with single response value.
357+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
358+
{
359+
var response = operation.Responses.First();
360+
response.Value.Description = returns;
361+
}
362+
// Applies `<response>` on XML comments for operation with multiple response values.
356363
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
357364
{
358365
foreach (var response in operation.Responses)

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/AdditionalTextsTests.CanHandleXmlForSchemasInAdditionalTexts#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
382382
}
383383
}
384384
}
385+
// Applies `<returns>` on XML comments for operation with single response value.
386+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
387+
{
388+
var response = operation.Responses.First();
389+
response.Value.Description = returns;
390+
}
391+
// Applies `<response>` on XML comments for operation with multiple response values.
385392
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
386393
{
387394
foreach (var response in operation.Responses)

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/CompletenessTests.SupportsAllXmlTagsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
472472
}
473473
}
474474
}
475+
// Applies `<returns>` on XML comments for operation with single response value.
476+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
477+
{
478+
var response = operation.Responses.First();
479+
response.Value.Description = returns;
480+
}
481+
// Applies `<response>` on XML comments for operation with multiple response values.
475482
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
476483
{
477484
foreach (var response in operation.Responses)

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromControllers#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
357357
}
358358
}
359359
}
360+
// Applies `<returns>` on XML comments for operation with single response value.
361+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
362+
{
363+
var response = operation.Responses.First();
364+
response.Value.Description = returns;
365+
}
366+
// Applies `<response>` on XML comments for operation with multiple response values.
360367
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
361368
{
362369
foreach (var response in operation.Responses)

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/OperationTests.SupportsXmlCommentsOnOperationsFromMinimalApis#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ private static Dictionary<string, XmlComment> GenerateCacheEntries()
7272
{
7373
var cache = new Dictionary<string, XmlComment>();
7474

75-
cache.Add(@"M:RouteHandlerExtensionMethods.Get~System.String", new XmlComment(@"A summary of the action.", @"A description of the action.", null, null, null, false, null, null, null));
75+
cache.Add(@"M:RouteHandlerExtensionMethods.Get~System.String", new XmlComment(@"A summary of the action.", @"A description of the action.", null, @"Returns the greeting.", null, false, null, null, null));
7676
cache.Add(@"M:RouteHandlerExtensionMethods.Get2(System.String)~System.String", new XmlComment(null, null, null, null, null, false, null, [new XmlParameterComment(@"name", @"The name of the person.", null, false)], [new XmlResponseComment(@"200", @"Returns the greeting.", @"")]));
77-
cache.Add(@"M:RouteHandlerExtensionMethods.Get3(System.String)~System.String", new XmlComment(null, null, null, null, null, false, null, [new XmlParameterComment(@"name", @"The name of the person.", @"Testy McTester", false)], null));
78-
cache.Add(@"M:RouteHandlerExtensionMethods.Get4~Microsoft.AspNetCore.Http.HttpResults.NotFound{System.String}", new XmlComment(null, null, null, null, null, false, null, null, [new XmlResponseComment(@"404", @"Indicates that the value was not found.", @"")]));
79-
cache.Add(@"M:RouteHandlerExtensionMethods.Get5~Microsoft.AspNetCore.Http.HttpResults.Results{Microsoft.AspNetCore.Http.HttpResults.NotFound{System.String},Microsoft.AspNetCore.Http.HttpResults.Ok{System.String},Microsoft.AspNetCore.Http.HttpResults.Created}", new XmlComment(null, null, null, null, null, false, null, null, [new XmlResponseComment(@"200", @"Indicates that the value is even.", @""), new XmlResponseComment(@"201", @"Indicates that the value is less than 50.", @""), new XmlResponseComment(@"404", @"Indicates that the value was not found.", @"")]));
77+
cache.Add(@"M:RouteHandlerExtensionMethods.Get3(System.String)~System.String", new XmlComment(null, null, null, @"Returns the greeting.", null, false, null, [new XmlParameterComment(@"name", @"The name of the person.", @"Testy McTester", false)], null));
78+
cache.Add(@"M:RouteHandlerExtensionMethods.Get4~Microsoft.AspNetCore.Http.HttpResults.NotFound{System.String}", new XmlComment(null, null, null, @"Indicates that the value was not found.", null, false, null, null, null));
79+
cache.Add(@"M:RouteHandlerExtensionMethods.Get5~Microsoft.AspNetCore.Http.HttpResults.Results{Microsoft.AspNetCore.Http.HttpResults.NotFound{System.String},Microsoft.AspNetCore.Http.HttpResults.Ok{System.String},Microsoft.AspNetCore.Http.HttpResults.Created}", new XmlComment(null, null, null, @"This gets ignored.", null, false, null, null, [new XmlResponseComment(@"200", @"Indicates that the value is even.", @""), new XmlResponseComment(@"201", @"Indicates that the value is less than 50.", @""), new XmlResponseComment(@"404", @"Indicates that the value was not found.", @"")]));
8080
cache.Add(@"M:RouteHandlerExtensionMethods.Post6(User)~Microsoft.AspNetCore.Http.IResult", new XmlComment(@"Creates a new user.", null, @"Sample request:
8181
POST /6
8282
{
@@ -90,8 +90,8 @@ private static Dictionary<string, XmlComment> GenerateCacheEntries()
9090
cache.Add(@"M:RouteHandlerExtensionMethods.Get11~System.Threading.Tasks.ValueTask", new XmlComment(@"A summary of Get11.", null, null, null, null, false, null, null, null));
9191
cache.Add(@"M:RouteHandlerExtensionMethods.Get12~System.Threading.Tasks.Task{System.String}", new XmlComment(@"A summary of Get12.", null, null, null, null, false, null, null, null));
9292
cache.Add(@"M:RouteHandlerExtensionMethods.Get13~System.Threading.Tasks.ValueTask{System.String}", new XmlComment(@"A summary of Get13.", null, null, null, null, false, null, null, null));
93-
cache.Add(@"M:RouteHandlerExtensionMethods.Get14~System.Threading.Tasks.Task{Holder{System.String}}", new XmlComment(@"A summary of Get14.", null, null, null, null, false, null, null, null));
94-
cache.Add(@"M:RouteHandlerExtensionMethods.Get15~System.Threading.Tasks.Task{Holder{System.String}}", new XmlComment(@"A summary of Get15.", null, null, null, null, false, null, null, null));
93+
cache.Add(@"M:RouteHandlerExtensionMethods.Get14~System.Threading.Tasks.Task{Holder{System.String}}", new XmlComment(@"A summary of Get14.", null, null, @"Returns the greeting.", null, false, null, null, null));
94+
cache.Add(@"M:RouteHandlerExtensionMethods.Get15~System.Threading.Tasks.Task{Holder{System.String}}", new XmlComment(@"A summary of Get15.", null, null, null, null, false, null, null, [new XmlResponseComment(@"200", @"Returns the greeting.", @"")]));
9595
cache.Add(@"M:RouteHandlerExtensionMethods.Post16(Example)", new XmlComment(@"A summary of Post16.", null, null, null, null, false, null, null, null));
9696
cache.Add(@"M:RouteHandlerExtensionMethods.Get17(System.Int32[])~System.Int32[][]", new XmlComment(@"A summary of Get17.", null, null, null, null, false, null, null, null));
9797

@@ -375,6 +375,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
375375
}
376376
}
377377
}
378+
// Applies `<returns>` on XML comments for operation with single response value.
379+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
380+
{
381+
var response = operation.Responses.First();
382+
response.Value.Description = returns;
383+
}
384+
// Applies `<response>` on XML comments for operation with multiple response values.
378385
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
379386
{
380387
foreach (var response in operation.Responses)

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.SourceGenerators.Tests/snapshots/SchemaTests.SupportsXmlCommentsOnSchemas#OpenApiXmlCommentSupport.generated.verified.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,13 @@ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransform
383383
}
384384
}
385385
}
386+
// Applies `<returns>` on XML comments for operation with single response value.
387+
if (methodComment.Returns is { } returns && operation.Responses is { Count: 1 })
388+
{
389+
var response = operation.Responses.First();
390+
response.Value.Description = returns;
391+
}
392+
// Applies `<response>` on XML comments for operation with multiple response values.
386393
if (methodComment.Responses is { Count: > 0} && operation.Responses is { Count: > 0 })
387394
{
388395
foreach (var response in operation.Responses)

0 commit comments

Comments
 (0)