From 60330594abc174aaaffc07009cdbca25bc1ed5b9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 15 Sep 2026 19:26:50 +0000 Subject: [PATCH 1/2] Initial plan From 950c3cd7150ba043ae6b171ed74a5d8f611a32de Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 15 Sep 2026 19:35:45 +0000 Subject: [PATCH 2/2] fix(http-client-csharp): remove unused InputOperation ResourceName Co-authored-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> --- .../emitter/src/lib/operation-converter.ts | 30 +---------------- .../emitter/src/type/input-operation.ts | 1 - .../test/Unit/operation-converter.test.ts | 1 + .../src/InputTypes/InputOperation.cs | 9 ----- .../Serialization/InputOperationConverter.cs | 3 -- .../test/TypeSpecInputConverterTests.cs | 33 +++++++++++++++++++ .../test/common/InputFactory.cs | 1 - 7 files changed, 35 insertions(+), 43 deletions(-) diff --git a/packages/http-client-csharp/emitter/src/lib/operation-converter.ts b/packages/http-client-csharp/emitter/src/lib/operation-converter.ts index 21d4fdbc3dd..1a42806c90b 100644 --- a/packages/http-client-csharp/emitter/src/lib/operation-converter.ts +++ b/packages/http-client-csharp/emitter/src/lib/operation-converter.ts @@ -4,7 +4,6 @@ import type { SdkBodyParameter, SdkBuiltInKinds, - SdkContext, SdkHeaderParameter, SdkHttpOperation, SdkHttpParameter, @@ -41,7 +40,6 @@ import { } from "@typespec/compiler"; import { unsafe_getEventDefinitions } from "@typespec/events/experimental"; import type { HttpStatusCodeRange } from "@typespec/http"; -import { getResourceOperation } from "@typespec/rest"; import { isTerminalEvent } from "@typespec/sse"; import type { CSharpEmitterContext } from "../sdk-context.js"; import { collectionFormatToDelimMap } from "../type/collection-format.js"; @@ -76,7 +74,7 @@ import type { OperationResponse } from "../type/operation-response.js"; import { RequestLocation } from "../type/request-location.js"; import { parseHttpRequestMethod } from "../type/request-method.js"; import { ResponseLocation } from "../type/response-location.js"; -import { getExternalDocs, getOperationId } from "./decorators.js"; +import { getExternalDocs } from "./decorators.js"; import { fromSdkHttpExamples } from "./example-converter.js"; import { createDiagnostic } from "./lib.js"; import { fromSdkType } from "./type-converter.js"; @@ -220,10 +218,6 @@ export function fromSdkServiceMethodOperation( operation = { name: method.name, isExactName: method.isExactName, - resourceName: - getResourceOperation(sdkContext.program, method.operation.__raw.operation)?.resourceType - .name ?? - getOperationGroupName(sdkContext, method.operation, getClientNamespaceString(sdkContext)!), deprecated: getDeprecated(sdkContext.program, method.__raw!), summary: method.summary, doc: method.doc, @@ -1102,28 +1096,6 @@ function getParameterScope( : InputParameterScope.Method; } -function getOperationGroupName( - context: SdkContext, - operation: SdkHttpOperation, - namespace: string, -): string { - const explicitOperationId = getOperationId(context, operation.__raw.operation); - if (explicitOperationId) { - const ids: string[] = explicitOperationId.split("_"); - if (ids.length > 1) { - return ids.slice(0, -2).join("_"); - } - } - - if (operation.__raw.operation.interface) { - return operation.__raw.operation.interface.name; - } - if (operation.__raw.operation.namespace) { - return operation.__raw.operation.namespace.name; - } - return namespace; -} - // TODO: remove after https://github.com/Azure/typespec-azure/issues/1227 is fixed function normalizeHeaderName(name: string): string { switch (name.toLocaleLowerCase()) { diff --git a/packages/http-client-csharp/emitter/src/type/input-operation.ts b/packages/http-client-csharp/emitter/src/type/input-operation.ts index 809719303e7..c7f538d43c5 100644 --- a/packages/http-client-csharp/emitter/src/type/input-operation.ts +++ b/packages/http-client-csharp/emitter/src/type/input-operation.ts @@ -10,7 +10,6 @@ import type { RequestMethod } from "./request-method.js"; export interface InputOperation { name: string; isExactName?: boolean; - resourceName?: string; summary?: string; deprecated?: string; doc?: string; diff --git a/packages/http-client-csharp/emitter/test/Unit/operation-converter.test.ts b/packages/http-client-csharp/emitter/test/Unit/operation-converter.test.ts index c5d503bd45b..30c32aca082 100644 --- a/packages/http-client-csharp/emitter/test/Unit/operation-converter.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/operation-converter.test.ts @@ -62,6 +62,7 @@ describe("Operation Converter", () => { // validate operation const operation = root.clients[0].methods[0].operation; ok(operation); + strictEqual("resourceName" in operation, false); strictEqual(operation.parameters.length, 4); // content type parameter diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputOperation.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputOperation.cs index 20e9f92bfe5..35f1f1d115f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputOperation.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputOperation.cs @@ -13,7 +13,6 @@ public class InputOperation { public InputOperation( string name, - string? resourceName, string? summary, string? doc, string? deprecated, @@ -32,7 +31,6 @@ public InputOperation( string? ns) { Name = name; - ResourceName = resourceName; Summary = summary; Doc = doc; Deprecated = deprecated; @@ -53,7 +51,6 @@ public InputOperation( public InputOperation() : this( name: string.Empty, - resourceName: null, summary: string.Empty, doc: string.Empty, deprecated: null, @@ -83,7 +80,6 @@ public InputOperation() : this( /// Gets the original name of the operation as defined in the TypeSpec before any mutations. /// public string? OriginalName { get; internal set; } - public string? ResourceName { get; internal set; } public string? Summary { get; internal set; } public string? Doc { get; internal set; } public string? Deprecated { get; internal set; } @@ -108,7 +104,6 @@ public InputOperation() : this( public void Update( string? name = null, - string? resourceName = null, string? summary = null, string? doc = null, string? deprecated = null, @@ -130,10 +125,6 @@ public void Update( { Name = name; } - if (resourceName != null) - { - ResourceName = resourceName; - } if (summary != null) { Summary = summary; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputOperationConverter.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputOperationConverter.cs index 4225b8747c7..73df23a40fc 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputOperationConverter.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputOperationConverter.cs @@ -37,7 +37,6 @@ public override void Write(Utf8JsonWriter writer, InputOperation value, JsonSeri resolver.AddReference(id, operation); string? name = null; - string? resourceName = null; string? summary = null; string? doc = null; string? deprecated = null; @@ -62,7 +61,6 @@ public override void Write(Utf8JsonWriter writer, InputOperation value, JsonSeri { var isKnownProperty = reader.TryReadString("name", ref name) || reader.TryReadBoolean("isExactName", ref isExactName) - || reader.TryReadString("resourceName", ref resourceName) || reader.TryReadString("summary", ref summary) || reader.TryReadString("doc", ref doc) || reader.TryReadString("deprecated", ref deprecated) @@ -91,7 +89,6 @@ public override void Write(Utf8JsonWriter writer, InputOperation value, JsonSeri operation.Name = name ?? throw new JsonException("InputOperation must have name"); operation.IsExactName = isExactName; operation.OriginalName = name; - operation.ResourceName = resourceName; operation.Summary = summary; operation.Doc = doc; operation.Deprecated = deprecated; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TypeSpecInputConverterTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TypeSpecInputConverterTests.cs index 72655059718..3fa3c950447 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TypeSpecInputConverterTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TypeSpecInputConverterTests.cs @@ -9,6 +9,39 @@ namespace Microsoft.TypeSpec.Generator.Input.Tests { public class TypeSpecInputConverterTests { + [TestCase(false)] + [TestCase(true)] + public void LoadsOperationWithoutResourceName(bool includeLegacyResourceName) + { + var json = $$""" + { + "$id": "1", + "name": "getWidget", + {{(includeLegacyResourceName ? "\"resourceName\": \"Widget\"," : "")}} + "summary": "Gets a widget", + "httpMethod": "GET", + "uri": "https://example.com", + "path": "/widgets", + "crossLanguageDefinitionId": "Test.getWidget" + } + """; + var options = new JsonSerializerOptions + { + Converters = { new InputOperationConverter(new TypeSpecReferenceHandler()) } + }; + + var operation = JsonSerializer.Deserialize(json, options); + + Assert.IsNotNull(operation); + Assert.AreEqual("getWidget", operation!.Name); + Assert.AreEqual("Gets a widget", operation.Summary); + Assert.AreEqual("GET", operation.HttpMethod); + Assert.AreEqual("https://example.com", operation.Uri); + Assert.AreEqual("/widgets", operation.Path); + Assert.AreEqual("Test.getWidget", operation.CrossLanguageDefinitionId); + Assert.IsNull(typeof(InputOperation).GetProperty("ResourceName")); + } + [Test] public void LoadsPagingWithNextLink() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/common/InputFactory.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/common/InputFactory.cs index 8c53ad05e54..cf5c0f2e5a6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/common/InputFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/common/InputFactory.cs @@ -744,7 +744,6 @@ public static InputOperation Operation( { var operation = new InputOperation( name, - null, "", $"{name} description", null,