Skip to content

Commit 6066871

Browse files
committed
feat: add StubOverloadExtension to fix stub file overload issues
1 parent 438a1e6 commit 6066871

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

scripts/griffe2mdx/extension.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import ast
2+
3+
from griffe import Class, Extension, Function, Inspector, Kind, ObjectNode, Visitor, typing_overload
4+
from typing import Any
5+
6+
7+
class StubOverloadExtension(Extension):
8+
def on_function_instance(
9+
self,
10+
*,
11+
node: ast.AST | ObjectNode,
12+
func: Function,
13+
agent: Visitor | Inspector,
14+
**kwargs: Any,
15+
) -> None:
16+
"""
17+
Fix overloads with implementations in stub files not detected
18+
by adding a dummy function to class members
19+
20+
For original issue, please see: https://github.com/mkdocstrings/griffe/issues/116
21+
"""
22+
23+
if isinstance(node, ObjectNode):
24+
return
25+
26+
if func.parent.kind != Kind.CLASS:
27+
return
28+
29+
overload = False
30+
for decorator in func.decorators:
31+
overload |= decorator.callable_path in typing_overload
32+
33+
if not overload:
34+
return
35+
36+
parent_class: Class = func.parent
37+
try:
38+
function = parent_class.members[func.name]
39+
except KeyError:
40+
function = Function(name=func.name)
41+
parent_class.set_member(func.name, function)
42+
43+
if function.overloads is None:
44+
function.overloads = []
45+
46+
function.overloads.append(func)

scripts/griffe2mdx/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from griffe2md import rendering
1212
from griffe2md.main import prepare_context, prepare_env
1313
from jinja2 import Environment, FileSystemLoader
14+
from extension import StubOverloadExtension
1415

1516
sys.path.append(r"D:\Projects\CPP\endstone")
1617

@@ -29,7 +30,7 @@ def render_object_docs(obj: Object, config: dict | None = None) -> str:
2930
def render_package_docs(package: str, config: dict | None = None) -> str:
3031
config = config or dict(rendering.default_config)
3132
parser = config["docstring_style"] and Parser(config["docstring_style"])
32-
extensions = griffe.load_extensions("griffe_endstone")
33+
extensions = griffe.load_extensions(StubOverloadExtension)
3334
loader = GriffeLoader(docstring_parser=parser, extensions=extensions)
3435
module = loader.load(package, find_stubs_package=True)
3536
loader.resolve_aliases(external=True)

0 commit comments

Comments
 (0)