(
self, tinfo: typeinfo.ITypeInfo, ta: typeinfo.TYPEATTR
)
| 259 | |
| 260 | # TKIND_INTERFACE = 3 |
| 261 | def ParseInterface( |
| 262 | self, tinfo: typeinfo.ITypeInfo, ta: typeinfo.TYPEATTR |
| 263 | ) -> Optional[typedesc.ComInterface]: |
| 264 | itf_name, itf_doc = tinfo.GetDocumentation(-1)[0:2] |
| 265 | assert ta.cImplTypes <= 1 |
| 266 | if ta.cImplTypes == 0 and itf_name != "IUnknown": |
| 267 | # Windows defines an interface IOleControlTypes in ocidl.idl. |
| 268 | # Don't known what artefact that is - we ignore it. |
| 269 | # It's an interface without methods anyway. |
| 270 | if itf_name != "IOleControlTypes": |
| 271 | message = f"Ignoring interface {itf_name} which has no base interface" |
| 272 | import warnings |
| 273 | |
| 274 | warnings.warn(message, UserWarning) |
| 275 | return None |
| 276 | |
| 277 | iid = str(ta.guid) |
| 278 | idlflags = self.interface_type_flags(ta.wTypeFlags) |
| 279 | itf = typedesc.ComInterface(itf_name, None, iid, idlflags, itf_doc) |
| 280 | self._register(itf_name, itf) |
| 281 | |
| 282 | if ta.cImplTypes: |
| 283 | hr = tinfo.GetRefTypeOfImplType(0) |
| 284 | tibase = tinfo.GetRefTypeInfo(hr) |
| 285 | itf.base = self.parse_typeinfo(tibase) |
| 286 | |
| 287 | assert ta.cVars == 0, "vars on an Interface?" |
| 288 | |
| 289 | members: list[tuple[int, typedesc.ComMethod]] = [] |
| 290 | for i in range(ta.cFuncs): |
| 291 | fd = tinfo.GetFuncDesc(i) |
| 292 | func_name, func_doc = tinfo.GetDocumentation(fd.memid)[:2] |
| 293 | assert fd.funckind == typeinfo.FUNC_PUREVIRTUAL |
| 294 | returns = self.make_type(fd.elemdescFunc.tdesc, tinfo) |
| 295 | names = tinfo.GetNames(fd.memid, fd.cParams + 1) |
| 296 | names.append("rhs") |
| 297 | names = names[: fd.cParams + 1] |
| 298 | # function name first, then parameter names |
| 299 | assert len(names) == fd.cParams + 1 |
| 300 | flags = self.func_flags(fd.wFuncFlags) |
| 301 | flags += self.inv_kind(fd.invkind) |
| 302 | mth = typedesc.ComMethod( |
| 303 | fd.invkind, fd.memid, func_name, returns, flags, func_doc |
| 304 | ) |
| 305 | for j in range(fd.cParams): |
| 306 | elemdesc = fd.lprgelemdescParam[j] |
| 307 | typ = self.make_type(elemdesc.tdesc, tinfo) |
| 308 | name = names[j + 1] |
| 309 | paramdesc = elemdesc._.paramdesc |
| 310 | if paramdesc.wParamFlags & typeinfo.PARAMFLAG_FHASDEFAULT: |
| 311 | # XXX should be handled by VARIANT itself |
| 312 | default: Any = paramdesc.pparamdescex[0].varDefaultValue.value |
| 313 | else: |
| 314 | default = None |
| 315 | param_flags = self.param_flags(paramdesc.wParamFlags) |
| 316 | mth.add_argument(typ, name, param_flags, default) |
| 317 | members.append((fd.oVft, mth)) |
| 318 | # Sort the methods by oVft (VTable offset): Some typeinfo |
no test coverage detected