(ctx *WriteContext, value reflect.Value, hasGenerics bool)
| 156 | } |
| 157 | |
| 158 | func (s *sliceSerializer) writeDataWithGenerics(ctx *WriteContext, value reflect.Value, hasGenerics bool) { |
| 159 | length := value.Len() |
| 160 | buf := ctx.Buffer() |
| 161 | |
| 162 | // WriteData length |
| 163 | buf.WriteVarUint32(uint32(length)) |
| 164 | if length == 0 { |
| 165 | return |
| 166 | } |
| 167 | |
| 168 | elemType := s.type_.Elem() |
| 169 | elemTypeInfo, _ := ctx.TypeResolver().getTypeInfo(reflect.New(elemType).Elem(), false) |
| 170 | elemDeclared := hasGenerics |
| 171 | if elemDeclared && elemTypeInfo != nil && needsElemTypeInfo(TypeId(elemTypeInfo.TypeID)) { |
| 172 | elemDeclared = false |
| 173 | } |
| 174 | |
| 175 | // Determine collection flags. User/ext elements still write TypeInfo so |
| 176 | // nested compatible struct readers can classify the element schema. |
| 177 | collectFlag := CollectionIsSameType |
| 178 | if elemDeclared { |
| 179 | collectFlag |= CollectionIsDeclElementType |
| 180 | } |
| 181 | hasNull := false |
| 182 | isPointerElem := elemType.Kind() == reflect.Ptr |
| 183 | |
| 184 | // Check for null values first (only applicable for pointer element types) |
| 185 | if isPointerElem { |
| 186 | for i := 0; i < length; i++ { |
| 187 | elem := value.Index(i) |
| 188 | if elem.IsNil() { |
| 189 | hasNull = true |
| 190 | break |
| 191 | } |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | if hasNull { |
| 196 | collectFlag |= CollectionHasNull |
| 197 | } |
| 198 | trackRefs := ctx.TrackRef() && s.referencable |
| 199 | if trackRefs { |
| 200 | collectFlag |= CollectionTrackingRef |
| 201 | } |
| 202 | buf.WriteInt8(int8(collectFlag)) |
| 203 | |
| 204 | // Write element type info unless the element schema fully declares it. |
| 205 | if !elemDeclared { |
| 206 | ctx.TypeResolver().WriteTypeInfo(buf, elemTypeInfo, ctx.Err()) |
| 207 | } |
| 208 | |
| 209 | // WriteData elements |
| 210 | trackRefs = (collectFlag & CollectionTrackingRef) != 0 |
| 211 | elemRefMode := RefModeNone |
| 212 | if trackRefs { |
| 213 | elemRefMode = RefModeTracking |
| 214 | } |
| 215 |
no test coverage detected