private static AArray flatten(AArray what, FlattenSharedState fss) { var processedFields = new List <AValue>(); var atLeastOneChanged = false; foreach (var origElement in what.elements) { if (origElement.Type == ValueTypes.STRUCT) { var flattened = flatten(origElement.castTo <AStruct>(), fss); processedFields.Add(flattened); if (!object.ReferenceEquals(flattened, origElement)) { atLeastOneChanged = true; } } } if (atLeastOneChanged) { return(new AArray(processedFields, what.correspondingDaiFields)); } else { return(what); } }
private static AStruct flatten(AStruct what, FlattenSharedState fss) { if (what.fields.ContainsKey("$")) { var flattened = new AStruct(); flattened.name = what.name; flattened.correspondingDaiFields = what.correspondingDaiFields; doFlatten(what, flattened, fss); return(flattened); } else { return(what); } }
private static void doFlatten(AStruct toProcess, AStruct toAdd, FlattenSharedState fss) { foreach (var field in toProcess.fields) { if (field.Key.Equals("$")) { doFlatten(field.Value.castTo <AStruct>(), toAdd, fss); } else { AValue val; var ftype = field.Value.Type; if (ftype == ValueTypes.STRUCT) { val = flatten(field.Value.castTo <AStruct>(), fss); } else if (ftype == ValueTypes.ARRAY) { val = flatten(field.Value.castTo <AArray>(), fss); } else { val = field.Value; } string key; if (toAdd.fields.ContainsKey(field.Key)) { key = $"{field.Key}_{fss.nonUniquesCounter++}"; } else { key = field.Key; } toAdd.fields.Add(key, val); } } }