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();
}
}