public CSharp.Class AddStruct(AstTypeDefinitionStruct structDef) { var recordType = new CSharp.Class(structDef.Identifier.SymbolName.CanonicalName.FullName, ClassKeyword.Record) { AccessModifiers = structDef.Symbol.SymbolLocality == AstSymbolLocality.Exported ? AccessModifiers.Public : AccessModifiers.Private, ClassModifiers = ClassModifiers.None, }; if (structDef.HasBaseType) { recordType.BaseTypeName = structDef.BaseType.ToCode(); } foreach (var field in structDef.Fields) { var property = new CSharp.Property(field.Identifier.SymbolName.CanonicalName.FullName, field.TypeReference.ToCode()) { AccessModifiers = AccessModifiers.Public, }; recordType.AddProperty(property); } _moduleClass.AddClass(recordType); return(recordType); }
private static void ToCode(this CSharp.Class @class, CsBuilder builder) { builder.StartClass(@class.AccessModifiers, @class.ClassModifiers, @class.Keyword, @class.Name); foreach (var field in @class.Fields) { builder.StartField(field.AccessModifiers, field.FieldModifiers, field.TypeName, field.Name); var initExpr = field.InitExpression; if (!String.IsNullOrEmpty(initExpr)) { builder.Append(initExpr); } } foreach (var property in @class.Properties) { builder.Property(property.AccessModifiers, property.TypeName, property.Name); } foreach (var method in @class.Methods) { var parameters = method.Parameters .Select(p => (name: p.Name, type: p.TypeName)) .ToArray(); builder.WriteIndent(); builder.StartMethod(method.AccessModifiers, method.MethodModifiers, method.TypeName, method.Name, parameters); builder.WriteIndent(); builder.AppendLine(method.GetBody(0).ToString()); builder.EndScope(); } foreach (var @enum in @class.Enums) { builder.StartEnum(@enum.AccessModifiers, @enum.Name, @enum.BaseTypeName); foreach (var option in @enum.Options) { builder.WriteIndent(); builder.Append($"{option.Name}"); if (!String.IsNullOrEmpty(option.Value)) { builder.Append($" = {option.Value}"); } builder.AppendLine(","); } builder.EndScope(); } foreach (var nested in @class.Classes) { nested.ToCode(builder); } builder.EndScope(); }
public static ClassBuilder Create(EmitContext context, AstModuleImpl module) { var moduleClass = new CSharp.Class(module.Identifier.SymbolName.CanonicalName.FullName, ClassKeyword.Class) { AccessModifiers = module.HasExports ? AccessModifiers.Public : AccessModifiers.Internal, ClassModifiers = ClassModifiers.Static, }; context.Namespace.AddClass(moduleClass); return(new ClassBuilder(context, moduleClass)); }
private ClassBuilder(EmitContext context, CSharp.Class moduleClass) { _context = context; _moduleClass = moduleClass; }