feat/stubgen: make type hints more specific

This commit is contained in:
2026-07-09 18:34:24 +08:00
parent 20dff6d6a7
commit 29a1fdb19a
4 changed files with 19 additions and 14 deletions
-2
View File
@@ -44,8 +44,6 @@ reportImportCycles = "hint"
# Downgraded to hint for capnp to_dict() dynamic data patterns
reportUnknownVariableType = "hint"
reportUnknownArgumentType = "hint"
reportUnknownMemberType = "hint"
reportUnknownParameterType = "hint"
reportAny = "hint"
reportExplicitAny = "hint"
+3 -5
View File
@@ -74,8 +74,6 @@ def generate_interface(
"result_info": result_info,
})
emitter.add_typing_import("Any")
# ── Main interface class ───────────────────────────────────────────
emitter.begin_class(name)
@@ -106,7 +104,7 @@ def generate_interface(
emitter.begin_class(client_name, bases=[name])
emitter.add_method(
"_new_client",
params=["self", "server: Any"],
params=["self", f"server: {name}Server"],
return_type=client_name,
)
emitter.end_class()
@@ -121,8 +119,8 @@ def generate_interface(
emitter.add_method(
mname,
params=["self", f"_params: {param_type}", "_context: Any"],
return_type=None,
params=["self", f"_params: {param_type}", "_context: object"],
return_type="None",
)
emitter.end_class()
+15 -6
View File
@@ -123,7 +123,8 @@ def generate_struct(
_generate_union_methods(emitter, union_fields)
# Factory methods + to_dict
_generate_factory_methods(emitter, qbuilder, qreader)
_generate_factory_methods(emitter, qbuilder, qreader, non_union_fields)
emitter.add_typing_import("Any")
emitter.add_method("to_dict", params=["self"], return_type="dict[str, Any]")
emitter.end_class()
@@ -242,15 +243,23 @@ def _generate_union_methods(
def _generate_factory_methods(
emitter: Emitter, qbuilder: str, qreader: str
emitter: Emitter,
qbuilder: str,
qreader: str,
non_union_fields: list[tuple[str, str]],
) -> None:
emitter.add_typing_import("Any")
emitter.add_typing_import("Generator", "collections.abc")
emitter.add_typing_import("contextmanager", "contextlib")
emitter.add_blank_line()
# Typed kwargs: name: str = ..., age: int = ...
if non_union_fields:
kwargs = [f"{name}: {typ} = ..." for name, typ in non_union_fields]
else:
emitter.add_typing_import("Any")
kwargs = ["**kwargs: Any"]
emitter.add_static_method(
"new_message", params=["**kwargs: Any"], return_type=qbuilder,
"new_message", params=kwargs, return_type=qbuilder,
)
emitter.add_blank_line()
@@ -298,6 +307,6 @@ def _generate_builder_methods(
emitter.add_blank_line()
emitter.add_typing_import("IO", "typing")
emitter.add_static_method("write", params=["file: IO[bytes]"])
emitter.add_static_method("write", params=["file: IO[bytes]"], return_type="None")
emitter.add_blank_line()
emitter.add_static_method("write_packed", params=["file: IO[bytes]"])
emitter.add_static_method("write_packed", params=["file: IO[bytes]"], return_type="None")
+1 -1
View File
@@ -132,7 +132,7 @@ def _resolve_any_pointer(
if "parameter" in ap_dict:
# Look up the generic parameter name from the parent scope
scope_id = type_id_to_int(ap_dict["parameter"]["scopeId"])
param_index = ap_dict["parameter"]["parameterIndex"]
param_index: int = ap_dict["parameter"]["parameterIndex"]
info = registry.get(scope_id)
if info is not None and param_index < len(info.generic_params):
return PythonType(name=info.generic_params[param_index])