public StructDeclarationSyntax CreateStruct(CXCursor clangRecord) { if (clangRecord.IsAnonymous) { // TODO: Anon structs/unions throw new NotImplementedException(); } var cSharpName = ClangDisplayName(clangRecord); var clangLayout = _layoutCalculator.CalculateLayout(clangRecord); var clangType = clangRecord.Type; var clangBaseType = GetClangBaseType(clangType); var cSharpType = GetTypeSyntax(clangType, clangBaseType); var cSharpStruct = StructDeclaration(cSharpName) .WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword))) .WithAttributeStructLayout(LayoutKind.Explicit, clangLayout.Size, clangLayout.Alignment); var clangRecordFieldMembers = clangRecord.ChildrenOfKind(CXCursorKind.CXCursor_FieldDecl); var members = new List <MemberDeclarationSyntax>(clangRecordFieldMembers.Length); for (var i = 0; i < clangRecordFieldMembers.Length; i++) { var fieldC = clangRecordFieldMembers[i]; CreateStructHelperAddField(cSharpType, fieldC, members); } cSharpStruct = cSharpStruct.AddMembers(members.ToArray()); return(cSharpStruct); }
public EnumDeclarationSyntax CreateEnum(CXCursor clangEnum) { var cSharpEnumName = ClangDisplayName(clangEnum); var cSharpEnumType = GetEnumSyntaxKind(clangEnum); var cSharpEnum = EnumDeclaration(cSharpEnumName) .AddModifiers(Token(SyntaxKind.PublicKeyword)) .AddBaseListTypes(SimpleBaseType(ParseTypeName(cSharpEnumType))); var clangEnumMembers = clangEnum.ChildrenOfKind(CXCursorKind.CXCursor_EnumConstantDecl); var cSharpEnumMembers = new EnumMemberDeclarationSyntax[clangEnumMembers.Length]; for (var i = 0; i < clangEnumMembers.Length; i++) { var clangEnumConstant = clangEnumMembers[i]; var clangEnumMemberName = ClangDisplayName(clangEnumConstant).Replace($"{cSharpEnumName}_", string.Empty); var clangEnumValue = clangEnumConstant.EnumConstantDeclValue; var cSharpEqualsValueClause = CreateEqualsValueClause(clangEnumValue, cSharpEnumType); cSharpEnumMembers[i] = EnumMemberDeclaration(clangEnumMemberName) .WithEqualsValue(cSharpEqualsValueClause); } return(cSharpEnum.AddMembers(cSharpEnumMembers)); }