Exemple #1
0
 protected override async Task GenerateWriteSnippet(ObjectGeneration obj, StructuredStringBuilder sb)
 {
     sb.AppendLine($"var elem = new XElement(name ?? \"{obj.FullName}\");");
     sb.AppendLine($"{XElementLine.GetParameterName(obj, Context.Backend)}.Add(elem);");
     sb.AppendLine("if (name != null)");
     using (sb.CurlyBrace())
     {
         sb.AppendLine($"elem.SetAttributeValue(\"{XmlConstants.TYPE_ATTRIBUTE}\", \"{obj.FullName}\");");
     }
     using (var args = sb.Call(
                $"WriteToNode{ModuleNickname}"))
     {
         args.Add($"item: item");
         args.Add($"{XElementLine.GetParameterName(obj, Context.Backend)}: elem");
         foreach (var item in MainAPI.ReaderAPI.CustomAPI)
         {
             if (!item.API.TryGetPassthrough(obj, TranslationDirection.Reader, Context.Backend, out var passthrough))
             {
                 continue;
             }
             args.Add(passthrough);
         }
         args.Add($"errorMask: errorMask");
         args.Add($"translationMask: translationMask");
     }
 }
Exemple #2
0
    protected override async Task GenerateCtor(StructuredStringBuilder sb)
    {
        if (BasicCtorPermission == CtorPermissionLevel.noGeneration)
        {
            return;
        }
        using (sb.Region("Ctor"))
        {
            sb.AppendLine($"{BasicCtorPermission.ToStringFast_Enum_Only()} {Name}()");
            using (sb.CurlyBrace())
            {
                List <Task> toDo = new List <Task>();
                toDo.AddRange(gen.GenerationModules.Select(mod => mod.GenerateInCtor(this, sb)));
                var fieldsTask = Task.WhenAll(IterateFields().Select(field => field.GenerateForCtor(sb)));
                toDo.Add(fieldsTask);
                await fieldsTask;
                fieldCtorsGenerated.SetResult();
                await Task.WhenAll(toDo);
                await GenerateInitializer(sb);

                sb.AppendLine("CustomCtor();");
            }
            sb.AppendLine("partial void CustomCtor();");
        }
    }
Exemple #3
0
 public static void Print <TOverall, TSpecific>(this MaskItem <TOverall, TSpecific> maskItem, StructuredStringBuilder sb)
 {
     if (maskItem.Overall != null)
     {
         if (maskItem.Overall is IPrintable printable)
         {
             printable.Print(sb, null);
         }
         else
         {
             sb.AppendLine(maskItem.Overall.ToString());
         }
     }
     if (maskItem.Specific != null)
     {
         if (maskItem.Specific is IPrintable printable)
         {
             printable.Print(sb, null);
         }
         else
         {
             sb.AppendLine(maskItem.Specific.ToString());
         }
     }
 }
Exemple #4
0
 public override void GenerateForCopy(StructuredStringBuilder sb, Accessor accessor, Accessor rhs, Accessor copyMaskAccessor, bool protectedMembers, bool deepCopy)
 {
     if (FixedSize.HasValue && SubTypeGeneration is not LoquiType)
     {
         if (!AlwaysCopy)
         {
             sb.AppendLine($"if ({(deepCopy ? GetTranslationIfAccessor(copyMaskAccessor) : SkipCheck(copyMaskAccessor, deepCopy))})");
         }
         using (sb.CurlyBrace(doIt: !AlwaysCopy))
         {
             if (Nullable)
             {
                 sb.AppendLine($"{accessor} = {rhs}?.ToArray();");
             }
             else
             {
                 sb.AppendLine($"{rhs}.Span.CopyTo({accessor}.AsSpan());");
             }
         }
     }
     else
     {
         base.GenerateForCopy(sb, accessor, rhs, copyMaskAccessor, protectedMembers, deepCopy);
     }
 }
Exemple #5
0
    private void WrapSetAccessor(
        StructuredStringBuilder sb,
        string linePrefix,
        Action <StructuredStringBuilder> toDo)
    {
        StructuredStringBuilder subFg = new StructuredStringBuilder();

        WrapSetCode(subFg, toDo);
        if (subFg.Count > 1)
        {
            sb.AppendLine(linePrefix);
            using (sb.CurlyBrace())
            {
                sb.AppendLines(subFg);
            }
        }
        else if (subFg.Count > 0)
        {
            sb.AppendLine($"{linePrefix} => {subFg[0]}");
        }
        else
        {
            sb.AppendLine($"{linePrefix}");
        }
    }
Exemple #6
0
 public override void GenerateClear(StructuredStringBuilder sb, Accessor identifier)
 {
     if (ReadOnly || !IntegrateField)
     {
         return;
     }
     // ToDo
     // Add internal interface support
     if (InternalSetInterface)
     {
         return;
     }
     if (HasDefault)
     {
         sb.AppendLine($"{identifier.Access} = {ObjectGen.ObjectName}.{DefaultValueMemberName};");
     }
     else if (Nullable)
     {
         sb.AppendLine($"{identifier.Access} = default;");
     }
     else
     {
         sb.AppendLine($"{identifier.Access} = {GetDefault(getter: false)};");
     }
 }
Exemple #7
0
 public override void GenerateClear(StructuredStringBuilder sb, Accessor identifier)
 {
     if (ReadOnly || !IntegrateField)
     {
         return;
     }
     // ToDo
     // Add internal interface support
     if (InternalSetInterface)
     {
         return;
     }
     if (!Enabled)
     {
         return;
     }
     if (Nullable)
     {
         sb.AppendLine($"{identifier.Access} = default;");
     }
     else if (Length.HasValue)
     {
         sb.AppendLine($"{identifier.Access} = new byte[{Length.Value}];");
     }
     else
     {
         sb.AppendLine($"{identifier.Access} = new byte[0];");
     }
 }
Exemple #8
0
 public override void GenerateForEqualsMask(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, string retAccessor)
 {
     if (!Nullable)
     {
         GenerateForEqualsMaskCheck(sb, $"item.{Name}", $"rhs.{Name}", $"ret.{Name}");
     }
     else
     {
         sb.AppendLine($"if ({NullableAccessor(getter: true, accessor: accessor)} == {NullableAccessor(getter: true, accessor: rhsAccessor)})");
         using (sb.CurlyBrace())
         {
             sb.AppendLine($"if ({NullableAccessor(getter: true, accessor: accessor)})");
             using (sb.CurlyBrace())
             {
                 GenerateForEqualsMaskCheck(sb, $"item.{Name}", $"rhs.{Name}", $"ret.{Name}");
             }
             sb.AppendLine($"else");
             using (sb.CurlyBrace())
             {
                 GenerateForEqualsMask(sb, $"ret.{Name}", true);
             }
         }
         sb.AppendLine($"else");
         using (sb.CurlyBrace())
         {
             GenerateForEqualsMask(sb, $"ret.{Name}", false);
         }
     }
 }
Exemple #9
0
 public override void GenerateForEquals(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, Accessor maskAccessor)
 {
     sb.AppendLine($"if ({GetTranslationIfAccessor(maskAccessor)})");
     using (sb.CurlyBrace())
     {
         sb.AppendLine($"if (!{accessor.Access}.{nameof(EnumerableExt.SequenceEqualNullable)}({rhsAccessor.Access})) return false;");
     }
 }
Exemple #10
0
 public override void GenerateForEquals(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, Accessor maskAccessor)
 {
     sb.AppendLine($"if ({GetTranslationIfAccessor(maskAccessor)})");
     using (sb.CurlyBrace())
     {
         sb.AppendLine($"if (!{accessor.Access}.EqualsWithin({rhsAccessor.Access})) return false;");
     }
 }
Exemple #11
0
 public override void GenerateUnsetNth(StructuredStringBuilder sb, Accessor identifier)
 {
     if (!ReadOnly)
     {
         sb.AppendLine($"{identifier}.Unset();");
     }
     sb.AppendLine("break;");
 }
Exemple #12
0
 public void GenerateInterfaceMembers(StructuredStringBuilder sb, string member)
 {
     using (sb.Region("Interface Members"))
     {
         sb.AppendLine($"[DebuggerBrowsable(DebuggerBrowsableState.Never)]");
         sb.AppendLine($"{ListTypeName(getter: true, internalInterface: true)}{NullChar} {ObjectGen.Interface(getter: true, internalInterface: InternalGetInterface)}.{Name} => {member};");
     }
 }
Exemple #13
0
 public override void GenerateSetNth(StructuredStringBuilder sb, Accessor accessor, Accessor rhs, bool internalUse)
 {
     if (!IntegrateField)
     {
         return;
     }
     sb.AppendLine($"{accessor} = {rhs};");
     sb.AppendLine($"break;");
 }
    public void GenerateCopyInRet_Internal(
        StructuredStringBuilder sb,
        ObjectGeneration objGen,
        TypeGeneration typeGen,
        Accessor nodeAccessor,
        Accessor itemAccessor,
        bool ret,
        Accessor errorMaskAccessor,
        Accessor translationMaskAccessor)
    {
        var list = typeGen as ListType;

        if (!XmlMod.TryGetTypeGeneration(list.SubTypeGeneration.GetType(), out var subTransl))
        {
            throw new ArgumentException("Unsupported type generator: " + list.SubTypeGeneration);
        }

        if (ret)
        {
            throw new NotImplementedException();
        }

        MaskGenerationUtility.WrapErrorFieldIndexPush(
            sb: sb,
            toDo: () =>
        {
            using (var args = new Function(
                       sb,
                       $"if ({TranslatorName}<{list.SubTypeGeneration.TypeName(getter: false, needsCovariance: true)}>.Instance.Parse"))
            {
                args.AddPassArg($"{XmlTranslationModule.XElementLine.GetParameterName(objGen, Context.Backend)}");
                args.Add($"enumer: out var {typeGen.Name}Item");
                args.Add($"transl: {subTransl.GetTranslatorInstance(list.SubTypeGeneration, getter: false)}.Parse");
                args.Add("errorMask: errorMask");
                args.Add($"translationMask: {translationMaskAccessor})");
            }
            using (sb.CurlyBrace())
            {
                if (typeGen.Nullable)
                {
                    sb.AppendLine($"{itemAccessor.Access} = {typeGen.Name}Item.ToExtendedList();");
                }
                else
                {
                    sb.AppendLine($"{itemAccessor.Access}.SetTo({typeGen.Name}Item);");
                }
            }
            sb.AppendLine("else");
            using (sb.CurlyBrace())
            {
                list.GenerateClear(sb, itemAccessor);
            }
        },
            errorMaskAccessor: errorMaskAccessor,
            indexAccessor: typeGen.IndexEnumInt);
    }
Exemple #15
0
 public override void GenerateForEquals(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, Accessor maskAccessor)
 {
     sb.AppendLine($"if ({GetTranslationIfAccessor(maskAccessor)})");
     using (sb.CurlyBrace())
     {
         if (SubTypeGeneration is LoquiType subLoq &&
             subLoq.TargetObjectGeneration != null)
         {
             sb.AppendLine($"if (!{accessor.Access}.{(Nullable ? nameof(ICollectionExt.SequenceEqualNullable) : nameof(ICollectionExt.SequenceEqual))}({rhsAccessor.Access}, (l, r) => {subLoq.TargetObjectGeneration.CommonClassSpeccedInstance("l", LoquiInterfaceType.IGetter, CommonGenerics.Class, subLoq.GenericSpecification)}.Equals(l, r, {maskAccessor}?.GetSubCrystal({IndexEnumInt})))) return false;");
         }
Exemple #16
0
 public override void GenerateClear(StructuredStringBuilder sb, Accessor accessor)
 {
     if (Nullable)
     {
         sb.AppendLine($"{accessor} = null;");
     }
     else
     {
         sb.AppendLine($"{accessor}.SetAllTo(default);");
     }
 }
Exemple #17
0
 public override void GenerateClear(StructuredStringBuilder sb, Accessor accessorPrefix)
 {
     if (Nullable)
     {
         sb.AppendLine($"{accessorPrefix}.Unset();");
     }
     else
     {
         sb.AppendLine($"{accessorPrefix}.Clear();");
     }
 }
Exemple #18
0
 public override void GenerateForCopy(StructuredStringBuilder sb, Accessor accessor, Accessor rhs, Accessor copyMaskAccessor, bool protectedMembers, bool deepCopy)
 {
     if (!AlwaysCopy)
     {
         sb.AppendLine($"if ({(deepCopy ? GetTranslationIfAccessor(copyMaskAccessor) : SkipCheck(copyMaskAccessor, deepCopy))})");
     }
     using (sb.CurlyBrace(doIt: !AlwaysCopy))
     {
         sb.AppendLine($"{accessor.Access} = {rhs};");
     }
 }
Exemple #19
0
 public override void GenerateForEquals(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, Accessor maskAccessor)
 {
     if (!IntegrateField)
     {
         return;
     }
     sb.AppendLine($"if ({GetTranslationIfAccessor(maskAccessor)})");
     using (sb.CurlyBrace())
     {
         sb.AppendLine($"if ({GenerateEqualsSnippet(accessor, rhsAccessor, negate: true)}) return false;");
     }
 }
Exemple #20
0
    public override void GenerateForTranslationMask(StructuredStringBuilder sb, TypeGeneration field)
    {
        LoquiType loqui = field as LoquiType;

        if (loqui.RefType == LoquiRefType.Direct)
        {
            sb.AppendLine($"public {loqui.Mask(MaskType.Translation)}? {field.Name};");
        }
        else
        {
            sb.AppendLine($"public bool {field.Name};");
        }
    }
Exemple #21
0
    public override void GenerateForErrorMaskCombine(StructuredStringBuilder sb, TypeGeneration field, string accessor, string retAccessor, string rhsAccessor)
    {
        LoquiType loqui = field as LoquiType;

        if (!IsUnknownGeneric(loqui))
        {
            sb.AppendLine($"{retAccessor} = {accessor}.Combine({rhsAccessor}, (l, r) => l.Combine(r));");
        }
        else
        {
            sb.AppendLine($"{retAccessor} = new MaskItem<Exception?, {loqui.Mask(MaskType.Error)}?>(ExceptionExt.Combine({accessor}.Overall, {rhsAccessor}.Overall), Loqui.Internal.LoquiHelper.Combine({accessor}.Specific, {rhsAccessor}.Specific));");
        }
    }
Exemple #22
0
 public override async Task GenerateForClass(StructuredStringBuilder sb)
 {
     sb.AppendLine($"[DebuggerBrowsable(DebuggerBrowsableState.Never)]");
     sb.AppendLine($"private {TypeName(getter: false)}{NullChar} _{Name}{(Nullable ? null : $" = {GetActualItemClass(ctor: true)}")};");
     Comments?.Apply(sb, LoquiInterfaceType.Direct);
     sb.AppendLine($"public {TypeName(getter: false)}{NullChar} {Name}");
     using (sb.CurlyBrace())
     {
         sb.AppendLine($"get => this._{Name};");
         sb.AppendLine($"{((ReadOnly || !Nullable) ? "init" : "set")} => this._{Name} = value;");
     }
     GenerateInterfaceMembers(sb, $"_{Name}");
 }
Exemple #23
0
 public static void GenerateExceptionCatcher(StructuredStringBuilder sb, Accessor errorMaskAccessor)
 {
     sb.AppendLine("catch (Exception ex)");
     sb.AppendLine($"when ({errorMaskAccessor} != null)");
     using (sb.CurlyBrace())
     {
         sb.AppendLine($"{errorMaskAccessor}.ReportException(ex);");
     }
     sb.AppendLine("finally");
     using (sb.CurlyBrace())
     {
         sb.AppendLine("errorMask?.PopIndex();");
     }
 }
Exemple #24
0
    public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, bool indexed)
    {
        LoquiType loqui = field as LoquiType;

        if (IsUnknownGeneric(loqui))
        {
            sb.AppendLine($"{retAccessor};");
            sb.AppendLine($"throw new {nameof(NotImplementedException)}();");
        }
        else
        {
            sb.AppendLine($"{retAccessor} = {rhsAccessor} == null ? null : new MaskItem{(indexed ? "Indexed" : null)}<R, {loqui.GenerateMaskString("R")}?>({(indexed ? $"{rhsAccessor}.Index, " : null)}eval({rhsAccessor}.Overall), {rhsAccessor}.Specific?.Translate(eval));");
        }
    }
Exemple #25
0
 protected override async Task GenerateNewSnippet(ObjectGeneration obj, StructuredStringBuilder sb)
 {
     if (obj.Abstract)
     {
         sb.AppendLine($"if (!LoquiXmlTranslation.Instance.TryCreate<{obj.Name}>(node, out var ret, errorMask, translationMask))");
         using (sb.CurlyBrace())
         {
             sb.AppendLine($"throw new ArgumentException($\"Unknown {obj.Name} subclass: {{node.Name.LocalName}}\");");
         }
     }
     else
     {
         sb.AppendLine($"var ret = new {obj.Name}{obj.GetGenericTypes(MaskType.Normal)}();");
     }
 }
Exemple #26
0
    public void AppendWithEmbeddedNewLine()
    {
        var sb = new StructuredStringBuilder();

        sb.AppendLine($"A{Environment.NewLine}B");
        Assert.Equal(new string[] { "A", "B" }, sb);
    }
Exemple #27
0
    public void AppendEmpty()
    {
        var sb = new StructuredStringBuilder();

        sb.AppendLine(String.Empty);
        Assert.Equal(new string[] { "" }, sb);
    }
Exemple #28
0
    public void AppendNull()
    {
        var sb = new StructuredStringBuilder();

        sb.AppendLine(null);
        Assert.Equal(new string[] { "" }, sb);
    }
Exemple #29
0
 public override void GenerateForHash(StructuredStringBuilder sb, Accessor accessor, string hashResultAccessor)
 {
     if (!IntegrateField)
     {
         return;
     }
     if (Nullable)
     {
         sb.AppendLine($"if ({accessor} is {{}} {Name}Item)");
         accessor = $"{Name}Item";
     }
     using (sb.CurlyBrace(doIt: Nullable))
     {
         sb.AppendLine($"{hashResultAccessor}.Add({accessor});");
     }
 }
Exemple #30
0
 public override void GenerateCopySetToConverter(StructuredStringBuilder sb)
 {
     using (sb.IncreaseDepth())
     {
         sb.AppendLine(".Select(b => new MemorySlice<byte>(b.ToArray()))");
     }
 }