From ff3aa8c7294e8ec8b7bb0b9cc5b9384831225084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Rosiek?= Date: Mon, 30 Dec 2024 11:42:23 +0100 Subject: [PATCH 1/4] Making OutputConstructorAttribute optional if there is only one public constructor on OutputType --- .../Serialization/RecordTypeConverterTests.cs | 29 +++++++++++++++++++ sdk/Pulumi/Serialization/Converter.cs | 16 ++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs diff --git a/sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs b/sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs new file mode 100644 index 00000000..60912c3e --- /dev/null +++ b/sdk/Pulumi.Tests/Serialization/RecordTypeConverterTests.cs @@ -0,0 +1,29 @@ +using Pulumi.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Pulumi.Tests.Serialization +{ + public class RecordTypeConverterTests : ConverterTests + { + [OutputType] + public record RecordOutput(string Value1, string Value2); + + [Fact] + public async Task TestRecord() + { + var data = Converter.ConvertValue(NoWarn, "", await SerializeToValueAsync(new Dictionary + { + { "Value1", "lorem" }, + { "Value2", "ipsum" } + })); + + Assert.Equal("lorem", data.Value.Value1); + Assert.Equal("ipsum", data.Value.Value2); + } + } +} diff --git a/sdk/Pulumi/Serialization/Converter.cs b/sdk/Pulumi/Serialization/Converter.cs index 274a79c3..68c107ad 100644 --- a/sdk/Pulumi/Serialization/Converter.cs +++ b/sdk/Pulumi/Serialization/Converter.cs @@ -499,7 +499,19 @@ static bool CheckEnumType(Type targetType, Type underlyingType) } private static ConstructorInfo? GetPropertyConstructor(Type outputTypeArg) - => outputTypeArg.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).FirstOrDefault( - c => c.GetCustomAttribute() != null); + { + var constructors = outputTypeArg.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + var outputConstructor = constructors.FirstOrDefault(c => c.GetCustomAttribute() != null); + if (outputConstructor == null) + { + var publicConstructors = constructors.Where(x => x.IsPublic).ToArray(); + if (publicConstructors.Length == 1) + { + return publicConstructors[0]; + } + } + + return null; + } } } From 73303b93fa5f923391dc97c8f4415c80fd70c4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Rosiek?= Date: Mon, 30 Dec 2024 11:49:17 +0100 Subject: [PATCH 2/4] Create Improvements-438.yaml Add changes file --- .changes/unreleased/Improvements-438.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/unreleased/Improvements-438.yaml diff --git a/.changes/unreleased/Improvements-438.yaml b/.changes/unreleased/Improvements-438.yaml new file mode 100644 index 00000000..d494b290 --- /dev/null +++ b/.changes/unreleased/Improvements-438.yaml @@ -0,0 +1,6 @@ +component: sdk +kind: Improvements +body: Make OutputConstructorAttribute optional +time: 2024-12-30T10:48:22.983 +custom: + PR: "438" From ab7c764a3c89feb1eddd562b1cb5eae20dd13179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Rosiek?= Date: Mon, 30 Dec 2024 12:43:19 +0100 Subject: [PATCH 3/4] Returning outputConstructor --- sdk/Pulumi/Serialization/Converter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/Pulumi/Serialization/Converter.cs b/sdk/Pulumi/Serialization/Converter.cs index 68c107ad..bc0b2a47 100644 --- a/sdk/Pulumi/Serialization/Converter.cs +++ b/sdk/Pulumi/Serialization/Converter.cs @@ -511,7 +511,7 @@ static bool CheckEnumType(Type targetType, Type underlyingType) } } - return null; + return outputConstructor; } } } From bfbd9a93c31d18cfcad708f96d032fa2f15c33a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Rosiek?= Date: Mon, 6 Jan 2025 11:49:42 +0100 Subject: [PATCH 4/4] Changed return style based on PR feedback --- sdk/Pulumi/Serialization/Converter.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/sdk/Pulumi/Serialization/Converter.cs b/sdk/Pulumi/Serialization/Converter.cs index bc0b2a47..10837ee4 100644 --- a/sdk/Pulumi/Serialization/Converter.cs +++ b/sdk/Pulumi/Serialization/Converter.cs @@ -502,16 +502,18 @@ static bool CheckEnumType(Type targetType, Type underlyingType) { var constructors = outputTypeArg.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var outputConstructor = constructors.FirstOrDefault(c => c.GetCustomAttribute() != null); - if (outputConstructor == null) + if (outputConstructor != null) { - var publicConstructors = constructors.Where(x => x.IsPublic).ToArray(); - if (publicConstructors.Length == 1) - { - return publicConstructors[0]; - } + return outputConstructor; + } + + var publicConstructors = constructors.Where(x => x.IsPublic).ToArray(); + if (publicConstructors.Length == 1) + { + return publicConstructors[0]; } - return outputConstructor; + return null; } } }