Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Fixes a bug where invalid C# code is generated when API path contains an underscore [#6698](https://github.com/microsoft/kiota/issues/6698)
- Fixed a bug where union of integer and boolean types collection would not compile in dotnet. [#6834](https://github.com/microsoft/kiota/issues/6834)
- Fixed a bug where default values for query parameters are not generated in C# code. [#6836](https://github.com/microsoft/kiota/issues/6836)
Comment thread
baywet marked this conversation as resolved.
Outdated

## [1.28.0] - 2025-07-11

Expand Down
21 changes: 15 additions & 6 deletions src/Kiota.Builder/KiotaBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1201,12 +1201,21 @@ openApiExtension is OpenApiPrimaryErrorMessageExtension primaryErrorMessageExten
if (prop.IsOfKind(CodePropertyKind.Custom, CodePropertyKind.QueryParameter) &&
!propertyName.Equals(childIdentifier, StringComparison.Ordinal))
prop.SerializationName = childIdentifier;
if (kind == CodePropertyKind.Custom &&
propertySchema?.Default is JsonValue stringDefaultJsonValue &&
stringDefaultJsonValue.TryGetValue<string>(out var stringDefaultValue) &&
!string.IsNullOrEmpty(stringDefaultValue) &&
!"null".Equals(stringDefaultValue, StringComparison.OrdinalIgnoreCase))
prop.DefaultValue = $"\"{stringDefaultValue}\"";
if ((kind == CodePropertyKind.Custom || kind == CodePropertyKind.QueryParameter) &&
propertySchema?.Default is JsonValue defaultJsonValue &&
defaultJsonValue.TryGetValue<string>(out var stringDefaultValue) &&
!string.IsNullOrEmpty(stringDefaultValue) &&
!"null".Equals(stringDefaultValue, StringComparison.OrdinalIgnoreCase))
{
if ((propertySchema.Type & ~JsonSchemaType.Null) == JsonSchemaType.Integer && int.TryParse(stringDefaultValue, out var intValue))
prop.DefaultValue = intValue.ToString(CultureInfo.InvariantCulture);
else if ((propertySchema.Type & ~JsonSchemaType.Null) == JsonSchemaType.Number && double.TryParse(stringDefaultValue, out var doubleValue))
prop.DefaultValue = doubleValue.ToString(CultureInfo.InvariantCulture);
else if ((propertySchema.Type & ~JsonSchemaType.Null) == JsonSchemaType.Boolean && bool.TryParse(stringDefaultValue, out var boolValue))
prop.DefaultValue = boolValue.ToString().ToLowerInvariant();
else
prop.DefaultValue = $"\"{stringDefaultValue}\"";
}

if (existingType == null)
{
Expand Down
13 changes: 13 additions & 0 deletions src/Kiota.Builder/Writers/CSharp/CodePropertyWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,19 @@ private void WritePropertyInternal(CodeProperty codeElement, LanguageWriter writ
var setterAccessModifier = codeElement.ReadOnly && codeElement.Access > AccessModifier.Private ? "private " : string.Empty;
var simpleBody = $"get; {setterAccessModifier}set;";
var defaultValue = string.Empty;
if (!string.IsNullOrEmpty(codeElement.DefaultValue))
{
if (codeElement.Type is CodeType propertyCodeType && propertyCodeType.TypeDefinition is CodeEnum enumDefinition)
{
var enumTypeName = conventions.GetTypeString(codeElement.Type, codeElement, true, false);
var enumValue = codeElement.DefaultValue.Trim('"').CleanupSymbolName().ToFirstCharacterUpperCase();
defaultValue = $" = {enumTypeName}.{enumValue};";
}
else
{
defaultValue = $" = {codeElement.DefaultValue};";
}
}
switch (codeElement.Kind)
{
case CodePropertyKind.RequestBuilder:
Expand Down
14 changes: 14 additions & 0 deletions src/Kiota.Builder/Writers/Java/CodePropertyWriter.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using Kiota.Builder.CodeDOM;
using Kiota.Builder.Extensions;

namespace Kiota.Builder.Writers.Java;
public class CodePropertyWriter : BaseElementWriter<CodeProperty, JavaConventionService>
Expand All @@ -18,6 +19,19 @@ public override void WriteCodeElement(CodeProperty codeElement, LanguageWriter w
string.Empty;
conventions.WriteLongDescription(codeElement, writer, [returnRemark]);
var defaultValue = string.Empty;
if (!string.IsNullOrEmpty(codeElement.DefaultValue))
{
if (codeElement.Type is CodeType propertyCodeType && propertyCodeType.TypeDefinition is CodeEnum enumDefinition)
{
var enumTypeName = conventions.GetTypeString(codeElement.Type, codeElement);
var enumValue = codeElement.DefaultValue.Trim('"').CleanupSymbolName().ToFirstCharacterUpperCase();
defaultValue = $" = {enumTypeName}.{enumValue}";
}
else
{
defaultValue = $" = {codeElement.DefaultValue}";
}
}
conventions.WriteDeprecatedAnnotation(codeElement, writer);
switch (codeElement.Kind)
{
Expand Down
16 changes: 15 additions & 1 deletion src/Kiota.Builder/Writers/Php/CodePropertyWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,21 @@ public override void WriteCodeElement(CodeProperty codeElement, LanguageWriter w
break;
default:
WritePropertyDocComment(codeElement, writer);
writer.WriteLine($"{propertyAccess} {(codeElement.Type.IsNullable ? "?" : string.Empty)}{propertyType} ${propertyName}{(codeElement.Type.IsNullable ? " = null" : string.Empty)};");
var defaultValue = codeElement.Type.IsNullable ? " = null" : string.Empty;
if (!string.IsNullOrEmpty(codeElement.DefaultValue))
{
if (codeElement.Type is CodeType propertyCodeType && propertyCodeType.TypeDefinition is CodeEnum enumDefinition)
{
var enumTypeName = conventions.GetTypeString(codeElement.Type, codeElement);
var enumValue = codeElement.DefaultValue.Trim('"').CleanupSymbolName().ToFirstCharacterUpperCase();
defaultValue = $" = {enumTypeName}::{enumValue}";
}
else
{
defaultValue = $" = {codeElement.DefaultValue}";
}
}
writer.WriteLine($"{propertyAccess} {(codeElement.Type.IsNullable ? "?" : string.Empty)}{propertyType} ${propertyName}{defaultValue};");
break;
}
writer.WriteLine("");
Expand Down
11 changes: 10 additions & 1 deletion src/Kiota.Builder/Writers/Python/CodePropertyWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,16 @@ public override void WriteCodeElement(CodeProperty codeElement, LanguageWriter w
var defaultValue = isNonNullableCollection ? "[]" : "None";
if (!string.IsNullOrEmpty(codeElement.DefaultValue))
{
defaultValue = codeElement.DefaultValue;
if (codeElement.Type is CodeType propertyCodeType && propertyCodeType.TypeDefinition is CodeEnum enumDefinition)
{
var enumTypeName = conventions.GetTypeString(codeElement.Type, codeElement);
var enumValue = codeElement.DefaultValue.Trim('"').CleanupSymbolName().ToFirstCharacterUpperCase();
defaultValue = $"{enumTypeName}.{enumValue}";
}
else
{
defaultValue = codeElement.DefaultValue;
}
}
writer.WriteLine($"{conventions.GetAccessModifier(codeElement.Access)}{codeElement.NamePrefix}{codeElement.Name}: {(codeElement.Type.IsNullable ? "Optional[" : string.Empty)}{returnType}{(codeElement.Type.IsNullable ? "]" : string.Empty)} = {defaultValue}");
writer.WriteLine();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,99 @@ public void WritesCustomProperty()
Assert.Contains("get; set;", result);
}
[Fact]
public void WritesCustomPropertyWithDefaultValue()
{
property.Kind = CodePropertyKind.Custom;
property.DefaultValue = $"new {TypeName}()";
writer.Write(property);
var result = tw.ToString();
Assert.Contains($"{TypeName} {PropertyName}", result);
Assert.Contains("get; set;", result);
Assert.Contains($" = new {TypeName}()", result);
}
[Fact]
public void WritesQueryParameterWithDefaultEnumValue()
{
var enumProperty = new CodeProperty
{
Name = "EnumProperty",
Type = new CodeType
{
Name = "SomeEnum",
TypeDefinition = rootNamespace.AddEnum(new CodeEnum
{
Name = "SomeEnum"
}).First()
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "EnumValue2",
};
parentClass.AddProperty(enumProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(enumProperty);
var result = tw.ToString();
Assert.Contains("SomeEnum? EnumProperty { get; set; } = global::defaultNamespace.SomeEnum.EnumValue2;", result);
}
[Fact]
public void WritesQueryParameterWithDefaultIntValue()
{
var integerProperty = new CodeProperty
{
Name = "IntegerProperty",
Type = new CodeType
{
Name = "Int32"
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "3",
};
parentClass.AddProperty(integerProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(integerProperty);
var result = tw.ToString();
Assert.Contains("Int32? IntegerProperty { get; set; } = 3;", result);
}
[Fact]
public void WritesQueryParameterWithDefaultStringValue()
{
var stringProperty = new CodeProperty
{
Name = "StringProperty",
Type = new CodeType
{
Name = "String"
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "\"SomeString\"",
};
parentClass.AddProperty(stringProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(stringProperty);
var result = tw.ToString();
Assert.Contains("public String? StringProperty { get; set; } = \"SomeString\";", result);
}
[Fact]
public void WritesPrivateSetter()
{
property.Kind = CodePropertyKind.Custom;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,86 @@ public void WritesCollectionFlagEnumsAsOneDimensionalArray()
Assert.Contains("List<", result);
Assert.DoesNotContain("EnumSet", result);
}
[Fact]
public void WritesQueryParameterWithDefaultEnumValue()
{
var enumProperty = new CodeProperty
{
Name = "EnumProperty",
Type = new CodeType
{
Name = "SomeEnum",
TypeDefinition = new CodeEnum
{
Name = "SomeEnum"
}
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "EnumValue2",
};
parentClass.AddProperty(enumProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(enumProperty);
var result = tw.ToString();
Assert.Contains("SomeEnum EnumProperty = SomeEnum.EnumValue2;", result);
}
[Fact]
public void WritesQueryParameterWithDefaultIntValue()
{
var integerProperty = new CodeProperty
{
Name = "IntegerProperty",
Type = new CodeType
{
Name = "Integer"
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "3",
};
parentClass.AddProperty(integerProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(integerProperty);
var result = tw.ToString();
Assert.Contains("Integer IntegerProperty = 3;", result);
}
[Fact]
public void WritesQueryParameterWithDefaultStringValue()
{
var stringProperty = new CodeProperty
{
Name = "StringProperty",
Type = new CodeType
{
Name = "String"
},
Kind = CodePropertyKind.QueryParameter,
DefaultValue = "\"SomeString\"",
};
parentClass.AddProperty(stringProperty, new()
{
Name = "queryParameter",
Kind = CodePropertyKind.QueryParameter,
Type = new CodeType
{
Name = "QueryParameter",
},
});
writer.Write(stringProperty);
var result = tw.ToString();
Assert.Contains("String StringProperty = \"SomeString\";", result);
}
}
Loading
Loading