From 1f1295160941949ab4e569b6d9ec82ce3cf51058 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 4 Sep 2024 10:23:50 -0400 Subject: [PATCH 1/2] fix: missing untyped node imports Signed-off-by: Vincent Biret --- CHANGELOG.md | 1 + src/Kiota.Builder/Refiners/CSharpRefiner.cs | 3 +++ src/Kiota.Builder/Refiners/GoRefiner.cs | 3 +++ src/Kiota.Builder/Refiners/JavaRefiner.cs | 5 ++++- src/Kiota.Builder/Refiners/TypeScriptRefiner.cs | 2 +- 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a981fdc6f..136e0bd963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Fixed shorthand for refresh option in workspace experience. [#5240](https://github.com/microsoft/kiota/issues/5240) +- Fixed a bug where untyped node imports would be missing CSharp/Go/TypeScript/Java. [#5326](https://github.com/microsoft/kiota/issues/5326) - Fixed missing type options in help for plugin commands. [#5230](https://github.com/microsoft/kiota/issues/5230) - Removed OpenAI plugins generation since the service does not support them anymore. - Fixed a bug where the error message would not be deserialized if the property name matched a reserved property. [#5311](https://github.com/microsoft/kiota/issues/5311) diff --git a/src/Kiota.Builder/Refiners/CSharpRefiner.cs b/src/Kiota.Builder/Refiners/CSharpRefiner.cs index 92192b67a0..31c12c6bbe 100644 --- a/src/Kiota.Builder/Refiners/CSharpRefiner.cs +++ b/src/Kiota.Builder/Refiners/CSharpRefiner.cs @@ -185,6 +185,9 @@ protected static void MakeEnumPropertiesNullable(CodeElement currentElement) AbstractionsNamespaceName, "RequestHeaders"), new (static x => x is CodeProperty prop && prop.IsOfKind(CodePropertyKind.Custom) && prop.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase), SerializationNamespaceName, KiotaBuilder.UntypedNodeName), + new (static x => x is CodeMethod @method && @method.IsOfKind(CodeMethodKind.RequestExecutor) && (method.ReturnType.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase) || + method.Parameters.Any(x => x.Kind is CodeParameterKind.RequestBody && x.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase))), + SerializationNamespaceName, KiotaBuilder.UntypedNodeName), new (static x => x is CodeEnum prop && prop.Options.Any(x => x.IsNameEscaped), "System.Runtime.Serialization", "EnumMemberAttribute"), new (static x => x is IDeprecableElement element && element.Deprecation is not null && element.Deprecation.IsDeprecated, diff --git a/src/Kiota.Builder/Refiners/GoRefiner.cs b/src/Kiota.Builder/Refiners/GoRefiner.cs index 042d67d473..ca5480c6cb 100644 --- a/src/Kiota.Builder/Refiners/GoRefiner.cs +++ b/src/Kiota.Builder/Refiners/GoRefiner.cs @@ -598,6 +598,9 @@ x.Type is CodeType pType && AbstractionsNamespaceName, MultipartBodyClassName), new (static x => x is CodeProperty prop && prop.IsOfKind(CodePropertyKind.Custom) && prop.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase), SerializationNamespaceName, KiotaBuilder.UntypedNodeName), + new (static x => x is CodeMethod @method && @method.IsOfKind(CodeMethodKind.RequestExecutor) && (method.ReturnType.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase) || + method.Parameters.Any(x => x.Kind is CodeParameterKind.RequestBody && x.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase))), + SerializationNamespaceName, KiotaBuilder.UntypedNodeName), new (static x => x is CodeEnum @enum && @enum.Flags,"", "math"), }; private const string MultipartBodyClassName = "MultipartBody"; diff --git a/src/Kiota.Builder/Refiners/JavaRefiner.cs b/src/Kiota.Builder/Refiners/JavaRefiner.cs index 5f9531e77c..834f74d2da 100644 --- a/src/Kiota.Builder/Refiners/JavaRefiner.cs +++ b/src/Kiota.Builder/Refiners/JavaRefiner.cs @@ -264,7 +264,10 @@ private static void AddEnumSetImport(CodeElement currentElement) AbstractionsNamespaceName, "QueryParameters"), new (static x => x is CodeClass @class && @class.OriginalComposedType is CodeIntersectionType intersectionType && intersectionType.Types.Any(static y => !y.IsExternal), SerializationNamespaceName, "ParseNodeHelper"), - new (static x => (x is CodeMethod @method && @method.IsOfKind(CodeMethodKind.Getter, CodeMethodKind.Setter) && @method.AccessedProperty != null && (@method.AccessedProperty.IsOfKind(CodePropertyKind.Custom) && @method.AccessedProperty.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase) )) , + new (static x => x is CodeMethod @method && @method.IsOfKind(CodeMethodKind.Getter, CodeMethodKind.Setter) && @method.AccessedProperty != null && @method.AccessedProperty.IsOfKind(CodePropertyKind.Custom) && @method.AccessedProperty.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase), + SerializationNamespaceName, KiotaBuilder.UntypedNodeName), + new (static x => x is CodeMethod @method && @method.IsOfKind(CodeMethodKind.RequestExecutor) && (method.ReturnType.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase) || + method.Parameters.Any(x => x.Kind is CodeParameterKind.RequestBody && x.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase))), SerializationNamespaceName, KiotaBuilder.UntypedNodeName), new (static x => x is CodeMethod method && method.IsOfKind(CodeMethodKind.RequestExecutor, CodeMethodKind.RequestGenerator) && method.Parameters.Any(static y => y.IsOfKind(CodeParameterKind.RequestBody) && y.Type.Name.Equals(MultipartBodyClassName, StringComparison.OrdinalIgnoreCase)), AbstractionsNamespaceName, MultipartBodyClassName) diff --git a/src/Kiota.Builder/Refiners/TypeScriptRefiner.cs b/src/Kiota.Builder/Refiners/TypeScriptRefiner.cs index ebf8e8a5b8..e4e49305a1 100644 --- a/src/Kiota.Builder/Refiners/TypeScriptRefiner.cs +++ b/src/Kiota.Builder/Refiners/TypeScriptRefiner.cs @@ -727,7 +727,7 @@ private static bool HasMultipartBody(CodeMethod m) => new (static x => x is CodeMethod m && HasMultipartBody(m), AbstractionsPackageName, MultipartBodyClassName, $"serialize{MultipartBodyClassName}"), new (static x => (x is CodeProperty prop && prop.IsOfKind(CodePropertyKind.Custom) && prop.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase)) - || (x is CodeMethod method && (method.Parameters.Any(param => param.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase)) || method.ReturnType.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase))), + || (x is CodeMethod method && (method.Parameters.Any(param => param.Kind is CodeParameterKind.RequestBody && param.Type.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase)) || method.ReturnType.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase))), AbstractionsPackageName, KiotaBuilder.UntypedNodeName, "createUntypedNodeFromDiscriminatorValue"), }; private const string MultipartBodyClassName = "MultipartBody"; From bf80d9a865178c85e5f42a25261efacb460802e8 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 4 Sep 2024 10:34:02 -0400 Subject: [PATCH 2/2] fix: fixes failing unit tests Signed-off-by: Vincent Biret --- .../Refiners/GoLanguageRefinerTests.cs | 33 ++++++++++++++++++- .../Refiners/JavaLanguageRefinerTests.cs | 32 ++++++++++++++++++ .../TypeScriptLanguageRefinerTests.cs | 3 +- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/tests/Kiota.Builder.Tests/Refiners/GoLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/GoLanguageRefinerTests.cs index 3b15cd05b7..89b181d86c 100644 --- a/tests/Kiota.Builder.Tests/Refiners/GoLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/GoLanguageRefinerTests.cs @@ -1195,6 +1195,37 @@ public async Task NormalizeNamespaceNameAsync() Assert.Equal("github.com/OrgName/RepoName.apisdk.models", models.Name); Assert.Equal("github.com/OrgName/RepoName.apisdk.models.submodels.camelcase", camelCaseModel.Name); } - + [Fact] + public async Task AddsUsingForUntypedNodeInMethodParameterAsync() + { + var requestBuilderClass = root.AddClass(new CodeClass() { Name = "NodeRequestBuilder" }).First(); + var method = new CodeMethod + { + Name = "getAsync", + ReturnType = new CodeType + { + Name = "string", + IsExternal = true + }, + Kind = CodeMethodKind.RequestExecutor + }; + method.AddParameter(new CodeParameter() + { + Name = "jsonData", + Type = new CodeType() + { + Name = KiotaBuilder.UntypedNodeName, + IsExternal = true + }, + Kind = CodeParameterKind.RequestBody + }); + requestBuilderClass.AddMethod(method); + await ILanguageRefiner.RefineAsync(new GenerationConfiguration { Language = GenerationLanguage.Go }, root); + Assert.Equal(GoRefiner.UntypedNodeName, method.Parameters.First().Type.Name);// type is renamed + Assert.NotEmpty(requestBuilderClass.StartBlock.Usings); + var nodeUsing = requestBuilderClass.StartBlock.Usings.Where(static declaredUsing => declaredUsing.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase)).ToArray(); + Assert.Single(nodeUsing); + Assert.Equal("github.com/microsoft/kiota-abstractions-go/serialization", nodeUsing[0].Declaration.Name); + } #endregion } diff --git a/tests/Kiota.Builder.Tests/Refiners/JavaLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/JavaLanguageRefinerTests.cs index 6330b5931d..c59250d4eb 100644 --- a/tests/Kiota.Builder.Tests/Refiners/JavaLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/JavaLanguageRefinerTests.cs @@ -729,5 +729,37 @@ public async Task AddsUsingForUntypedNodeAsync(bool usesBackingStore) Assert.Equal(2, nodeUsing.Length); // one for the getter and another for setter. Writer will unionise Assert.Equal("com.microsoft.kiota.serialization", nodeUsing[0].Declaration.Name); } + [Fact] + public async Task AddsUsingForUntypedNodeInMethodParameterAsync() + { + var requestBuilderClass = root.AddClass(new CodeClass() { Name = "NodeRequestBuilder" }).First(); + var method = new CodeMethod + { + Name = "getAsync", + ReturnType = new CodeType + { + Name = "string", + IsExternal = true + }, + Kind = CodeMethodKind.RequestExecutor + }; + method.AddParameter(new CodeParameter() + { + Name = "jsonData", + Type = new CodeType() + { + Name = KiotaBuilder.UntypedNodeName, + IsExternal = true + }, + Kind = CodeParameterKind.RequestBody + }); + requestBuilderClass.AddMethod(method); + await ILanguageRefiner.RefineAsync(new GenerationConfiguration { Language = GenerationLanguage.Java }, root); + Assert.Equal(KiotaBuilder.UntypedNodeName, method.Parameters.First().Type.Name);// type is renamed + Assert.NotEmpty(requestBuilderClass.StartBlock.Usings); + var nodeUsing = requestBuilderClass.StartBlock.Usings.Where(static declaredUsing => declaredUsing.Name.Equals(KiotaBuilder.UntypedNodeName, StringComparison.OrdinalIgnoreCase)).ToArray(); + Assert.Single(nodeUsing); + Assert.Equal("com.microsoft.kiota.serialization", nodeUsing[0].Declaration.Name); + } #endregion } diff --git a/tests/Kiota.Builder.Tests/Refiners/TypeScriptLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/TypeScriptLanguageRefinerTests.cs index 8cbd26de8b..3248048776 100644 --- a/tests/Kiota.Builder.Tests/Refiners/TypeScriptLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/TypeScriptLanguageRefinerTests.cs @@ -1014,7 +1014,8 @@ public async Task AddsUsingForUntypedNodeInMethodParameterAsync() { Name = KiotaBuilder.UntypedNodeName, IsExternal = true - } + }, + Kind = CodeParameterKind.RequestBody }); requestBuilderClass.AddMethod(method); await ILanguageRefiner.RefineAsync(new GenerationConfiguration { Language = GenerationLanguage.TypeScript }, root);