@@ -2900,14 +2900,48 @@ private static void GenerateRootDictionaryRead(StringBuilder sb, ITypeSymbol dic
29002900 /// </summary>
29012901 private static void GenerateRootCollectionWrite ( StringBuilder sb , ITypeSymbol collectionType , ITypeSymbol elementType , IReadOnlyList < TypeToGenerate > allTypes )
29022902 {
2903- sb . AppendLine ( " writer.WriteSequenceStart();" ) ;
2904- sb . AppendLine ( " foreach (var item in value)" ) ;
2903+ // Use flow style for empty collections to output [] instead of nothing.
2904+ // For IEnumerable<T> that doesn't implement ICollection, we use TryGetNonEnumeratedCount or enumerate.
2905+ // Since we need to enumerate anyway for writing, we just check ICollection first for efficiency.
2906+ sb . AppendLine ( " var hasItems = false;" ) ;
2907+ sb . AppendLine ( " if (value is System.Collections.ICollection collection)" ) ;
29052908 sb . AppendLine ( " {" ) ;
2909+ sb . AppendLine ( " hasItems = collection.Count > 0;" ) ;
2910+ sb . AppendLine ( " }" ) ;
2911+ sb . AppendLine ( " else" ) ;
2912+ sb . AppendLine ( " {" ) ;
2913+ sb . AppendLine ( " // For pure IEnumerable, we need to start iterating to know if it's empty" ) ;
2914+ sb . AppendLine ( " using var enumerator = value.GetEnumerator();" ) ;
2915+ sb . AppendLine ( " hasItems = enumerator.MoveNext();" ) ;
2916+ sb . AppendLine ( " if (hasItems)" ) ;
2917+ sb . AppendLine ( " {" ) ;
2918+ sb . AppendLine ( " // Non-empty IEnumerable - write sequence with first item, then rest" ) ;
2919+ sb . AppendLine ( " writer.WriteSequenceStart();" ) ;
2920+ sb . AppendLine ( " do" ) ;
2921+ sb . AppendLine ( " {" ) ;
2922+ GenerateElementWrite ( sb , "enumerator.Current" , elementType , allTypes , " " ) ;
2923+ sb . AppendLine ( " } while (enumerator.MoveNext());" ) ;
2924+ sb . AppendLine ( " writer.WriteSequenceEnd();" ) ;
2925+ sb . AppendLine ( " return;" ) ;
2926+ sb . AppendLine ( " }" ) ;
2927+ sb . AppendLine ( " }" ) ;
2928+ sb . AppendLine ( ) ;
2929+ sb . AppendLine ( " if (!hasItems)" ) ;
2930+ sb . AppendLine ( " {" ) ;
2931+ sb . AppendLine ( " writer.WriteSequenceStart(Yamlify.CollectionStyle.Flow);" ) ;
2932+ sb . AppendLine ( " writer.WriteSequenceEnd();" ) ;
2933+ sb . AppendLine ( " }" ) ;
2934+ sb . AppendLine ( " else" ) ;
2935+ sb . AppendLine ( " {" ) ;
2936+ sb . AppendLine ( " writer.WriteSequenceStart();" ) ;
2937+ sb . AppendLine ( " foreach (var item in value)" ) ;
2938+ sb . AppendLine ( " {" ) ;
29062939
2907- GenerateElementWrite ( sb , "item" , elementType , allTypes , " " ) ;
2940+ GenerateElementWrite ( sb , "item" , elementType , allTypes , " " ) ;
29082941
2942+ sb . AppendLine ( " }" ) ;
2943+ sb . AppendLine ( " writer.WriteSequenceEnd();" ) ;
29092944 sb . AppendLine ( " }" ) ;
2910- sb . AppendLine ( " writer.WriteSequenceEnd();" ) ;
29112945 sb . AppendLine ( " }" ) ;
29122946 }
29132947
0 commit comments