Exemplo n.º 1
0
    public override void GenerateWrite(
        StructuredStringBuilder sb,
        ObjectGeneration objGen,
        TypeGeneration typeGen,
        Accessor writerAccessor,
        Accessor itemAccessor,
        Accessor errorMaskAccessor,
        Accessor nameAccessor,
        Accessor translationMaskAccessor)
    {
        using (sb.CurlyBrace(doIt: !XmlMod.TranslationMaskParameter))
        {
            if (typeGen.Nullable)
            {
                sb.AppendLine($"if ({itemAccessor.Access} is {{}} {typeGen.Name}Item)");
                itemAccessor = $"{typeGen.Name}Item";
            }
            else
            {
                // We want to cache retrievals, in case it's a wrapper being written
                sb.AppendLine($"var {typeGen.Name}Item = {itemAccessor.Access};");
                itemAccessor = $"{typeGen.Name}Item";
            }

            using (sb.CurlyBrace(doIt: typeGen.Nullable))
            {
                var    loquiGen = typeGen as LoquiType;
                string line;
                if (loquiGen.TargetObjectGeneration != null)
                {
                    line = $"(({XmlMod.TranslationWriteClassName(loquiGen.TargetObjectGeneration)})(({nameof(IXmlItem)}){typeGen.Name}Item).{XmlMod.TranslationWriteItemMember})";
                }
                else
                {
                    line = $"(({XmlMod.TranslationWriteInterface})(({nameof(IXmlItem)}){typeGen.Name}Item).{XmlMod.TranslationWriteItemMember})";
                }
                using (var args = sb.Call($"{line}.Write{loquiGen.GetGenericTypes(getter: true, additionalMasks: new MaskType[] { MaskType.Normal })}"))
                {
                    args.Add($"item: {typeGen.Name}Item");
                    args.Add($"{XmlTranslationModule.XElementLine.GetParameterName(objGen, Context.Backend)}: {writerAccessor}");
                    args.Add($"name: {nameAccessor}");
                    if (typeGen.HasIndex)
                    {
                        args.Add($"fieldIndex: (int){typeGen.IndexEnumName}");
                    }
                    args.Add($"errorMask: {errorMaskAccessor}");
                    if (XmlMod.TranslationMaskParameter)
                    {
                        if (typeGen.HasIndex)
                        {
                            args.Add($"translationMask: {translationMaskAccessor}?.GetSubCrystal({typeGen.IndexEnumInt})");
                        }
                        else
                        {
                            args.Add($"translationMask: {translationMaskAccessor}");
                        }
                    }
                }
            }
        }
    }