Skip to content
Open
Show file tree
Hide file tree
Changes from all 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 @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- PHP: generated deserializers with numeric property names now satisfy static return-type analysis. [#7830](https://github.com/microsoft/kiota/issues/7830)
- golang: generated code now always uses LF line endings, so `gofmt` no longer reports formatting differences when generating on Windows.
- golang: make sure all generated code adheres to golangs coding standards
- Fixed non-deterministic model class descriptions when a component schema is referenced from multiple properties with differing reference-level descriptions. [#7927](https://github.com/microsoft/kiota/issues/7927)
Expand Down
21 changes: 15 additions & 6 deletions src/Kiota.Builder/Writers/Php/CodeMethodWriter.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Kiota.Builder.CodeDOM;
using Kiota.Builder.Extensions;
Expand Down Expand Up @@ -680,23 +681,31 @@ private void WriteDeserializerBody(CodeClass parentClass, LanguageWriter writer,
}
private void WriteDeserializerBodyForInheritedModel(CodeMethod method, CodeClass parentClass, LanguageWriter writer, bool extendsModelClass = false)
{
var codeProperties = parentClass.GetPropertiesOfKind(CodePropertyKind.Custom).ToArray();
var codeProperties = parentClass.GetPropertiesOfKind(CodePropertyKind.Custom)
.Where(static x => !x.ExistsInBaseType && x.Setter != null)
.OrderBy(static x => x.Name)
.ToArray();
var hasNumericPropertyName = codeProperties.Any(static x => IsNumericArrayKey(x.WireName));
writer.WriteLine("$o = $this;");
if (hasNumericPropertyName)
writer.WriteLine("/** @var array<string, callable(ParseNode): void> $deserializers */");
writer.WriteLines(
$"return {((extendsModelClass) ? $"array_merge(parent::{method.Name.ToFirstCharacterLowerCase()}(), [" : " [")}");
$"{(hasNumericPropertyName ? "$deserializers =" : "return")} {((extendsModelClass) ? $"array_merge(parent::{method.Name.ToFirstCharacterLowerCase()}(), [" : " [")}");
Comment on lines 692 to +693
writer.IncreaseIndent();
if (codeProperties.Length != 0)
{
codeProperties
.Where(static x => !x.ExistsInBaseType && x.Setter != null)
.OrderBy(static x => x.Name)
.ToList()
.ForEach(x => WriteDeserializerPropertyCallback(x, method, writer));
}
writer.DecreaseIndent();
writer.WriteLine(extendsModelClass ? "]);" : "];");
if (hasNumericPropertyName)
writer.WriteLine("return $deserializers;");
}

private static bool IsNumericArrayKey(string key) =>
long.TryParse(key, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value) &&
value.ToString(CultureInfo.InvariantCulture).Equals(key, StringComparison.Ordinal);

private void WriteDeserializerPropertyCallback(CodeProperty property, CodeMethod method, LanguageWriter writer)
{
if (property.Type.CollectionKind != CodeTypeBase.CodeTypeCollectionKind.None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,14 @@ public async Task EscapesIndexerPathParameterNameAsync()
"'dOB' => fn(ParseNode $n) => $o->setDOB($n->getDateTimeValue()),"
},
new object[]
{
new CodeProperty { Name = "fiveHundred", Type = new CodeType { Name = "int32" }, Access = AccessModifier.Private, Kind = CodePropertyKind.Custom, SerializationName = "500" },
"/** @var array<string, callable(ParseNode): void> $deserializers */",
"$deserializers =",
"'500' => fn(ParseNode $n) => $o->setFiveHundred($n->getIntegerValue()),",
"return $deserializers;"
},
new object[]
{
new CodeProperty { Name = "story", Type = new CodeType { Name = "binary" }, Access = AccessModifier.Private, Kind = CodePropertyKind.Custom },
"'story' => fn(ParseNode $n) => $o->setStory($n->getBinaryContent()),"
Expand Down