Skip to content

Commit 9e5a150

Browse files
No bad kitty. No recursive!
1 parent 7548ded commit 9e5a150

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

src/HotChocolate/Core/src/Validation/Rules/FieldVisitor.cs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -384,47 +384,53 @@ private static bool AreArgumentsIdentical(FieldNode fieldA, FieldNode fieldB)
384384
}
385385

386386
private static bool IsValueIdentical(
387-
IValueNode? valueA,
388-
IValueNode? valueB)
387+
IValueNode valueA,
388+
IValueNode valueB)
389389
{
390-
if (valueA is null && valueB is null)
391-
{
392-
return true;
393-
}
394-
395-
if (valueA is null || valueB is null)
396-
{
397-
return false;
398-
}
390+
var stack = new Stack<(IValueNode ValueA, IValueNode ValueB)>();
391+
stack.Push((valueA, valueB));
399392

400-
if (valueA is ObjectValueNode objectA && valueB is ObjectValueNode objectB)
393+
while (stack.Count > 0)
401394
{
402-
var validPairs = 0;
395+
var (currentA, currentB) = stack.Pop();
403396

404-
for (var i = 0; i < objectA.Fields.Count; i++)
397+
if (currentA is ObjectValueNode objectA && currentB is ObjectValueNode objectB)
405398
{
406-
var fieldA = objectA.Fields[i];
399+
if (objectA.Fields.Count != objectB.Fields.Count)
400+
{
401+
return false;
402+
}
407403

408-
for (var j = 0; j < objectB.Fields.Count; j++)
404+
for (var i = 0; i < objectA.Fields.Count; i++)
409405
{
410-
var fieldB = objectB.Fields[j];
406+
var fieldA = objectA.Fields[i];
407+
var matchFound = false;
411408

412-
if (BySyntax.Equals(fieldA.Name, fieldB.Name))
409+
for (var j = 0; j < objectB.Fields.Count; j++)
413410
{
414-
if (IsValueIdentical(fieldA.Value, fieldB.Value))
411+
var fieldB = objectB.Fields[j];
412+
413+
if (BySyntax.Equals(fieldA.Name, fieldB.Name))
415414
{
416-
validPairs++;
415+
stack.Push((fieldA.Value, fieldB.Value));
416+
matchFound = true;
417+
break;
417418
}
419+
}
418420

419-
break;
421+
if (!matchFound)
422+
{
423+
return false;
420424
}
421425
}
422426
}
423-
424-
return objectA.Fields.Count == validPairs;
427+
else if (!BySyntax.Equals(currentA, currentB))
428+
{
429+
return false;
430+
}
425431
}
426432

427-
return BySyntax.Equals(valueA, valueB);
433+
return true;
428434
}
429435

430436
private static bool SameResponseShape(IType typeA, IType typeB)

0 commit comments

Comments
 (0)