Exemplo n.º 1
0
    private static void GenerateCloneMethod(
        CodeWriter codeWriter,
        CompilerOptions options,
        ITypeModel typeModel,
        Dictionary <Type, string> methodNameMap)
    {
        string typeName            = typeModel.GetGlobalCompilableTypeName();
        CodeGeneratedMethod method = typeModel.CreateCloneMethodBody(new CloneCodeGenContext("item", methodNameMap));

        if (!typeModel.ClrType.IsValueType)
        {
            typeName += "?";

            if (options.NullableWarnings == true)
            {
                codeWriter.AppendLine("[return: System.Diagnostics.CodeAnalysis.NotNullIfNotNull(\"item\")]");
            }
        }

        codeWriter.AppendLine(method.GetMethodImplAttribute());
        codeWriter.AppendLine($"public static {typeName} Clone({typeName} item)");
        using (codeWriter.WithBlock())
        {
            codeWriter.AppendLine(method.MethodBody);
        }
    }
    internal static string CreateParseBody(
        ITypeModel itemTypeModel,
        string createFlatBufferVector,
        ParserCodeGenContext context)
    {
        FlatSharpInternal.Assert(!string.IsNullOrEmpty(context.TableFieldContextVariableName), "expecting table field context");

        if (context.Options.GreedyDeserialize)
        {
            string body = $"({createFlatBufferVector}).FlatBufferVectorToList()";
            if (!context.Options.GenerateMutableObjects)
            {
                body += ".AsReadOnly()";
            }

            return($"return {body};");
        }
        else if (context.Options.Lazy)
        {
            return($"return {createFlatBufferVector};");
        }
        else
        {
            FlatSharpInternal.Assert(context.Options.Progressive, "expecting progressive");
            return($"return new FlatBufferProgressiveVector<{itemTypeModel.GetGlobalCompilableTypeName()}, {context.InputBufferTypeName}>({createFlatBufferVector});");
        }
    }
    public static (string classDef, string className) CreateFlatBufferVectorOfUnionSubclass(
        ITypeModel typeModel,
        ParserCodeGenContext context)
    {
        string className = $"FlatBufferUnionVector_{Guid.NewGuid():n}";

        context = context with
        {
            InputBufferTypeName           = "TInputBuffer",
            InputBufferVariableName       = "memory",
            IsOffsetByRef                 = true,
            TableFieldContextVariableName = "fieldContext",
            OffsetVariableName            = "temp",
        };

        string classDef = $@"
                public sealed class {className}<{context.InputBufferTypeName}> : FlatBufferVectorOfUnion<{typeModel.GetGlobalCompilableTypeName()}, {context.InputBufferTypeName}>
                    where {context.InputBufferTypeName} : {nameof(IInputBuffer)}
                {{
                    public {className}(
                        {context.InputBufferTypeName} memory,
                        int discriminatorOffset,
                        int offsetVectorOffset,
                        {nameof(TableFieldContext)} fieldContext) : base(memory, discriminatorOffset, offsetVectorOffset, fieldContext)
                    {{
                    }}

                    protected override void ParseItem(
                        {context.InputBufferTypeName} memory,
                        int discriminatorOffset,
                        int offsetOffset,
                        {nameof(TableFieldContext)} {context.TableFieldContextVariableName},
                        out {typeModel.GetGlobalCompilableTypeName()} item)
                    {{
                        var {context.OffsetVariableName} = (discriminatorOffset, offsetOffset);
                        item = {context.GetParseInvocation(typeModel.ClrType)};
                    }}
                }}
            ";

        return(classDef, className);
    }