diff --git a/comtypes/tools/codegenerator/codegenerator.py b/comtypes/tools/codegenerator/codegenerator.py index 53111d49..a3a0c899 100644 --- a/comtypes/tools/codegenerator/codegenerator.py +++ b/comtypes/tools/codegenerator/codegenerator.py @@ -7,7 +7,7 @@ import os import textwrap import warnings -from collections.abc import Iterator, Sequence +from collections.abc import Iterable, Iterator, Mapping, Sequence from typing import Any, Literal, Optional from typing import Union as _UnionT @@ -50,8 +50,8 @@ def __init__(self, known_symbols=None, known_interfaces=None) -> None: self.enums = namespaces.EnumerationNamespaces() self.unnamed_enum_members: list[tuple[str, int]] = [] self._to_type_name = TypeNamer() - self.known_symbols = known_symbols or {} - self.known_interfaces = known_interfaces or {} + self.known_symbols: Mapping[str, str] = known_symbols or {} + self.known_interfaces: Mapping[str, str] = known_interfaces or {} self.done = set() # type descriptions that have been generated self.names = set() # names that have been generated @@ -81,7 +81,7 @@ def adjust_blank( yield self.stream self.last_item = item - def generate(self, item): + def generate(self, item: Any) -> None: if item in self.done: return if self._is_interface_typedesc(item): @@ -104,7 +104,7 @@ def generate(self, item): self.done.add(item) mth(item) - def generate_all(self, items): + def generate_all(self, items: Iterable[tlbparser.ParsedType]) -> None: for item in items: self.generate(item) @@ -160,7 +160,7 @@ def _generate_typelib_path(self, filename): self.names.add("typelib_path") def generate_wrapper_code( - self, tdescs: Sequence[Any], filename: Optional[str] + self, tdescs: Sequence[tlbparser.ParsedType], filename: Optional[str] ) -> str: """Returns the code for the COM type library wrapper module. diff --git a/comtypes/tools/tlbparser.py b/comtypes/tools/tlbparser.py index 49d173ed..c4d9ce51 100644 --- a/comtypes/tools/tlbparser.py +++ b/comtypes/tools/tlbparser.py @@ -1,9 +1,11 @@ import os import sys from _ctypes import COMError +from collections.abc import Mapping from ctypes import alignment, c_void_p, sizeof, windll from ctypes.wintypes import MAX_PATH from typing import Any, Optional +from typing import Union as _UnionT from comtypes import automation, typeinfo from comtypes.tools import typedesc @@ -107,14 +109,35 @@ def midlSAFEARRAY(typ): # automation.VT_ARRAY = 8192 # automation.VT_BYREF = 16384 +ParsedType = _UnionT[ + typedesc.TypeLib, + typedesc.Constant, + typedesc.External, + typedesc.CoClass, + typedesc.ComInterface, + typedesc.DispInterface, + typedesc.Typedef, + typedesc.Structure, + typedesc.Union, + typedesc.Enumeration, +] + +SpecType = _UnionT[ + typedesc.FundamentalType, + typedesc.PointerType, + typedesc.ArrayType, + typedesc.SAFEARRAYType, +] ################################################################ class Parser: tlib: typeinfo.ITypeLib - items: dict[str, Any] + items: dict[str, ParsedType] - def make_type(self, tdesc: typeinfo.TYPEDESC, tinfo: typeinfo.ITypeInfo) -> Any: + def make_type( + self, tdesc: typeinfo.TYPEDESC, tinfo: typeinfo.ITypeInfo + ) -> _UnionT[ParsedType, SpecType]: if tdesc.vt in COMTYPES: return COMTYPES[tdesc.vt] if tdesc.vt == automation.VT_CARRAY: @@ -587,7 +610,10 @@ def _typelib_module(self, tlib: Optional[typeinfo.ITypeLib] = None) -> str: return str(tlib.GetLibAttr()) def _register( - self, name: Optional[str], value: Any, tlib: Optional[typeinfo.ITypeLib] = None + self, + name: Optional[str], + value: ParsedType, + tlib: Optional[typeinfo.ITypeLib] = None, ) -> None: modname = self._typelib_module(tlib) fullname = f"{modname}.{name}" @@ -599,7 +625,7 @@ def _register( raise ValueError(f"Bug: Multiple registered name '{name}': {value!r}") self.items[fullname] = value - def parse_typeinfo(self, tinfo: typeinfo.ITypeInfo) -> Any: + def parse_typeinfo(self, tinfo: typeinfo.ITypeInfo) -> Optional[ParsedType]: name = tinfo.GetDocumentation(-1)[0] modname = self._typelib_module() try: @@ -670,7 +696,7 @@ def parse_LibraryDescription(self): ################################################################ - def parse(self): + def parse(self) -> Mapping[str, ParsedType]: self.parse_LibraryDescription() for i in range(self.tlib.GetTypeInfoCount()): diff --git a/comtypes/tools/typedesc.py b/comtypes/tools/typedesc.py index 755b6e02..302ff80a 100644 --- a/comtypes/tools/typedesc.py +++ b/comtypes/tools/typedesc.py @@ -7,7 +7,28 @@ from typing import Union as _UnionT from comtypes import typeinfo -from comtypes.tools.typedesc_base import * +from comtypes.tools.typedesc_base import Alias as Alias +from comtypes.tools.typedesc_base import Argument as Argument +from comtypes.tools.typedesc_base import ArrayType as ArrayType +from comtypes.tools.typedesc_base import Constructor as Constructor +from comtypes.tools.typedesc_base import CvQualifiedType as CvQualifiedType +from comtypes.tools.typedesc_base import Enumeration as Enumeration +from comtypes.tools.typedesc_base import EnumValue as EnumValue +from comtypes.tools.typedesc_base import Field as Field +from comtypes.tools.typedesc_base import File as File +from comtypes.tools.typedesc_base import Function as Function +from comtypes.tools.typedesc_base import FunctionType as FunctionType +from comtypes.tools.typedesc_base import FundamentalType as FundamentalType +from comtypes.tools.typedesc_base import Macro as Macro +from comtypes.tools.typedesc_base import Method as Method +from comtypes.tools.typedesc_base import OperatorFunction as OperatorFunction +from comtypes.tools.typedesc_base import PointerType as PointerType +from comtypes.tools.typedesc_base import Structure as Structure +from comtypes.tools.typedesc_base import StructureBody as StructureBody +from comtypes.tools.typedesc_base import StructureHead as StructureHead +from comtypes.tools.typedesc_base import Typedef as Typedef +from comtypes.tools.typedesc_base import Union as Union +from comtypes.tools.typedesc_base import Variable as Variable from comtypes.typeinfo import TLIBATTR, ITypeLib diff --git a/comtypes/tools/typedesc_base.py b/comtypes/tools/typedesc_base.py index 5b311077..fb9ba942 100644 --- a/comtypes/tools/typedesc_base.py +++ b/comtypes/tools/typedesc_base.py @@ -2,8 +2,6 @@ from typing import Any, Optional, SupportsInt from typing import Union as _UnionT -import comtypes - class Argument: "a Parameter in the argument list of a callable (Function, Method, ...)" @@ -110,11 +108,10 @@ def __init__(self, name, returns): class FundamentalType: location = None - def __init__(self, name, size, align): + def __init__(self, name: str, size: int, align: int) -> None: self.name = name - if name != "void": - self.size = int(size) - self.align = int(align) + self.size = int(size) + self.align = int(align) class PointerType: diff --git a/pyproject.toml b/pyproject.toml index dcec9bf7..e806166c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,8 +74,6 @@ ignore = ["E402"] "comtypes/server/inprocserver.py" = ["E722"] "comtypes/server/register.py" = ["E713"] "comtypes/tools/codegenerator/packing.py" = ["F821", "F841"] -"comtypes/tools/typedesc.py" = ["F403", "F405"] -"comtypes/tools/typedesc_base.py" = ["F401"] # gen directory "comtypes/gen/*" = ["E", "F", "I"] # stub