SharpGen/Generator/StructCodeGenerator.cs (59 lines of code) (raw):

using System.Collections.Generic; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using SharpGen.Model; using SharpGen.Transform; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; namespace SharpGen.Generator { internal sealed class StructCodeGenerator : MemberCodeGeneratorBase<CsStruct> { public override IEnumerable<MemberDeclarationSyntax> GenerateCode(CsStruct csElement) { var innerStructs = csElement.InnerStructs.SelectMany(GenerateCode); var constants = csElement.Variables.SelectMany(var => Generators.Constant.GenerateCode(var)); var fields = csElement.PublicFields.SelectMany(field => { var explicitLayout = !csElement.HasMarshalType && csElement.ExplicitLayout; var generator = explicitLayout ? Generators.ExplicitOffsetField : Generators.AutoLayoutField; return generator.GenerateCode(field); }); var marshallingStructAndConversions = csElement.HasMarshalType && !csElement.HasCustomMarshal ? Generators.NativeStruct.GenerateCode(csElement) : Enumerable.Empty<MemberDeclarationSyntax>(); var attributeList = !csElement.HasMarshalType ? SingletonList(NativeStructCodeGenerator.GenerateStructLayoutAttribute(csElement)) : default; var modifierTokenList = csElement.VisibilityTokenList.Add(Token(SyntaxKind.PartialKeyword)); var identifier = Identifier(csElement.Name); var memberList = List( innerStructs.Concat(constants).Concat(fields).Concat(marshallingStructAndConversions) ); MemberDeclarationSyntax declaration = csElement.GenerateAsClass ? ClassDeclaration( attributeList, modifierTokenList, identifier, default, default, default, memberList ) : StructDeclaration( attributeList, modifierTokenList, identifier, default, default, default, memberList ); yield return AddDocumentationTrivia(declaration, csElement); } public StructCodeGenerator(Ioc ioc) : base(ioc) { } } }