Antlr4.StringTemplate.TemplateGroup.WriteGroupObject C# (CSharp) Method

WriteGroupObject() private method

private WriteGroupObject ( System.IO.BinaryWriter writer, object obj ) : void
writer System.IO.BinaryWriter
obj object
return void
        private void WriteGroupObject(BinaryWriter writer, object obj)
        {
            var comparer = ObjectReferenceEqualityComparer<object>.Default;
            writer.Write(comparer.GetHashCode(obj));

            string str = obj as string;
            if (str != null)
            {
                writer.Write(0);
                writer.Write(str);
                return;
            }

            Type type = obj as Type;
            if (type != null)
            {
                writer.Write(0);
                writer.Write(type.FullName);
                return;
            }

            WriteGroupObjectReference(writer, obj.GetType());

            if (obj is bool)
            {
                writer.Write((bool)obj);
                return;
            }

            IToken token = obj as IToken;
            if (token != null)
            {
                writer.Write(token.Channel);
                writer.Write(token.CharPositionInLine);
                writer.Write(token.Line);
                writer.Write(token.StartIndex);
                writer.Write(token.StopIndex);
                writer.Write(token.Text);
                writer.Write(token.TokenIndex);
                writer.Write(token.Type);
                return;
            }

            if (obj.GetType() == typeof(CompiledTemplate))
            {
                CompiledTemplate compiledTemplate = (CompiledTemplate)obj;
                writer.Write(compiledTemplate.Name);
                writer.Write(compiledTemplate.Prefix);
                writer.Write(compiledTemplate.Template);
                WriteGroupObjectReference(writer, compiledTemplate.TemplateDefStartToken);
                writer.Write(compiledTemplate.HasFormalArgs);
                WriteGroupObjectReference(writer, compiledTemplate.NativeGroup);
                writer.Write(compiledTemplate.IsRegion);
                writer.Write((int)compiledTemplate.RegionDefType);
                writer.Write(compiledTemplate.IsAnonSubtemplate);

                if (compiledTemplate.FormalArguments == null)
                {
                    writer.Write(-1);
                }
                else
                {
                    writer.Write(compiledTemplate.FormalArguments.Count);
                    foreach (var arg in compiledTemplate.FormalArguments)
                        WriteGroupObjectReference(writer, arg);
                }

                if (compiledTemplate.strings == null)
                {
                    writer.Write(-1);
                }
                else
                {
                    writer.Write(compiledTemplate.strings.Length);
                    foreach (var s in compiledTemplate.strings)
                        writer.Write(s);
                }

                if (compiledTemplate.instrs == null)
                {
                    writer.Write(-1);
                }
                else
                {
                    writer.Write(compiledTemplate.instrs.Length);
                    writer.Write(compiledTemplate.instrs);
                }

                writer.Write(compiledTemplate.codeSize);

                if (compiledTemplate.sourceMap == null)
                {
                    writer.Write(-1);
                }
                else
                {
                    writer.Write(compiledTemplate.sourceMap.Length);
                    foreach (var interval in compiledTemplate.sourceMap)
                    {
                        if (interval == null)
                        {
                            writer.Write(-1);
                            writer.Write(-1);
                        }
                        else
                        {
                            writer.Write(interval.Start);
                            writer.Write(interval.Length);
                        }
                    }
                }
            }
            else if (obj.GetType() == typeof(FormalArgument))
            {
                FormalArgument formalArgument = (FormalArgument)obj;
                writer.Write(formalArgument.Name);
                writer.Write(formalArgument.Index);
                WriteGroupObjectReference(writer, formalArgument.DefaultValueToken);
                WriteGroupObjectReference(writer, formalArgument.DefaultValue);
                WriteGroupObjectReference(writer, formalArgument.CompiledDefaultValue);
            }
            else if (obj.GetType() == typeof(Template))
            {
                Template template = (Template)obj;
                WriteGroupObjectReference(writer, template.impl);

                if (template.locals == null)
                {
                    writer.Write(-1);
                }
                else
                {
                    writer.Write(template.locals.Length);
                    foreach (var local in template.locals)
                    {
                        WriteGroupObjectReference(writer, local);
                    }
                }

                WriteGroupObjectReference(writer, template.Group);
            }
            else if (obj.GetType() == typeof(TemplateGroupFile) || obj == TemplateGroup.DefaultGroup)
            {
                writer.Write(obj == TemplateGroup.DefaultGroup);
            }
            else
            {
                throw new NotImplementedException();
            }
        }