void ICiSymbolVisitor.Visit(CiClass klass)
{
WriteLine();
Write(klass.Documentation);
Write(klass.Visibility);
OpenClass(klass.IsAbstract, klass, " : ");
CurrentClass = klass;
bool hasConstructor = klass.Constructor != null;
foreach (CiSymbol member in klass.Members) {
if (!hasConstructor) {
CiField field = member as CiField;
if (field != null && (field.Type is CiClassStorageType || field.Type is CiArrayStorageType))
hasConstructor = true;
}
member.Accept(this);
}
foreach (CiConst konst in klass.ConstArrays) {
if (konst.Visibility != CiVisibility.Public) {
Write("static immutable(");
Write(konst.Type);
Write(") ");
Write(konst.Class == CurrentClass ? konst.Name : konst.GlobalName);
Write(" = ");
WriteConst(konst.Value);
WriteLine(";");
}
}
foreach (CiBinaryResource resource in klass.BinaryResources) {
// FIXME: it's better to import(resources) from binary files,
// rather than pasting tons of magic numbers in the source.
Write("static immutable(ubyte[]) ");
WriteName(resource);
Write(" = ");
WriteConst(resource.Content);
WriteLine(";");
}
if (hasConstructor) {
WriteLine("this()");
OpenBlock();
foreach (CiSymbol member in klass.Members) {
CiField field = member as CiField;
if (field != null && (field.Type is CiClassStorageType || field.Type is CiArrayStorageType)) {
WriteVarName(field.Name);
WriteInit(field.Type);
WriteLine(";");
}
}
if (klass.Constructor != null)
Write(klass.Constructor.Body.Statements);
CloseBlock();
}
CloseBlock();
CurrentClass = null;
}