def test_void_int(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, 'void func(int a);', debug=True) func = parser.root_namespace.functions[0] self.assertEqual(TypeRef(cpptypeinfo.Void(), False), func.result) self.assertEqual(1, len(func.params)) self.assertEqual(TypeRef(cpptypeinfo.Int32()), func.params[0].typeref)
def gen(args): parser = cpptypeinfo.TypeParser() includes = [pathlib.Path(x) for x in args.include] headers = [pathlib.Path(x) for x in args.header] if args.d3d11: dir = get_windowskits() headers.append(dir / 'shared/ntdef.h') headers.append(dir / 'shared/basetsd.h') headers.append(dir / 'shared/wtypes.h') # headers.append(dir / 'um/winnt.h') headers.append(dir / 'um/d3d11.h') headers.append(dir / 'um/d3dtypes.h') headers.append(dir / 'um/d3dcommon.h') headers.append(dir / 'um/d3d10.h') headers.append(dir / 'shared/dxgi.h') headers.append(dir / 'um/dcommon.h') # headers.append(dir / 'um/d2dbasetypes.h') headers.append(dir / 'um/dxgicommon.h') headers.append(dir / 'um/dxgiformat.h') headers.append(dir / 'shared/dxgitype.h') decl_map = cpptypeinfo.parse_files(parser, includes=includes, *headers) if args.lang == 'dlang': cpptypeinfo.languages.dlang.generate(parser, decl_map, headers, pathlib.Path(args.dst).absolute(), ['windowskits', 'd3d11']) elif args.clang == 'csharp': cpptypeinfo.languages.csharp.generate( parser, decl_map, pathlib.Path(args.dst).absolute()) else: raise NotImplementedError()
def test_function(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, 'typedef void (*T)();', debug=True) typedef = parser.root_namespace.user_type_map['T'] if not isinstance(typedef, cpptypeinfo.usertype.Typedef): raise Exception() self.assertEqual(typedef.typeref.ref, cpptypeinfo.UInt64())
def test_namespace(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' namespace A { namespace B { struct C { } } } ''', debug=True) self.assertEqual(1, len(parser.root_namespace._children)) a = parser.root_namespace._children[0] self.assertEqual('A', a.name) self.assertEqual(1, len(a._children)) b = a._children[0] self.assertEqual(1, len(b._children)) self.assertEqual('B', b.name) c = b._children[0] self.assertEqual(0, len(c._children)) self.assertEqual('C', c.name)
def test_int8_ptr(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, 'typedef char* T;', debug=True) typedef = parser.root_namespace.user_type_map['T'] if not isinstance(typedef, cpptypeinfo.usertype.Typedef): raise Exception() self.assertEqual(typedef.typeref.ref, cpptypeinfo.usertype.Pointer(cpptypeinfo.Int8()))
def test_callback(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' typedef struct _NCB { void (*ncb_post)( struct _NCB * ); /* POST routine address */ } NCB, *PNCB; ''', debug=True)
def test_linklist(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY; ''', debug=True)
def test_struct_forward_pointer(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' typedef struct Forward *T; ''', debug=True) typedef = parser.root_namespace.user_type_map['T'] if not isinstance(typedef, cpptypeinfo.usertype.Typedef): raise Exception()
def test_elaborated(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' typedef struct __crt_locale_pointers { struct __crt_locale_data* locinfo; struct __crt_multibyte_data* mbcinfo; } __crt_locale_pointers ''', debug=True)
def test_resolve_function(self) -> None: parser = cpptypeinfo.TypeParser() parser.typedef('uint8_t', 'unsigned char') func = parser.parse('uint8_t* (uint8_t, const uint8_t *)').ref if not isinstance(func, cpptypeinfo.usertype.Function): raise Exception() parser.resolve_typedef_by_name('uint8_t') self.assertEqual(func.result, cpptypeinfo.usertype.Pointer(cpptypeinfo.UInt8())) self.assertEqual(func.params[0].typeref, cpptypeinfo.UInt8()) self.assertEqual( func.params[1].typeref, cpptypeinfo.usertype.Pointer(cpptypeinfo.UInt8().to_const()))
def test_anonymous_union(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' typedef struct D3D11_VIDEO_COLOR { union { int YCbCr; float RGBA; } ; } D3D11_VIDEO_COLOR; ''', debug=True)
def test_struct(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' typedef struct Tag { } T; typedef T* TP; ''', debug=True) typedef = parser.root_namespace.user_type_map['T'] if not isinstance(typedef, cpptypeinfo.usertype.Typedef): raise Exception() self.assertEqual(typedef.typeref.ref, cpptypeinfo.usertype.Struct('Tag'))
def test_excpt(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, ''' int __cdecl __C_specific_handler( struct _EXCEPTION_RECORD* ExceptionRecord, void* EstablisherFrame, struct _CONTEXT* ContextRecord, struct _DISPATCHER_CONTEXT* DispatcherContext ); ''', debug=True) func = parser.root_namespace.functions[0] self.assertEqual(TypeRef(cpptypeinfo.Void(), False), func.result) self.assertEqual(1, len(func.params)) self.assertEqual(TypeRef(cpptypeinfo.Int32()), func.params[0].typeref)
def test_cimgui(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_files( parser, CIMGUI_H, cpp_flags=[f'-DCIMGUI_DEFINE_ENUMS_AND_STRUCTS']) for ns in parser.root_namespace.traverse(): if isinstance(ns, cpptypeinfo.usertype.Struct): continue for k, v in ns.user_type_map.items(): with self.subTest(name=k): print(f'{ns}{v}') for v in ns.functions: if v.name: with self.subTest(name=v.name): print(f'{ns}{v}')
import unittest import pathlib import cpptypeinfo from cpptypeinfo.usertype import (Field, Struct, Pointer, Param, Function) HERE = pathlib.Path(__file__).absolute().parent IMGUI_H = HERE.parent / 'libs/imgui/imgui.h' parser = cpptypeinfo.TypeParser() EXPECTS = { 'ImDrawChannel': parser.parse('struct ImDrawChannel'), 'ImDrawCmd': parser.parse('struct ImDrawCmd'), 'ImDrawData': parser.parse('struct ImDrawData'), 'ImDrawList': parser.parse('struct ImDrawList'), 'ImDrawListSharedData': parser.parse('struct ImDrawListSharedData'), 'ImDrawListSplitter': parser.parse('struct ImDrawListSplitter'), 'ImDrawVert': parser.parse('struct ImDrawVert'), 'ImFont': parser.parse('struct ImFont'), 'ImFontAtlas': parser.parse('struct ImFontAtlas'), 'ImFontConfig': parser.parse('struct ImFontConfig'), 'ImFontGlyph':
def test_function(self) -> None: parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_source(parser, SOURCE, debug=True)
def debug(args): parser = cpptypeinfo.TypeParser() cpptypeinfo.parse_files(parser, pathlib.Path(args.header), debug=True)
def test_resolve_function(self) -> None: parser = cpptypeinfo.TypeParser() typedef = parser.typedef('uint8_t', 'unsigned char') self.assertEqual(typedef.get_concrete_type(), cpptypeinfo.UInt8())