Пример #1
0
        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);
        }
Пример #2
0
        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));
        }