Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 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
2 changes: 1 addition & 1 deletion eng/Packages.Data.props
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,6 @@
<PropertyGroup>
<TestProxyVersion>1.0.0-dev.20250805.1</TestProxyVersion>
<UnbrandedGeneratorVersion>1.0.0-alpha.20250811.4</UnbrandedGeneratorVersion>
<AzureGeneratorVersion>1.0.0-alpha.20250729.4</AzureGeneratorVersion>
<AzureGeneratorVersion>1.0.0-alpha.20250812.2</AzureGeneratorVersion>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@

<!-- temporarily. remove once Azure.Generator version update is done -->
<ItemGroup>
<PackageReference Update="Microsoft.TypeSpec.Generator.ClientModel" VersionOverride="1.0.0-alpha.20250731.2" />
<PackageReference Update="Microsoft.TypeSpec.Generator.Input" VersionOverride="1.0.0-alpha.20250731.2" />
<PackageReference Update="Microsoft.TypeSpec.Generator.ClientModel" VersionOverride="1.0.0-alpha.20250811.4" />
<PackageReference Update="Microsoft.TypeSpec.Generator.Input" VersionOverride="1.0.0-alpha.20250811.4" />
</ItemGroup>

<Target Name="CheckEmitterBuild" BeforeTargets="Build">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Microsoft.TypeSpec.Generator.Providers;
using Microsoft.TypeSpec.Generator.Statements;
using System;
using System.Collections.Generic;
using System.Linq;
using static Microsoft.TypeSpec.Generator.Snippets.Snippet;

Expand Down Expand Up @@ -37,25 +38,54 @@ internal class PaginationVisitor : ScmLibraryVisitor
}

private static bool IsAsPagesMethod(MethodProvider method) => method.Signature.Name.Equals("AsPages");
private static bool IsGetNextResponseMethod(MethodProvider method) => method.Signature.Name.Equals("GetNextResponse");
private static bool IsGetNextResponseMethod(MethodProvider method)
=> method.Signature.Name.Equals("GetNextResponseAsync") || method.Signature.Name.Equals("GetNextResponse");

private void DoVisitAsPagesMethodStatements(MethodBodyStatements statements, MethodProvider method)
{
var doWhileStatement = statements.OfType<DoWhileStatement>().FirstOrDefault();
if (doWhileStatement is not null)
var whileStatement = statements.OfType<WhileStatement>().FirstOrDefault();
if (whileStatement is not null)
{
// we manually go over the body statements because currently the framework does not do this.
// TODO -- we do not have to do this once https://github.com/microsoft/typespec/issues/8177 is fixed.
foreach (var statement in doWhileStatement.Body)
foreach (var statement in whileStatement.Body)
{
if (statement is ExpressionStatement { Expression: AssignmentExpression assignment } expressionStatement)
if (statement is YieldReturnStatement
{
Value: InvokeMethodExpression
{
MethodName: "FromValues",
Arguments: [CastExpression castExpression, ..]
} invokeMethodExpression
} &&
castExpression.Inner is MemberExpression
{
Inner: CastExpression innerCastExpression,
MemberName: var memberName
} &&
IsResponseToModelCastExpression(innerCastExpression))
{
// convert the implicit cast expression to a method call
var updatedExpression = ConvertCastToMethodCall(innerCastExpression)
.Property(memberName) // wrap back by a MemberExpression
.CastTo(castExpression.Type); // wrap back by the outer CastExpression
// use the above updated expression as the first argument of this method call inside the yield return
IReadOnlyList<ValueExpression> newArguments = [updatedExpression, .. invokeMethodExpression.Arguments.Skip(1)];
invokeMethodExpression.Update(arguments: newArguments);
}
else if (statement is ExpressionStatement
{
var updatedExpression = DoVisitAssignmentExpressionForAsPagesMethod(assignment, method);
if (updatedExpression is not null)
Expression: AssignmentExpression
{
// update the expression in the statement.
expressionStatement.Update(updatedExpression);
Variable: var variable,
Value: MemberExpression { Inner: CastExpression castExpression1, MemberName: var memberName1 }
}
} expressionStatement)
{
var updatedExpression = variable.Assign(
ConvertCastToMethodCall(castExpression1)
.Property(memberName1)); // wrap back by a MemberExpression
expressionStatement.Update(updatedExpression);
}
}
}
Expand Down Expand Up @@ -89,23 +119,17 @@ private void DoVisitAsPagesMethodStatements(MethodBodyStatements statements, Met
{
if (expression.Value is CastExpression castExpression && IsResponseToModelCastExpression(castExpression))
{
var value = Static(castExpression.Type!).Invoke(SerializationVisitor.FromResponseMethodName, [castExpression.Inner!]);
var value = ConvertCastToMethodCall(castExpression);
var variable = expression.Variable;
return variable.Assign(value);
}
// do nothing if nothing is changed.
return null;
}

static bool IsResponseToModelCastExpression(CastExpression castExpression)
{
if (castExpression.Inner is VariableExpression variableExpression &&
variableExpression.Type is { IsFrameworkType: true, FrameworkType: { } frameworkType } &&
frameworkType == typeof(Response))
{
return true;
}
return false;
}
private static ValueExpression ConvertCastToMethodCall(CastExpression castExpression)
{
return Static(castExpression.Type!).Invoke(SerializationVisitor.FromResponseMethodName, [castExpression.Inner!]);
}

private ValueExpression? DoVisitAssignmentExpressionForGetNextResponseMethod(AssignmentExpression expression, MethodProvider method)
Expand All @@ -131,4 +155,15 @@ static bool IsResponseToModelCastExpression(CastExpression castExpression)
// do nothing if nothing is changed.
return null;
}

private static bool IsResponseToModelCastExpression(CastExpression castExpression)
{
if (castExpression.Inner is VariableExpression variableExpression &&
variableExpression.Type is { IsFrameworkType: true, FrameworkType: { } frameworkType } &&
frameworkType == typeof(Response))
{
return true;
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@

<!-- temporarily. remove once Azure.Generator version update is done -->
<ItemGroup>
<PackageReference Update="Microsoft.TypeSpec.Generator.ClientModel" VersionOverride="1.0.0-alpha.20250731.2" />
<PackageReference Update="Microsoft.TypeSpec.Generator.Input" VersionOverride="1.0.0-alpha.20250731.2" />
<PackageReference Update="Microsoft.TypeSpec.Generator.ClientModel" VersionOverride="1.0.0-alpha.20250811.4" />
<PackageReference Update="Microsoft.TypeSpec.Generator.Input" VersionOverride="1.0.0-alpha.20250811.4" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@

<!-- temporarily. remove once Azure.Generator version update is done -->
<ItemGroup>
<PackageReference Update="Microsoft.TypeSpec.Generator.ClientModel" VersionOverride="1.0.0-alpha.20250731.2" />
<PackageReference Update="Microsoft.TypeSpec.Generator.Input" VersionOverride="1.0.0-alpha.20250731.2" />
<PackageReference Update="Microsoft.TypeSpec.Generator.ClientModel" VersionOverride="1.0.0-alpha.20250811.4" />
<PackageReference Update="Microsoft.TypeSpec.Generator.Input" VersionOverride="1.0.0-alpha.20250811.4" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ public static InputModelProperty Property(
access: null,
isDiscriminator,
serializedName ?? wireName ?? name.ToVariableName(),
false,
new(json: new(wireName ?? name)));
}

Expand Down

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Loading
Loading