diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bb38024..83f8062 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,8 @@ name: ci on: push: + branches: + - main pull_request: branches: - main diff --git a/src/mkdocstrings_handlers/zig/_internal/zig_docs_extractor.py b/src/mkdocstrings_handlers/zig/_internal/zig_docs_extractor.py index d15f45b..0ba6d32 100644 --- a/src/mkdocstrings_handlers/zig/_internal/zig_docs_extractor.py +++ b/src/mkdocstrings_handlers/zig/_internal/zig_docs_extractor.py @@ -94,7 +94,7 @@ def _parse_function(self, node: Node) -> dict | None: fn_name = self._get_node_name(node) doc_comment = self._get_doc_comments(node) if fn_name and doc_comment: - return { + result = { "node_type": "function", "name": fn_name, "doc": doc_comment, @@ -102,6 +102,12 @@ def _parse_function(self, node: Node) -> dict | None: "short_signature": self._get_short_function_signature(node), } + return_struct = self._get_return_struct(node) + if return_struct: + result["return_struct"] = return_struct + + return result + return None def _get_function_signature(self, node: Node) -> str: @@ -172,7 +178,7 @@ def _parse_field(self, node: Node) -> dict | None: field_name = None field_type = None for child in node.children: - if child.type == "identifier": + if child.type == "identifier" and not field_name: field_name = self._get_node_text(child) elif child.type == ":": continue @@ -189,6 +195,50 @@ def _parse_field(self, node: Node) -> dict | None: return None + def _get_return_struct(self, node: Node) -> dict | None: + """ + Parse structure returned from a function. + Probably recursive search for return is needed, but for we support only basic case. + """ + function_body = self._get_function_body(node) + if not function_body: + return None + + for child in function_body.children: + if child.type == "expression_statement": + return_expression = self._get_return_expression(child) + if not return_expression: + continue + + struct = self._get_struct_declaration(return_expression) + if not struct: + continue + + parsed_struct = self._parse_structure(struct) + if not parsed_struct: + continue + + parsed_struct["node_type"] = "struct" + return parsed_struct + + return None + + def _get_function_body(self, node: Node) -> Node | None: + """Get the block which represents the function's body""" + for child in node.children: + if child.type == "block": + return child + + return None + + def _get_return_expression(self, node: Node) -> Node | None: + """Check if the statement is return and return the return value""" + for child in node.children: + if child.type == "return_expression": + return child + + return None + def _main() -> None: import json # noqa: PLC0415 @@ -217,6 +267,14 @@ def _main() -> None: .y = std.math.maxInt(u32), }; }; + + /// Generic structure factory example + fn GenericStructure(comptime T: type) type { + return struct { + /// Contained value + value: T, + }; + } """ extractor = _ZigDocsExtractor(code) diff --git a/src/mkdocstrings_handlers/zig/templates/material/partials/constant.html.jinja b/src/mkdocstrings_handlers/zig/templates/material/_base/constant.html.jinja similarity index 100% rename from src/mkdocstrings_handlers/zig/templates/material/partials/constant.html.jinja rename to src/mkdocstrings_handlers/zig/templates/material/_base/constant.html.jinja diff --git a/src/mkdocstrings_handlers/zig/templates/material/partials/docstring.html.jinja b/src/mkdocstrings_handlers/zig/templates/material/_base/docstring.html.jinja similarity index 100% rename from src/mkdocstrings_handlers/zig/templates/material/partials/docstring.html.jinja rename to src/mkdocstrings_handlers/zig/templates/material/_base/docstring.html.jinja diff --git a/src/mkdocstrings_handlers/zig/templates/material/partials/fields.html.jinja b/src/mkdocstrings_handlers/zig/templates/material/_base/fields.html.jinja similarity index 100% rename from src/mkdocstrings_handlers/zig/templates/material/partials/fields.html.jinja rename to src/mkdocstrings_handlers/zig/templates/material/_base/fields.html.jinja diff --git a/src/mkdocstrings_handlers/zig/templates/material/partials/function.html.jinja b/src/mkdocstrings_handlers/zig/templates/material/_base/function.html.jinja similarity index 75% rename from src/mkdocstrings_handlers/zig/templates/material/partials/function.html.jinja rename to src/mkdocstrings_handlers/zig/templates/material/_base/function.html.jinja index bfec082..dd72035 100644 --- a/src/mkdocstrings_handlers/zig/templates/material/partials/function.html.jinja +++ b/src/mkdocstrings_handlers/zig/templates/material/_base/function.html.jinja @@ -13,6 +13,10 @@ {% endif %} - {% include "partials/parameters.html.jinja" %} + {% include "parameters.html.jinja" %} + + {% with parent = parent.return_struct %} + {% include "struct.html.jinja" %} + {% endwith %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/zig/templates/material/partials/heading.html.jinja b/src/mkdocstrings_handlers/zig/templates/material/_base/heading.html.jinja similarity index 100% rename from src/mkdocstrings_handlers/zig/templates/material/partials/heading.html.jinja rename to src/mkdocstrings_handlers/zig/templates/material/_base/heading.html.jinja diff --git a/src/mkdocstrings_handlers/zig/templates/material/partials/module.html.jinja b/src/mkdocstrings_handlers/zig/templates/material/_base/module.html.jinja similarity index 61% rename from src/mkdocstrings_handlers/zig/templates/material/partials/module.html.jinja rename to src/mkdocstrings_handlers/zig/templates/material/_base/module.html.jinja index 68bfa3b..f6ad861 100644 --- a/src/mkdocstrings_handlers/zig/templates/material/partials/module.html.jinja +++ b/src/mkdocstrings_handlers/zig/templates/material/_base/module.html.jinja @@ -4,18 +4,18 @@