From 5f35c3fefafbb46b1edf92db7678b4048761aa72 Mon Sep 17 00:00:00 2001 From: jolov Date: Mon, 8 Dec 2025 15:11:22 -0800 Subject: [PATCH 1/2] Fix external metadata --- .../Serialization/TypeSpecSerialization.cs | 1 + .../tspCodeModel.json | 23 +++++++++++++++++++ .../test/TypeSpecInputConverterTests.cs | 18 +++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TestData/TypeSpecInputConverterTests/LoadsModelWithExternalMetadataEndToEnd/tspCodeModel.json diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs index a9d96ae4e84..0d770784af4 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs @@ -72,6 +72,7 @@ public static class TypeSpecSerialization new TypeSpecInputExampleValueConverter(), new TypeSpecInputParameterExampleConverter(), new TypeSpecInputOperationExampleConverter(), + new InputExternalTypeMetadataConverter(referenceHandler), } }; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TestData/TypeSpecInputConverterTests/LoadsModelWithExternalMetadataEndToEnd/tspCodeModel.json b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TestData/TypeSpecInputConverterTests/LoadsModelWithExternalMetadataEndToEnd/tspCodeModel.json new file mode 100644 index 00000000000..d6e07cf5265 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TestData/TypeSpecInputConverterTests/LoadsModelWithExternalMetadataEndToEnd/tspCodeModel.json @@ -0,0 +1,23 @@ +{ + "$id": "1", + "name": "TestNamespace", + "models": [ + { + "$id": "2", + "kind": "model", + "name": "ExternalModel", + "namespace": "TestNamespace", + "crossLanguageDefinitionId": "TestNamespace.ExternalModel", + "usage": "None", + "properties": [], + "external": { + "identity": "System.Text.Json.JsonElement", + "package": "System.Text.Json", + "minVersion": "8.0.0" + } + } + ], + "clients": [], + "enums": [] +} + 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 a73ae78abc3..7e66619bc7e 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 @@ -621,5 +621,23 @@ public void DeserializeEnumWithExternalMetadata() Assert.IsNull(enumType.External.Package); Assert.IsNull(enumType.External.MinVersion); } + + [Test] + public void LoadsModelWithExternalMetadataEndToEnd() + { + var directory = Helpers.GetAssetFileOrDirectoryPath(false); + // this tspCodeModel.json contains a partial part of the full tspCodeModel.json + var content = File.ReadAllText(Path.Combine(directory, "tspCodeModel.json")); + var inputNamespace = TypeSpecSerialization.Deserialize(content); + + Assert.IsNotNull(inputNamespace); + + var externalModel = inputNamespace!.Models.SingleOrDefault(m => m.Name == "ExternalModel"); + Assert.IsNotNull(externalModel); + Assert.IsNotNull(externalModel!.External, "External metadata should be populated"); + Assert.AreEqual("System.Text.Json.JsonElement", externalModel.External!.Identity); + Assert.AreEqual("System.Text.Json", externalModel.External.Package); + Assert.AreEqual("8.0.0", externalModel.External.MinVersion); + } } } From 1616fb197b687c69ba9fd3aab17d125735a5e993 Mon Sep 17 00:00:00 2001 From: jolov Date: Mon, 8 Dec 2025 15:22:40 -0800 Subject: [PATCH 2/2] Remove reference id --- .../InputExternalTypeMetadataConverter.cs | 28 +++++++------------ .../Serialization/TypeSpecSerialization.cs | 2 +- .../test/TypeSpecInputConverterTests.cs | 10 +++---- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputExternalTypeMetadataConverter.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputExternalTypeMetadataConverter.cs index e31ab43d48d..3c8653d9c6c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputExternalTypeMetadataConverter.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputExternalTypeMetadataConverter.cs @@ -9,13 +9,6 @@ namespace Microsoft.TypeSpec.Generator.Input { internal class InputExternalTypeMetadataConverter : JsonConverter { - private readonly TypeSpecReferenceHandler _referenceHandler; - - public InputExternalTypeMetadataConverter(TypeSpecReferenceHandler referenceHandler) - { - _referenceHandler = referenceHandler; - } - public override InputExternalTypeMetadata? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Null) @@ -23,24 +16,28 @@ public InputExternalTypeMetadataConverter(TypeSpecReferenceHandler referenceHand return null; } - return reader.ReadReferenceAndResolve(_referenceHandler.CurrentResolver) ?? CreateInputExternalTypeMetadata(ref reader, null, options, _referenceHandler.CurrentResolver); + return CreateInputExternalTypeMetadata(ref reader); } public override void Write(Utf8JsonWriter writer, InputExternalTypeMetadata value, JsonSerializerOptions options) => throw new NotSupportedException("Writing not supported"); - public static InputExternalTypeMetadata CreateInputExternalTypeMetadata(ref Utf8JsonReader reader, string? id, JsonSerializerOptions options, ReferenceResolver resolver) + public static InputExternalTypeMetadata CreateInputExternalTypeMetadata(ref Utf8JsonReader reader) { string? identity = null; string? package = null; string? minVersion = null; + if (reader.TokenType == JsonTokenType.StartObject) + { + reader.Read(); + } + while (reader.TokenType != JsonTokenType.EndObject) { - var isKnownProperty = reader.TryReadReferenceId(ref id) - || reader.TryReadString("identity", ref identity) - || reader.TryReadString("package", ref package) - || reader.TryReadString("minVersion", ref minVersion); + var isKnownProperty = reader.TryReadString("identity", ref identity) + || reader.TryReadString("package", ref package) + || reader.TryReadString("minVersion", ref minVersion); if (!isKnownProperty) { @@ -52,11 +49,6 @@ public static InputExternalTypeMetadata CreateInputExternalTypeMetadata(ref Utf8 var externalTypeProperties = new InputExternalTypeMetadata(identity, package, minVersion); - if (id != null) - { - resolver.AddReference(id, externalTypeProperties); - } - return externalTypeProperties; } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs index 0d770784af4..22aeb61683c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/TypeSpecSerialization.cs @@ -72,7 +72,7 @@ public static class TypeSpecSerialization new TypeSpecInputExampleValueConverter(), new TypeSpecInputParameterExampleConverter(), new TypeSpecInputOperationExampleConverter(), - new InputExternalTypeMetadataConverter(referenceHandler), + new InputExternalTypeMetadataConverter(), } }; 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 7e66619bc7e..a8a59f31433 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 @@ -463,7 +463,7 @@ public void DeserializeUnionWithExternalMetadata() new InputTypeConverter(referenceHandler), new InputUnionTypeConverter(referenceHandler), new InputPrimitiveTypeConverter(referenceHandler), - new InputExternalTypeMetadataConverter(referenceHandler) + new InputExternalTypeMetadataConverter() } }; @@ -502,7 +502,7 @@ public void DeserializeModelWithExternalMetadata() { new InputTypeConverter(referenceHandler), new InputModelTypeConverter(referenceHandler), - new InputExternalTypeMetadataConverter(referenceHandler) + new InputExternalTypeMetadataConverter() } }; @@ -537,7 +537,7 @@ public void DeserializeArrayWithExternalMetadata() new InputTypeConverter(referenceHandler), new InputArrayTypeConverter(referenceHandler), new InputPrimitiveTypeConverter(referenceHandler), - new InputExternalTypeMetadataConverter(referenceHandler) + new InputExternalTypeMetadataConverter() } }; @@ -572,7 +572,7 @@ public void DeserializeDictionaryWithExternalMetadata() new InputTypeConverter(referenceHandler), new InputDictionaryTypeConverter(referenceHandler), new InputPrimitiveTypeConverter(referenceHandler), - new InputExternalTypeMetadataConverter(referenceHandler) + new InputExternalTypeMetadataConverter() } }; @@ -610,7 +610,7 @@ public void DeserializeEnumWithExternalMetadata() new InputTypeConverter(referenceHandler), new InputEnumTypeConverter(referenceHandler), new InputPrimitiveTypeConverter(referenceHandler), - new InputExternalTypeMetadataConverter(referenceHandler) + new InputExternalTypeMetadataConverter() } };