in packages/@jsii/python-runtime/src/jsii/_kernel/__init__.py [0:0]
def _get_overides(klass: Type, obj: Any) -> List[Override]:
overrides: List[Override] = []
# We need to inspect each item in the MRO, until we get to our Type, at that
# point we'll bail, because those methods are not the overriden methods, but the
# "real" methods.
jsii_name = getattr(klass, "__jsii_type__", "Object")
jsii_classes = [
next(
(
m
for m in type(obj).mro()
if getattr(m, "__jsii_declared_type__", None) == jsii_name
),
Object,
)
] + list(
itertools.chain.from_iterable(
(getattr(m, "__jsii_ifaces__", []) for m in type(obj).mro())
)
)
for mro_klass in type(obj).mro():
if getattr(mro_klass, "__jsii_declared_type__", None) is not None:
# There is a jsii declared type, so we reached a "well known" object,
# and nothing from now on is an override.
break
if mro_klass is Object or mro_klass is object:
break
for name, item in mro_klass.__dict__.items():
# Ignore all "special" members (name starting with __)...
if name.startswith("__"):
continue
# We're only interested in things that also exist on the JSII class or
# interfaces, and which are themselves, jsii members.
for jsii_class in jsii_classes:
original = getattr(jsii_class, name, _nothing)
if original is not _nothing:
if inspect.isfunction(item) and hasattr(original, "__jsii_name__"):
if any(
entry.method == cast(Any, original).__jsii_name__
for entry in overrides
):
# Don't re-register an override we already discovered through a previous type
continue
overrides.append(
Override(
method=cast(Any, original).__jsii_name__, cookie=name
)
)
break
elif inspect.isdatadescriptor(item) and hasattr(
getattr(original, "fget", None), "__jsii_name__"
):
if any(
entry.property == cast(Any, original).fget.__jsii_name__
for entry in overrides
):
# Don't re-register an override we already discovered through a previous type
continue
overrides.append(
Override(
property=cast(Any, original).fget.__jsii_name__,
cookie=name,
)
)
break
return overrides