public bool VisitNode(Struct node) { // struct [specifiers] structname [extends parentstruct] { \n contents \n }; Write($"{STRUCT} "); var specs = new List <string>(); ScriptStructFlags flags = node.Flags; if (flags.Has(ScriptStructFlags.Native)) { specs.Add("native"); } if (flags.Has(ScriptStructFlags.Export)) { specs.Add("export"); } if (flags.Has(ScriptStructFlags.Transient)) { specs.Add("transient"); } if (flags.Has(ScriptStructFlags.Immutable)) { specs.Add("immutable"); } else if (flags.Has(ScriptStructFlags.Atomic)) { specs.Add("atomic"); } if (flags.Has(ScriptStructFlags.ImmutableWhenCooked)) { specs.Add("immutablewhencooked"); } if (flags.Has(ScriptStructFlags.StrictConfig)) { specs.Add("strictconfig"); } if (specs.Any()) { Append($"{string.Join(" ", specs)} "); } Append($"{node.Name} "); if (node.Parent != null) { Append($"{EXTENDS} {node.Parent.Name} "); } Write("{"); NestingLevel++; foreach (VariableType typeDeclaration in node.TypeDeclarations) { typeDeclaration.AcceptVisitor(this); } foreach (VariableDeclaration member in node.VariableDeclarations) { member.AcceptVisitor(this); } if (node.DefaultProperties.Statements.Any()) { Write(""); node.DefaultProperties.AcceptVisitor(this); } NestingLevel--; Write("};"); return(true); }