Skip to content
This repository was archived by the owner on Jun 16, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ ___
- [Rename a client](#rename-a-client)
- [Replace any generated member](#replace-any-generated-member)
- [Remove any generated member](#remove-any-generated-member)
- [Change model namespace or accessability in bulk](#change-model-namespace-or-accessability-in-bulk)
- [Change model namespace or accessibility in bulk](#change-model-namespace-or-accessibility-in-bulk)
- [Change operation accessibility in bulk](#change-operation-accessibility-in-bulk)
- [Exclude models from namespace](#exclude-models-from-namespace)

<!-- /TOC -->
Expand Down Expand Up @@ -918,7 +919,7 @@ namespace Azure.Service.Models

</details>

### Change model namespace or accessability in bulk
### Change model namespace or accessibility in bulk

<details>

Expand Down Expand Up @@ -964,6 +965,34 @@ directive:

</details>

### Change operation accessibility in bulk

<details>

**Generated code before (Generated/Client.cs):**

``` C#
public virtual Response Operation(string body = null, CancellationToken cancellationToken = default)
public virtual async Task<Response> OperationAsync(string body = null, CancellationToken cancellationToken = default)
```

**Add autorest.md transformation**

```
directive:
- from: swagger-document
where: $..[?(@.operationId=='Operation')]
transform: >
$["x-accessibility"] = "internal";
```

**Generated code after (Generated/Client.cs):**

``` C#
internal virtual Response Operation(string body = null, CancellationToken cancellationToken = default)
internal virtual async Task<Response> OperationAsync(string body = null, CancellationToken cancellationToken = default)
```

### Exclude models from namespace

<details>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,14 @@ internal static class RequestWriterHelpers
{
private static string GetPipeline (bool lowLevel) => lowLevel ? "Pipeline" : "_pipeline";

public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clientMethod, bool lowLevel)
public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clientMethod, bool lowLevel, string methodAccessibility)
{
using var methodScope = writer.AmbientScope();
var parameters = clientMethod.Parameters;

var methodName = CreateRequestMethodName(clientMethod.Name);
var returnType = lowLevel ? typeof(Azure.Core.Request) : typeof(HttpMessage);
var visibility = lowLevel ? "private" : (clientMethod.IsVisible ? "protected" : "internal");
writer.Append($"{visibility} {returnType} {methodName}(");
writer.Append($"{methodAccessibility} {returnType} {methodName}(");
foreach (Parameter clientParameter in parameters)
{
if (lowLevel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ private void WriteClientCtor(CodeWriter writer, RestClient restClient, CSharpTyp

private void WriteRequestCreation(CodeWriter writer, RestClientMethod clientMethod)
{
RequestWriterHelpers.WriteRequestCreation (writer, clientMethod, lowLevel: false);
RequestWriterHelpers.WriteRequestCreation (writer, clientMethod, lowLevel: false, "internal");
}

private void WriteOperation(CodeWriter writer, RestClientMethod operation, bool async)
Expand Down
1 change: 1 addition & 0 deletions src/AutoRest.CSharp/Common/Input/CodeModelPartials.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ internal partial class Operation
// For some reason, booleans in dictionaries are deserialized as string instead of bool.
public bool IsLongRunning => Convert.ToBoolean(Extensions.GetValue<string>("x-ms-long-running-operation") ?? "false");
public string? LongRunningFinalStateVia => Extensions.GetValue<IDictionary<object, object>>("x-ms-long-running-operation-options")?.GetValue<string>("final-state-via");
public string? Accessibility => Extensions.GetValue<string>("x-accessibility");

public ServiceResponse LongRunningInitialResponse
{
Expand Down
6 changes: 4 additions & 2 deletions src/AutoRest.CSharp/Common/Output/Models/ClientMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@ namespace AutoRest.CSharp.Output.Models
{
internal class ClientMethod
{
public ClientMethod(string name, RestClientMethod restClientMethod, string? description, Diagnostic diagnostics)
public ClientMethod(string name, RestClientMethod restClientMethod, string? description, Diagnostic diagnostics, string accessibility)
{
Name = name;
RestClientMethod = restClientMethod;
Description = description;
Diagnostics = diagnostics;
Accessibility = accessibility;
}

public string Name { get; }
public RestClientMethod RestClientMethod { get; }
public string? Description { get; }
public Diagnostic Diagnostics { get; }
public string Accessibility { get; }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@ public PagingMethod(RestClientMethod method, RestClientMethod? nextPageMethod, s
public RestClientMethod? NextPageMethod { get; }
public PagingResponseInfo PagingResponse { get; }
public Diagnostic Diagnostics { get; }
public string Accessibility => "public";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace AutoRest.CSharp.Output.Models.Requests
{
internal class RestClientMethod
{
public RestClientMethod(string name, string? description, CSharpType? returnType, Request request, Parameter[] parameters, Response[] responses, DataPlaneResponseHeaderGroupType? headerModel, bool bufferResponse, bool isVisible)
public RestClientMethod(string name, string? description, CSharpType? returnType, Request request, Parameter[] parameters, Response[] responses, DataPlaneResponseHeaderGroupType? headerModel, bool bufferResponse, string accessibility)
{
Name = name;
Request = request;
Expand All @@ -19,7 +19,7 @@ public RestClientMethod(string name, string? description, CSharpType? returnType
ReturnType = returnType;
HeaderModel = headerModel;
BufferResponse = bufferResponse;
IsVisible = isVisible;
Accessibility = accessibility;
}

public string Name { get; }
Expand All @@ -30,6 +30,6 @@ public RestClientMethod(string name, string? description, CSharpType? returnType
public DataPlaneResponseHeaderGroupType? HeaderModel { get; }
public bool BufferResponse { get; }
public CSharpType? ReturnType { get; }
public bool IsVisible { get; }
public string Accessibility { get; }
}
}
4 changes: 2 additions & 2 deletions src/AutoRest.CSharp/Common/Output/Models/RestClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ protected virtual Dictionary<ServiceRequest, RestClientMethod> EnsureNormalMetho
{
continue;
}
_requestMethods.Add(serviceRequest, Builder.BuildMethod(operation, httpRequest, serviceRequest.Parameters, null, false));
_requestMethods.Add(serviceRequest, Builder.BuildMethod(operation, httpRequest, serviceRequest.Parameters, null, "public"));
}
}

Expand Down Expand Up @@ -178,7 +178,7 @@ protected static RestClientMethod BuildNextPageMethod(RestClientMethod method, O
responses,
method.HeaderModel,
bufferResponse: true,
isVisible: false);
accessibility: "internal");
}

public virtual RestClientMethod? GetNextOperationMethod(ServiceRequest request)
Expand Down
4 changes: 2 additions & 2 deletions src/AutoRest.CSharp/Common/Output/Models/RestClientBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ private string GetRequestParameterName (RequestParameter requestParameter)
return requestParameter.Language.Default.SerializedName ?? defaultName;
}

public RestClientMethod BuildMethod(Operation operation, HttpRequest httpRequest, IEnumerable<RequestParameter> requestParameters, DataPlaneResponseHeaderGroupType? responseHeaderModel, bool isVisible)
public RestClientMethod BuildMethod(Operation operation, HttpRequest httpRequest, IEnumerable<RequestParameter> requestParameters, DataPlaneResponseHeaderGroupType? responseHeaderModel, string accessibility)
{
Dictionary<RequestParameter, ConstructedParameter> allParameters = new ();

Expand Down Expand Up @@ -89,7 +89,7 @@ public RestClientMethod BuildMethod(Operation operation, HttpRequest httpRequest
responses,
responseHeaderModel,
operation.Extensions?.BufferResponse ?? true,
isVisible: isVisible
accessibility: accessibility
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ private void WriteClientMethod(CodeWriter writer, ClientMethod clientMethod, boo

var methodName = CreateMethodName(clientMethod.Name, async);
var asyncText = async ? "async" : string.Empty;
writer.Append($"public virtual {asyncText} {responseType} {methodName}(");
writer.Append($"{clientMethod.Accessibility} virtual {asyncText} {responseType} {methodName}(");

foreach (Parameter parameter in parameters)
{
Expand Down Expand Up @@ -294,7 +294,7 @@ private void WritePagingOperation(CodeWriter writer, PagingMethod pagingMethod,
writer.WriteXmlDocumentationParameter("cancellationToken", "The cancellation token to use.");
writer.WriteXmlDocumentationRequiredParametersException(parameters);

writer.Append($"public virtual {responseType} {CreateMethodName(pagingMethod.Name, async)}(");
writer.Append($"{pagingMethod.Accessibility} virtual {responseType} {CreateMethodName(pagingMethod.Name, async)}(");
foreach (Parameter parameter in parameters)
{
writer.WriteParameter(parameter);
Expand Down Expand Up @@ -397,7 +397,7 @@ private void WriteStartOperationOperation(CodeWriter writer, DataPlaneLongRunnin
writer.WriteXmlDocumentationRequiredParametersException(parameters);

string asyncText = async ? "async " : string.Empty;
writer.Append($"public virtual {asyncText}{returnType} {CreateStartOperationName(lroMethod.Name, async)}(");
writer.Append($"{lroMethod.Accessibility} virtual {asyncText}{returnType} {CreateStartOperationName(lroMethod.Name, async)}(");
foreach (Parameter parameter in parameters)
{
writer.WriteParameter(parameter);
Expand Down
3 changes: 2 additions & 1 deletion src/AutoRest.CSharp/DataPlane/Output/DataPlaneClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ private IEnumerable<ClientMethod> BuildMethods()
name,
startMethod,
BuilderHelpers.EscapeXmlDescription(operation.Language.Default.Description),
new Diagnostic($"{Declaration.Name}.{name}", Array.Empty<DiagnosticAttribute>()));
new Diagnostic($"{Declaration.Name}.{name}", Array.Empty<DiagnosticAttribute>()),
operation.Accessibility ?? "public");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@ public DataPlaneLongRunningOperationMethod(string name, DataPlaneLongRunningOper
public RestClientMethod StartMethod { get; }

public Diagnostic Diagnostics { get; }
public string Accessibility => "public";
}
}
3 changes: 2 additions & 1 deletion src/AutoRest.CSharp/DataPlane/Output/DataPlaneRestClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ protected override Dictionary<ServiceRequest, RestClientMethod> EnsureNormalMeth
continue;
}
var headerModel = _context.Library.FindHeaderModel(operation);
requestMethods.Add(serviceRequest, Builder.BuildMethod(operation, httpRequest, serviceRequest.Parameters, headerModel, false));
var accessibility = operation.Accessibility ?? "public";
requestMethods.Add(serviceRequest, Builder.BuildMethod(operation, httpRequest, serviceRequest.Parameters, headerModel, accessibility));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ private void WriteClientMethodRequest(CodeWriter writer, RestClientMethod client
{
writer.WriteXmlDocumentationParameter(parameter.Name, parameter.Description);
}
RequestWriterHelpers.WriteRequestCreation(writer, clientMethod, lowLevel: true);
RequestWriterHelpers.WriteRequestCreation(writer, clientMethod, lowLevel: true, "private");
}

private void WriteClientMethod(CodeWriter writer, RestClientMethod clientMethod, bool async)
Expand All @@ -68,7 +68,7 @@ private void WriteClientMethod(CodeWriter writer, RestClientMethod clientMethod,

var methodName = CreateMethodName(clientMethod.Name, async);
var asyncText = async ? "async" : string.Empty;
writer.Append($"public virtual {asyncText} {responseType} {methodName}(");
writer.Append($"{clientMethod.Accessibility} virtual {asyncText} {responseType} {methodName}(");

foreach (var parameter in parameters)
{
Expand Down
5 changes: 3 additions & 2 deletions src/AutoRest.CSharp/LowLevel/Output/LowLevelRestClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ private IEnumerable<RestClientMethod> BuildAllMethods()
// will show up first.

IEnumerable<RequestParameter> requestParameters = serviceRequest.Parameters.Where (FilterServiceParamaters);
RestClientMethod method = _builder.BuildMethod(operation, (HttpRequest)serviceRequest.Protocol.Http!, requestParameters, null, true);
var accessibility = operation.Accessibility ?? "public";
RestClientMethod method = _builder.BuildMethod(operation, (HttpRequest)serviceRequest.Protocol.Http!, requestParameters, null, accessibility);
List<Parameter> parameters = method.Parameters.ToList();
RequestBody? body = null;

Expand All @@ -74,7 +75,7 @@ private IEnumerable<RestClientMethod> BuildAllMethods()
}

Request request = new Request (method.Request.HttpMethod, method.Request.PathSegments, method.Request.Query, method.Request.Headers, body);
yield return new RestClientMethod (method.Name, method.Description, method.ReturnType, request, parameters.ToArray(), method.Responses, method.HeaderModel, method.BufferResponse, method.IsVisible);
yield return new RestClientMethod (method.Name, method.Description, method.ReturnType, request, parameters.ToArray(), method.Responses, method.HeaderModel, method.BufferResponse, method.Accessibility);
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/AutoRest.CSharp/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
{
"profiles": {
"Accessibility": {
"commandName": "Project",
"commandLineArgs": "--standalone $(SolutionDir)\\test\\TestProjects\\Accessibility\\Generated"
},
"Accessibility-LowLevel": {
"commandName": "Project",
"commandLineArgs": "--standalone $(SolutionDir)\\test\\TestProjects\\Accessibility-LowLevel\\Generated"
},
"additionalProperties": {
"commandName": "Project",
"commandLineArgs": "--standalone $(SolutionDir)\\test\\TestServerProjects\\additionalProperties\\Generated"
Expand Down
24 changes: 24 additions & 0 deletions test/AutoRest.TestServer.Tests/AccessibilityTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Linq;
using System.Reflection;
using Accessibility_LowLevel;
using NUnit.Framework;

namespace AutoRest.TestServer.Tests
{
public class AccessibilityTests
{
[Test]
public void AccessibilityHonoredOnOperations()
{
var client = typeof(AccessibilityClient);
Assert.AreEqual(true, client.GetMethod ("Operation").IsPublic, "Operation should be public");
Assert.AreEqual(true, client.GetMethod ("OperationAsync").IsPublic, "OperationAsync should be public");
Assert.AreEqual(true, client.GetMethod ("OperationInternal", BindingFlags.Instance | BindingFlags.NonPublic).IsAssembly, "OperationInternal should be internal");
Assert.AreEqual(true, client.GetMethod ("OperationInternalAsync", BindingFlags.Instance | BindingFlags.NonPublic).IsAssembly, "OperationInternalAsync should be internal");
}
}
}
24 changes: 24 additions & 0 deletions test/AutoRest.TestServerLowLevel.Tests/AccessibilityTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Linq;
using System.Reflection;
using Accessibility_LowLevel;
using NUnit.Framework;

namespace AutoRest.TestServer.Tests
{
public class AccessibilityTests
{
[Test]
public void AccessibilityHonoredOnOperations()
{
var client = typeof(AccessibilityClient);
Assert.AreEqual(true, client.GetMethod ("Operation").IsPublic, "Operation should be public");
Assert.AreEqual(true, client.GetMethod ("OperationAsync").IsPublic, "OperationAsync should be public");
Assert.AreEqual(true, client.GetMethod ("OperationInternal", BindingFlags.Instance | BindingFlags.NonPublic).IsAssembly, "OperationInternal should be internal");
Assert.AreEqual(true, client.GetMethod ("OperationInternalAsync", BindingFlags.Instance | BindingFlags.NonPublic).IsAssembly, "OperationInternalAsync should be internal");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
<Compile Include="../TestServerProjectsLowLevel/**/*.cs" LinkBase="TestServerProjectsLowLevel" />
<Compile Include="../TestProjectsLowLevel/**/*.cs" LinkBase="TestProjectsLowLevel" />
<None Include="../TestServerProjectsLowLevel/**/*.yaml" LinkBase="TestServerProjectsLowLevel" />
<Compile Include="../TestProjects/**/*.cs" LinkBase="TestProjects" />

<Compile Include="../AutoRest.TestServer.Tests/Infrastructure/*.cs" />
<Compile Include="../AutoRest.TestServer.Tests/TestConstants.cs" />
Expand Down
Loading