Example #1
0
        private void WriteAttrParseMethod(IndentedTextWriter writer, ClassGenInfo classGenInfo)
        {
            writer.WriteLine("public override bool ParseAttribute(ref XmlReadBuffer buffer, ulong hash, SpanStr value)");
            writer.WriteLine("{");
            writer.Indent++;
            writer.WriteLine("if (base.ParseAttribute(ref buffer, hash, value)) return true;");

            writer.WriteLine("switch (hash)");
            writer.WriteLine("{");
            writer.Indent++;

            foreach (var field in classGenInfo.m_fields.OrderBy(x => x.m_xmlName.Length))
            {
                writer.WriteLine($"case {HashName(field.m_xmlName)}: {{");
                writer.Indent++;

                if (field.m_splitChar != null)
                {
                    var typeToRead = ((INamedTypeSymbol)field.m_field.Type).TypeArguments[0].Name;

                    writer.WriteLine($"var lst = new System.Collections.Generic.List<{typeToRead}>();");
                    writer.WriteLine($"var reader = new StrReader(value, '{field.m_splitChar}');");
                    var readerMethod = StrGenerator.GetReaderForType(typeToRead);

                    writer.WriteLine("while (reader.HasRemaining())");
                    writer.WriteLine("{");
                    writer.Indent++;
                    writer.WriteLine($"lst.Add({readerMethod});");
                    writer.Indent--;
                    writer.WriteLine("}");

                    writer.WriteLine($"{field.m_field.Name} = lst;");
                }
                else
                {
                    var readCommand = GetParseAttributeAction(field);
                    writer.WriteLine($"this.{field.m_field.Name} = {readCommand};");
                }

                writer.WriteLine("return true;");
                writer.Indent--;
                writer.WriteLine("}");
            }

            writer.Indent--;
            writer.WriteLine("}");

            writer.WriteLine("return false;");
            writer.Indent--;
            writer.WriteLine("}");
        }
Example #2
0
        private void WriteAttSerializeMethod(IndentedTextWriter writer, ClassGenInfo classGenInfo)
        {
            writer.WriteLine("public override void SerializeAttributes(ref XmlWriteBuffer buffer)");
            writer.WriteLine("{");
            writer.Indent++;
            writer.WriteLine("base.SerializeAttributes(ref buffer);");
            foreach (var field in classGenInfo.m_fields)
            {
                if (field.m_splitChar != null)
                {
                    var typeToRead = ((INamedTypeSymbol)field.m_field.Type).TypeArguments[0].Name;

                    writer.WriteLine("{");
                    writer.Indent++;

                    writer.WriteLine($"using var writer = new StrWriter('{field.m_splitChar}');");
                    writer.WriteLine($"foreach (var val in {field.m_field.Name})");
                    writer.WriteLine("{");
                    writer.Indent++;
                    writer.WriteLine($"{StrGenerator.GetWriterForType(typeToRead, "val")};");
                    writer.Indent--;
                    writer.WriteLine("}");
                    writer.WriteLine($"buffer.PutAttribute(\"{field.m_xmlName}\", writer.m_builtSpan);");
                    writer.WriteLine("writer.Dispose();");

                    writer.Indent--;
                    writer.WriteLine("}");
                }
                else
                {
                    var writerAction = GetPutAttributeAction(field);
                    writer.WriteLine(writerAction);
                }
            }

            writer.Indent--;
            writer.WriteLine("}");
        }