Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
d3b78e6
Adapt latest azure.core
live1206 Feb 1, 2024
3dc6406
update
live1206 Feb 1, 2024
c6a24b1
update
live1206 Feb 2, 2024
463b4a1
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 4, 2024
809ede7
update
live1206 Feb 4, 2024
afdd3a8
Merge branch 'rehydration-token' of https://github.com/live1206/autor…
live1206 Feb 4, 2024
4f6a546
test
live1206 Feb 4, 2024
9684285
fix test
live1206 Feb 4, 2024
0c7acd5
fix
live1206 Feb 4, 2024
bb5cfce
fix
live1206 Feb 4, 2024
1991ac8
fix
live1206 Feb 4, 2024
e7aaabf
update
live1206 Feb 5, 2024
5c16ad5
regen
live1206 Feb 5, 2024
ce1bc82
update
live1206 Feb 5, 2024
f9f6353
update
live1206 Feb 5, 2024
287ab48
update
live1206 Feb 6, 2024
ecc5e4a
regen
live1206 Feb 7, 2024
0f6a0b4
update
live1206 Feb 18, 2024
3652ac0
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 18, 2024
b0a3194
test
live1206 Feb 18, 2024
308ebb7
regen
live1206 Feb 18, 2024
b4a8e26
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 18, 2024
111eb15
update
live1206 Feb 18, 2024
9ef1def
update
live1206 Feb 19, 2024
d5b8794
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 23, 2024
2de341a
merge
live1206 Feb 23, 2024
d1bf74c
update
live1206 Feb 23, 2024
e6bb078
update shared core
live1206 Feb 23, 2024
abe1217
new line
live1206 Feb 23, 2024
33d6a61
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 27, 2024
c64aa79
update Azure.Core version
live1206 Feb 27, 2024
1b7f859
update
live1206 Feb 27, 2024
c5a25c0
update Azure.Core shared
live1206 Feb 27, 2024
2cc6fce
update
live1206 Feb 27, 2024
b112d89
update shared code
live1206 Feb 27, 2024
c40a3f2
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 27, 2024
005d6c1
Fix serialziation implementation for Resource
live1206 Feb 28, 2024
256e4a3
update
live1206 Feb 28, 2024
8c6fb24
Merge branch 'feature/v3' into rehydration-token
live1206 Feb 28, 2024
1705feb
update
live1206 Feb 29, 2024
fc6b7b6
Merge branch 'rehydration-token' of https://github.com/live1206/autor…
live1206 Feb 29, 2024
80dc6e0
updated shared code
live1206 Mar 1, 2024
5418f69
update shared code
live1206 Mar 1, 2024
64c7bdc
Merge branch 'feature/v3' into rehydration-token
live1206 Mar 1, 2024
54539b2
workaround for test failure
live1206 Mar 1, 2024
4fec68a
update shared code
live1206 Mar 1, 2024
21b4dbb
Merge remote-tracking branch 'origin/feature/v3' into rehydration-token
live1206 Mar 1, 2024
10ba432
update
live1206 Mar 1, 2024
dcd7805
workaround for test failure
live1206 Mar 1, 2024
6bb8619
Merge branch 'feature/v3' into rehydration-token
live1206 Mar 6, 2024
3e803c4
rename
live1206 Mar 6, 2024
3a382d9
add implementation for operation id
live1206 Mar 8, 2024
c93c6b8
Merge branch 'feature/v3' into rehydration-token
live1206 Mar 8, 2024
4b9f898
Merge branch 'feature/v3' into rehydration-token
live1206 Mar 8, 2024
b3978be
Merge branch 'rehydration-token' of https://github.com/live1206/autor…
live1206 Mar 8, 2024
e2f13d6
update
live1206 Mar 8, 2024
3cc8d52
Merge branch 'feature/v3' into rehydration-token
live1206 Mar 15, 2024
3bc8d6d
merge
live1206 Mar 15, 2024
349c10c
update shared code
live1206 Mar 15, 2024
3d575dd
Merge branch 'feature/v3' into rehydration-token
live1206 Apr 7, 2024
59f2cfc
updated shared core
live1206 Apr 7, 2024
5612c89
Merge branch 'feature/v3' into rehydration-token
live1206 Apr 7, 2024
7f14f61
reset
live1206 Apr 7, 2024
6f9ffa0
update
live1206 Apr 7, 2024
577adfa
regen
live1206 Apr 7, 2024
fb22e18
Merge branch 'feature/v3' into rehydration-token
live1206 Apr 20, 2024
c6957d8
Update to latest Azure.Core
live1206 Apr 20, 2024
cd383dd
update
live1206 Apr 22, 2024
6389872
Regen tests
live1206 Apr 22, 2024
d117cc9
Merge branch 'feature/v3' into rehydration-token
live1206 Apr 22, 2024
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
6 changes: 4 additions & 2 deletions Packages.Data.props
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@
<!-- All csproj dependencies. -->
<ItemGroup>
<PackageReference Update="NUnit" Version="3.13.2" />
<PackageReference Update="System.ClientModel" Version="1.0.0-beta.3" />
<PackageReference Update="Azure.Core" Version="1.36.0" />
<PackageReference Update="System.ClientModel" Version="1.0.0-beta.3" >
<NoWarn>NU1605</NoWarn>
</PackageReference>
<PackageReference Update="Azure.Core" Version="1.38.0-alpha.20240130.3" />
<PackageReference Update="Azure.Core.Experimental" Version="0.1.0-preview.18" />
<PackageReference Update="Azure.ResourceManager" Version="1.9.0" />
<PackageReference Update="Azure.Core.Expressions.DataFactory" Version="1.0.0-beta.4" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ namespace AutoRest.CSharp.Generation.Writers
{
internal static class RequestWriterHelpers
{
public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clientMethod, string methodAccessibility, ClientFields? fields, string? responseClassifierType, bool writeSDKUserAgent, IReadOnlyList<Parameter>? clientParameters = null)
public static void WriteRequestAndUriCreation(CodeWriter writer, RestClientMethod clientMethod, string methodAccessibility, ClientFields? fields, string? responseClassifierType, bool writeSDKUserAgent, IReadOnlyList<Parameter>? clientParameters = null)
{
WriteUriCreation(writer, clientMethod, methodAccessibility, fields, clientParameters);
using var methodScope = writer.AmbientScope();
var parameters = clientMethod.Parameters;

Expand Down Expand Up @@ -107,7 +108,7 @@ public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clie
using (WriteValueNullCheck(writer, body.Value))
{
WriteHeaders(writer, clientMethod, request, content: true, fields);
WriteSerializeContent(writer, request, body.Serialization, GetConstantOrParameter(body.Value, ignoreNullability: true, convertBinaryDataToArray: false));
WriteSerializeContent(writer, request, body.Serialization, GetConstantOrParameter(body.Value, ignoreNullability: true, convertBinaryDataToArray: false), body.Value.Type);
}

break;
Expand Down Expand Up @@ -183,7 +184,7 @@ public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clie
flattenedSchemaRequestBody.ObjectType.InitializationConstructor,
initializers);

WriteSerializeContent(writer, request, flattenedSchemaRequestBody.Serialization, $"{modelVariable:I}");
WriteSerializeContent(writer, request, flattenedSchemaRequestBody.Serialization, $"{modelVariable:I}", flattenedSchemaRequestBody.ObjectType.Type);
break;
case UrlEncodedBody urlEncodedRequestBody:
var urlContent = new CodeWriterDeclaration("content");
Expand Down Expand Up @@ -218,6 +219,50 @@ public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clie
writer.Line();
}

private static void WriteUriCreation(CodeWriter writer, RestClientMethod clientMethod, string methodAccessibility, ClientFields? fields, IReadOnlyList<Parameter>? clientParameters = null)
{
using var methodScope = writer.AmbientScope();
var methodName = CreateRequestUriMethodName($"{clientMethod.Name}");
writer.Append($"{methodAccessibility} {typeof(RequestUriBuilder)} {methodName}(");
foreach (Parameter clientParameter in clientMethod.Parameters)
{
writer.Append($"{clientParameter.Type} {clientParameter.Name:D},");
}
writer.RemoveTrailingComma();
writer.Line($")");
using (writer.Scope())
{
var uri = new CodeWriterDeclaration("uri");
writer.Line($"var {uri:D} = new RawRequestUriBuilder();");
foreach (var segment in clientMethod.Request.PathSegments)
{
var value = GetFieldReference(fields, segment.Value);
if (value.Type.IsFrameworkType && value.Type.FrameworkType == typeof(Uri))
{
writer.Append($"{uri}.Reset(");
WriteConstantOrParameter(writer, value, enumAsString: !segment.IsRaw);
writer.Line($");");
}
else if (!value.IsConstant && value.Reference.Name == "nextLink")
{
WritePathSegment(writer, uri, segment, value, "AppendRawNextLink");
}
else
{
WritePathSegment(writer, uri, segment, value);
}
}

//TODO: Duplicate code between query and header parameter processing logic
foreach (var queryParameter in clientMethod.Request.Query)
{
WriteQueryParameter(writer, uri, queryParameter, fields, clientParameters);
}
writer.Line($"return {uri};");
}
writer.Line();
}

private static ReferenceOrConstant GetFieldReference(ClientFields? fields, ReferenceOrConstant value) =>
fields != null && !value.IsConstant ? fields.GetFieldByParameter(value.Reference.Name, value.Reference.Type) ?? value : value;

Expand Down Expand Up @@ -247,8 +292,9 @@ public static void WriteHeaders(CodeWriter writer, RestClientMethod clientMethod

public static string CreateRequestMethodName(RestClientMethod method) => CreateRequestMethodName(method.Name);
public static string CreateRequestMethodName(string name) => $"Create{name}Request";
public static string CreateRequestUriMethodName(string name) => $"Create{name}RequestUri";

private static void WriteSerializeContent(CodeWriter writer, CodeWriterDeclaration request, ObjectSerialization bodySerialization, FormattableString value)
private static void WriteSerializeContent(CodeWriter writer, CodeWriterDeclaration request, ObjectSerialization bodySerialization, FormattableString value, CSharpType type)
{
writer.WriteMethodBodyStatement(GetRequestContentForSerialization(request, bodySerialization, value));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public void WriteClient(CodeWriter writer, DataPlaneRestClient restClient)
WriteClientCtor(writer, restClient);
foreach (var method in restClient.Methods)
{
RequestWriterHelpers.WriteRequestCreation(writer, method, "internal", restClient.Fields, null, false, restClient.Parameters);
RequestWriterHelpers.WriteRequestAndUriCreation(writer, method, "internal", restClient.Fields, null, false, restClient.Parameters);
WriteOperation(writer, method, restClient.Fields.PipelineField.Name, true, WriteFuncBodyWithSend, null, MethodSignatureModifiers.Public, WriteStatusCodeSwitch, restClient.Fields.GetFieldByParameter(KnownParameters.ClientDiagnostics));
WriteOperation(writer, method, restClient.Fields.PipelineField.Name, false, WriteFuncBodyWithSend, null, MethodSignatureModifiers.Public, WriteStatusCodeSwitch, restClient.Fields.GetFieldByParameter(KnownParameters.ClientDiagnostics));
var protocolMethod = restClient.ProtocolMethods.FirstOrDefault(m => m.RequestMethod.Operation.Equals(method.Operation));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using AutoRest.CSharp.Common.Output.Builders;
using AutoRest.CSharp.Common.Output.Models.Types;
using AutoRest.CSharp.Generation.Types;
using AutoRest.CSharp.Mgmt.Output;
using AutoRest.CSharp.Output.Models.Serialization.Json;
using AutoRest.CSharp.Output.Models.Serialization.Xml;
using AutoRest.CSharp.Output.Models.Types;
Expand All @@ -23,6 +24,12 @@ public void WriteSerialization(CodeWriter writer, TypeProvider schema)
{
switch (schema)
{
// The corresponding ResoruceData does not exist for PartialResource, so we do not need to generate serialization methods for it.
case PartialResource:
break;
case Resource resource:
WriteResourceJsonSerialization(writer, resource);
break;
case SerializableObjectType obj:
if (obj.IncludeSerializer || obj.IncludeDeserializer)
{
Expand All @@ -35,6 +42,25 @@ public void WriteSerialization(CodeWriter writer, TypeProvider schema)
}
}

private void WriteResourceJsonSerialization(CodeWriter writer, Resource resource)
{
var declaration = resource.Declaration;

using (writer.Namespace(declaration.Namespace))
{
var resourceDataType = resource.ResourceData.Type;
writer.Append($"{declaration.Accessibility} partial class {declaration.Name} : IJsonModel<{resourceDataType}>");

using (writer.Scope())
{
foreach (var method in JsonSerializationMethodsBuilder.BuildResourceJsonSerializationMethods(resource))
{
writer.WriteMethod(method);
}
}
}
}

private void WriteObjectSerialization(CodeWriter writer, SerializableObjectType model)
{
var declaration = model.Declaration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,61 @@ namespace AutoRest.CSharp.Common.Output.Builders
{
internal static class JsonSerializationMethodsBuilder
{
public static IEnumerable<Method> BuildResourceJsonSerializationMethods(Resource resource)
{
var resourceDataType = resource.ResourceData.Type;
var jsonModelInterface = new CSharpType(typeof(IJsonModel<>), resourceDataType);
var options = new ModelReaderWriterOptionsExpression(KnownParameters.Serializations.Options);
var modelReaderWriter = new CSharpType(typeof(ModelReaderWriter));
var iModelTInterface = new CSharpType(typeof(IPersistableModel<>), resourceDataType);
var data = new BinaryDataExpression(KnownParameters.Serializations.Data);


// void IJsonModel<T>.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options)
var writer = new Utf8JsonWriterExpression(KnownParameters.Serializations.Utf8JsonWriter);
yield return new Method(
new MethodSignature(nameof(IJsonModel<object>.Write), null, null, MethodSignatureModifiers.None, null, null, new[] { KnownParameters.Serializations.Utf8JsonWriter, KnownParameters.Serializations.Options }, ExplicitInterface: jsonModelInterface),
new MethodBodyStatement[]
{
// writer.WriteStringValue(ModelReaderWriter.Write(Data, options));
new InvokeInstanceMethodStatement(writer, "WriteStringValue", new ValueExpression[] { new InvokeStaticMethodExpression(modelReaderWriter, "Write", new ValueExpression[] { new MemberExpression(This, "Data"), options }, new List<CSharpType> { resourceDataType }) }, false)
});

// T IJsonModel<T>.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options)
var reader = new Parameter("reader", null, typeof(Utf8JsonReader), null, CSharp.Output.Models.Shared.ValidationType.None, null);
yield return new Method(
new MethodSignature(nameof(IJsonModel<object>.Create), null, null, MethodSignatureModifiers.None, resourceDataType, null, new[] { KnownParameters.Serializations.Utf8JsonReader, KnownParameters.Serializations.Options }, ExplicitInterface: jsonModelInterface),
new MethodBodyStatement[]
{
// return ModelReaderWriter.Read<ResourceData>(new BinaryData(reader.ValueSequence));
Return(new InvokeStaticMethodExpression(modelReaderWriter, "Read", new List<ValueExpression> { New.Instance(new CSharpType(typeof(BinaryData)), new MemberExpression(reader, "ValueSequence")), options }, new List<CSharpType> { resourceDataType }))
});

// BinaryData IPersistableModel<T>.Write(ModelReaderWriterOptions options)
yield return new Method(
new MethodSignature(nameof(IPersistableModel<object>.Write), null, null, MethodSignatureModifiers.None, typeof(BinaryData), null, new[] { KnownParameters.Serializations.Options }, ExplicitInterface: iModelTInterface),
new MethodBodyStatement[]
{
// return ModelReaderWriter.Write<ResourceData>(Data, options);
Return(new InvokeStaticMethodExpression(modelReaderWriter, "Write", new List<ValueExpression> { new MemberExpression(This, "Data"), options}, new List<CSharpType>{ resourceDataType }))
});

// T IPersistableModel<T>.Create(BinaryData data, ModelReaderWriterOptions options)
yield return new Method(
new MethodSignature(nameof(IPersistableModel<object>.Create), null, null, MethodSignatureModifiers.None, resourceDataType, null, new[] { KnownParameters.Serializations.Data, KnownParameters.Serializations.Options }, ExplicitInterface: iModelTInterface),
new MethodBodyStatement[]
{
// return ModelReaderWriter.Read<ResourceData>(new BinaryData(reader.ValueSequence));
Return(new InvokeStaticMethodExpression(modelReaderWriter, "Read", new List<ValueExpression> { data, options }, new List<CSharpType> { resourceDataType }))
});

// ModelReaderWriterFormat IPersistableModel<T>.GetFormatFromOptions(ModelReaderWriterOptions options)
yield return new Method(
new MethodSignature(nameof(IPersistableModel<object>.GetFormatFromOptions), null, null, MethodSignatureModifiers.None, typeof(string), null, new[] { KnownParameters.Serializations.Options }, ExplicitInterface: iModelTInterface),
Serializations.JsonFormat
);
}

public static IEnumerable<Method> BuildJsonSerializationMethods(SerializableObjectType model, JsonObjectSerialization json)
{
var jsonModelInterface = json.IJsonModelInterface;
Expand Down
2 changes: 1 addition & 1 deletion src/AutoRest.CSharp/LowLevel/Generation/DpgClientWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ private void WriteSubClientFactoryMethod()

public static void WriteRequestCreationMethod(CodeWriter writer, RestClientMethod restMethod, ClientFields fields)
{
RequestWriterHelpers.WriteRequestCreation(writer, restMethod, "internal", fields, restMethod.ResponseClassifierType.Name, false);
RequestWriterHelpers.WriteRequestAndUriCreation(writer, restMethod, "internal", fields, restMethod.ResponseClassifierType.Name, false);
}

public static void WriteResponseClassifierMethod(CodeWriter writer, IEnumerable<ResponseClassifierType> responseClassifierTypes)
Expand Down
15 changes: 14 additions & 1 deletion src/AutoRest.CSharp/Mgmt/AutoRest/MgmtTarget.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,10 +178,18 @@ public static async Task ExecuteAsync(GeneratedCodeWorkspace project, CodeModel
var writer = ResourceWriter.GetWriter(resource);
writer.Write();

var name = resource.Type.Name;

var ri = new ResourceItem(resource, MgmtReport.Instance.TransformSection);
MgmtReport.Instance.ResourceSection.Add(ri.Name, ri);

AddGeneratedFile(project, $"{resource.Type.Name}.cs", writer.ToString());
AddGeneratedFile(project, $"{name}.cs", writer.ToString());

// we do not need this if model reader writer feature is not enabled
if (Configuration.UseModelReaderWriter)
{
WriteSerialization(project, resource, serializeWriter, $"Models/{name}.Serialization.cs");
}
}

// write extension class
Expand Down Expand Up @@ -289,6 +297,11 @@ private static void WriteArmModel(GeneratedCodeWorkspace project, TypeProvider m
return;
}

WriteSerialization(project, model, serializeWriter, serializationFileName);
}

private static void WriteSerialization(GeneratedCodeWorkspace project, TypeProvider model, SerializationWriter serializeWriter, string serializationFileName)
{
var serializerCodeWriter = new CodeWriter();
serializeWriter.WriteSerialization(serializerCodeWriter, model);
AddGeneratedFile(project, serializationFileName, serializerCodeWriter.ToString());
Expand Down
19 changes: 19 additions & 0 deletions src/AutoRest.CSharp/Mgmt/Generation/MgmtClientBaseWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,24 @@ protected virtual void WriteLROMethodBranch(MgmtRestOperation operation, IEnumer
WriteArguments(_writer, parameterMapping);
_writer.Line($"cancellationToken){GetConfigureAwait(async)};");

if (operation.IsFakeLongRunningOperation)
{
_writer.Append($"var uri = ");
_writer.Append($"{GetRestClientName(operation)}.{RequestWriterHelpers.CreateRequestUriMethodName(operation.Method.Name)}(");
WriteArguments(_writer, parameterMapping);
_writer.RemoveTrailingComma();
_writer.Line($");");

_writer.Append($"var rehydrationToken = {typeof(NextLinkOperationImplementation)}.GetRehydrationToken(");

_writer.Append($"{typeof(RequestMethod)}.{new CultureInfo("en-US", false).TextInfo.ToTitleCase(operation.Method.Request.HttpMethod.ToString().ToLower())}, ");
_writer.Append($"uri.ToUri(), ");
_writer.Append($"uri.ToString(), ");
_writer.Append($"{typeof(NextLinkOperationImplementation)}.HeaderSource.None.ToString(), ");
_writer.Append($"null, ");
_writer.Line($"{typeof(OperationFinalStateVia)}.OriginalUri.ToString());");
}

WriteLROResponse(GetDiagnosticReference(operation).Name, PipelineProperty, operation, parameterMapping, async);
}

Expand Down Expand Up @@ -656,6 +674,7 @@ protected virtual void WriteLROResponse(string diagnosticsVariableName, string p
{
_writer.Append($"{Configuration.ApiTypes.ResponseParameterName}");
}
_writer.Append($", rehydrationToken");
}
else
{
Expand Down
Loading