Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
29465ae
Initial plan
Copilot Nov 1, 2025
650e2a0
Add correspondingMethodParams property to InputHttpParameter types
Copilot Nov 2, 2025
58c6c9f
Fix emitter build and add tests for correspondingMethodParams
Copilot Nov 2, 2025
adce798
Revert unintended changes to SampleTypeSpecClient.cs
Copilot Nov 2, 2025
bf8b795
regen
JoshLove-msft Nov 2, 2025
80b3efd
Merge branch 'copilot/add-override-decorator-support' of https://gith…
JoshLove-msft Nov 2, 2025
b88ede8
Use correspondingMethodParams mapping when calling protocol methods
Copilot Nov 2, 2025
bf83381
Add comprehensive unit tests for correspondingMethodParams functionality
Copilot Nov 2, 2025
9bcd403
Add correspondingMethodParams support for Override decorator implemen…
Copilot Nov 2, 2025
0840165
Refactor tests to use InputFactory methods instead of constructors
Copilot Nov 2, 2025
87171e7
Add comprehensive tests for correspondingMethodParams on all paramete…
Copilot Nov 2, 2025
21af967
Fix argument ordering by iterating through method parameters instead …
Copilot Nov 2, 2025
45a76b4
Add test for correspondingMethodParams with InputModelType parameter
Copilot Nov 2, 2025
de08e5d
Fix body parameter conversion to BinaryContent in protocol method calls
Copilot Nov 2, 2025
358e06b
Fix test and handle multiple protocol params per method param correctly
Copilot Nov 2, 2025
766ec49
Fix protocol method argument ordering to match protocol parameter order
Copilot Nov 3, 2025
7887142
Fix argument ordering to respect TypeSpec parameter order
Copilot Nov 3, 2025
3a6dcbb
Final fix for argument ordering - iterate through protocol parameters…
Copilot Nov 3, 2025
be5b7ad
Merge branch 'main' of https://github.com/microsoft/typespec into cop…
JoshLove-msft Nov 5, 2025
7223f03
Addressing PR comments
Copilot Nov 5, 2025
a772e7f
Implementation complete - correspondingMethodParams support for Overr…
Copilot Nov 6, 2025
df00f25
Fix build
JoshLove-msft Nov 6, 2025
c2cb55c
Merge branch 'main' of https://github.com/microsoft/typespec into cop…
Copilot Jan 23, 2026
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

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,12 @@ export function fromSdkServiceMethodOperation(
summary: method.summary,
doc: method.doc,
accessibility: method.access,
parameters: fromSdkOperationParameters(sdkContext, method.operation, rootApiVersions),
parameters: fromSdkOperationParameters(
sdkContext,
method.operation,
rootApiVersions,
getClientNamespaceString(sdkContext)!,
),
responses: fromSdkHttpOperationResponses(sdkContext, method.operation.responses),
httpMethod: parseHttpRequestMethod(method.operation.verb),
uri: uri,
Expand Down Expand Up @@ -344,6 +349,7 @@ function fromSdkOperationParameters(
sdkContext: CSharpEmitterContext,
operation: SdkHttpOperation,
rootApiVersions: string[],
namespace: string,
): InputHttpParameter[] {
const parameters: InputHttpParameter[] = [];
for (const p of operation.parameters) {
Expand All @@ -355,14 +361,14 @@ function fromSdkOperationParameters(
});
return parameters;
}
const param = fromParameter(sdkContext, p, rootApiVersions);
const param = fromParameter(sdkContext, p, rootApiVersions, namespace);
if (param) {
parameters.push(param);
}
}

if (operation.bodyParam) {
const bodyParam = fromParameter(sdkContext, operation.bodyParam, rootApiVersions);
const bodyParam = fromParameter(sdkContext, operation.bodyParam, rootApiVersions, namespace);
if (bodyParam) {
parameters.push(bodyParam);
}
Expand All @@ -374,6 +380,7 @@ export function fromParameter(
sdkContext: CSharpEmitterContext,
p: SdkHttpParameter | SdkModelPropertyType,
rootApiVersions: string[],
namespace: string,
): InputHttpParameter | undefined {
let parameter = sdkContext.__typeCache.operationParameters.get(p);
if (parameter) {
Expand All @@ -383,16 +390,16 @@ export function fromParameter(

switch (parameterKind) {
case "query":
parameter = fromQueryParameter(sdkContext, p, rootApiVersions);
parameter = fromQueryParameter(sdkContext, p, rootApiVersions, namespace);
break;
case "path":
parameter = fromPathParameter(sdkContext, p, rootApiVersions);
parameter = fromPathParameter(sdkContext, p, rootApiVersions, namespace);
break;
case "header":
parameter = fromHeaderParameter(sdkContext, p, rootApiVersions);
parameter = fromHeaderParameter(sdkContext, p, rootApiVersions, namespace);
break;
case "body":
parameter = fromBodyParameter(sdkContext, p, rootApiVersions);
parameter = fromBodyParameter(sdkContext, p, rootApiVersions, namespace);
break;
default:
sdkContext.logger.reportDiagnostic({
Expand All @@ -410,10 +417,33 @@ export function fromParameter(
return parameter;
}

function convertCorrespondingMethodParams(
sdkContext: CSharpEmitterContext,
p: SdkHttpParameter | SdkModelPropertyType,
namespace: string,
): InputMethodParameter[] | undefined {
if (!("correspondingMethodParams" in p) || !p.correspondingMethodParams) {
return undefined;
}

return p.correspondingMethodParams
.filter((param) => param.kind === "method") // Only include method parameters
.map((methodParam) => {
// Check if already cached
let inputMethodParam = sdkContext.__typeCache.methodParmeters.get(methodParam);
if (!inputMethodParam) {
// Convert the method parameter if not already cached
inputMethodParam = fromMethodParameter(sdkContext, methodParam, namespace);
}
return inputMethodParam;
});
}

function fromQueryParameter(
sdkContext: CSharpEmitterContext,
p: SdkQueryParameter,
rootApiVersions: string[],
namespace: string,
): InputQueryParameter {
const parameterType = fromSdkType(sdkContext, p.type);

Expand All @@ -433,6 +463,7 @@ function fromQueryParameter(
decorators: p.decorators,
crossLanguageDefinitionId: p.crossLanguageDefinitionId,
readOnly: isReadOnly(p),
correspondingMethodParams: convertCorrespondingMethodParams(sdkContext, p, namespace),
};

sdkContext.__typeCache.updateSdkOperationParameterReferences(p, retVar);
Expand All @@ -443,6 +474,7 @@ function fromPathParameter(
sdkContext: CSharpEmitterContext,
p: SdkPathParameter,
rootApiVersions: string[],
namespace: string,
): InputPathParameter {
const parameterType = fromSdkType(sdkContext, p.type);

Expand All @@ -464,6 +496,7 @@ function fromPathParameter(
decorators: p.decorators,
readOnly: isReadOnly(p),
crossLanguageDefinitionId: p.crossLanguageDefinitionId,
correspondingMethodParams: convertCorrespondingMethodParams(sdkContext, p, namespace),
};

sdkContext.__typeCache.updateSdkOperationParameterReferences(p, retVar);
Expand All @@ -474,6 +507,7 @@ function fromHeaderParameter(
sdkContext: CSharpEmitterContext,
p: SdkHeaderParameter,
rootApiVersions: string[],
namespace: string,
): InputHeaderParameter {
const parameterType = fromSdkType(sdkContext, p.type);

Expand All @@ -494,6 +528,7 @@ function fromHeaderParameter(
readOnly: isReadOnly(p),
decorators: p.decorators,
crossLanguageDefinitionId: p.crossLanguageDefinitionId,
correspondingMethodParams: convertCorrespondingMethodParams(sdkContext, p, namespace),
};

sdkContext.__typeCache.updateSdkOperationParameterReferences(p, retVar);
Expand All @@ -504,6 +539,7 @@ function fromBodyParameter(
sdkContext: CSharpEmitterContext,
p: SdkBodyParameter,
rootApiVersions: string[],
namespace: string,
): InputBodyParameter {
const parameterType = fromSdkType(sdkContext, p.type);

Expand All @@ -522,6 +558,7 @@ function fromBodyParameter(
decorators: p.decorators,
readOnly: isReadOnly(p),
crossLanguageDefinitionId: p.crossLanguageDefinitionId,
correspondingMethodParams: convertCorrespondingMethodParams(sdkContext, p, namespace),
};

sdkContext.__typeCache.updateSdkOperationParameterReferences(p, retVar);
Expand Down Expand Up @@ -716,7 +753,12 @@ function loadPagingServiceMetadata(
] as SdkModelPropertyType;
const operationParameter = getHttpOperationParameter(method, lastParameterSegment);
if (operationParameter) {
const parameter = fromParameter(context, operationParameter, rootApiVersions);
const parameter = fromParameter(
context,
operationParameter,
rootApiVersions,
namespace,
);
if (parameter) {
nextLinkReInjectedParameters.push(parameter);
}
Expand All @@ -741,6 +783,7 @@ function loadPagingServiceMetadata(
context,
getHttpOperationParameter(method, lastParameterSegment)!,
rootApiVersions,
namespace,
);
if (continuationTokenParameter) {
continuationToken = {
Expand Down
4 changes: 4 additions & 0 deletions packages/http-client-csharp/emitter/src/type/input-type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ export interface InputQueryParameter extends InputPropertyTypeBase {
explode: boolean;
scope: InputParameterScope;
serializedName: string;
correspondingMethodParams?: InputMethodParameter[];
}

export interface InputPathParameter extends InputPropertyTypeBase {
Expand All @@ -218,6 +219,7 @@ export interface InputPathParameter extends InputPropertyTypeBase {
serverUrlTemplate?: string;
scope: InputParameterScope;
serializedName: string;
correspondingMethodParams?: InputMethodParameter[];
}

export interface InputHeaderParameter extends InputPropertyTypeBase {
Expand All @@ -227,6 +229,7 @@ export interface InputHeaderParameter extends InputPropertyTypeBase {
isContentType: boolean;
scope: InputParameterScope;
serializedName: string;
correspondingMethodParams?: InputMethodParameter[];
}

export interface InputBodyParameter extends InputPropertyTypeBase {
Expand All @@ -235,6 +238,7 @@ export interface InputBodyParameter extends InputPropertyTypeBase {
defaultContentType: string;
scope: InputParameterScope;
serializedName: string;
correspondingMethodParams?: InputMethodParameter[];
}

export interface InputEndpointParameter extends InputPropertyTypeBase {
Expand Down
Loading
Loading