Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
 private ClassBuilder(EmitContext context, CSharp.Class moduleClass)
 {
     _context     = context;
     _moduleClass = moduleClass;
 }