From nobody Sat Feb 7 20:58:14 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C95FD344D87; Thu, 22 Jan 2026 17:30:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103057; cv=none; b=cH4fDGm6iakFM6kqbJ64gHv8LteyzB5L0z0LRxX2MPhSmxzwZmCM4GlqVdCn7KJhHN53cJbwf0R7N9SOF0syzcuoReoNJFLk8Rn9k2GX6s4ShwF7O0KpAmvT/WzawK1I6jMPT0AUr2Ixrr39Z9K/BlfnPdYClO3LRDANSLS1w3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103057; c=relaxed/simple; bh=JBx7i2BRLUG0r+j5Fz0gzZAgW8vhiXHQUtlgJNI/jP8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WCaal45lHTMV8utVAjf509ZFOvAyxVel/3ZVT++uQTae5iBc6jDHaNWM2UbpmPKW0vlZUmx+AMjuDg12iSbDX7pfDnnatsNjkmBUyoXQkvfMysLGbXWRrOQCOTURakjwVCNhjEW5IwvMnlPQB4xwkEqYv/JraSYmMg+2PkLUJj0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dGlj5CZG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dGlj5CZG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B72B4C116D0; Thu, 22 Jan 2026 17:30:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769103056; bh=JBx7i2BRLUG0r+j5Fz0gzZAgW8vhiXHQUtlgJNI/jP8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=dGlj5CZGuO+euivDkcOl9zE1uWFycDHBNjFzL5BK3hBhmUyFVyUV4tmj1YgGvmNhr dZW+znteo9pyuPTYO0ouGZx9zTj1KyPS4MGoVhbSsxK1AzkcvXQHYZ6sGSnx/yd3j/ AdKQU+afY5X81TyPgw89iWeMayellCkkuRbpwJc9FpqjiBlA2eO8QzdW5x0RU39YL+ GMyuqgO14ltou7Qub4BFqIF0YjJLzO+D1dXq3b2N9rgkCKmQ66h7YsapkImXi45zmz HWd2I5+Tkt2t4PQTTsUN7+BIG3hoy3rmxPREtjVMopai+VBoStEX2eh5/GonN9W5Yq MK7LFaw2wTnYA== From: Tamir Duberstein Date: Thu, 22 Jan 2026 12:30:45 -0500 Subject: [PATCH 1/4] scripts: generate_rust_analyzer.py: extract `{build,register}_crate` Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260122-rust-analyzer-types-v1-1-29cc2e91dcd5@kernel.org> References: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> In-Reply-To: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> To: Jesung Yang , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Tamir Duberstein , Daniel Almeida , Fiona Behrens X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openssh-sha256; t=1769103052; l=4750; i=tamird@kernel.org; h=from:subject:message-id; bh=JBx7i2BRLUG0r+j5Fz0gzZAgW8vhiXHQUtlgJNI/jP8=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgtYz36g7iDMSkY5K7Ab51ksGX7hJgs MRt+XVZTrIzMVIAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QBvk2QshFFuouW6hPMnB+1oxDzkDdaBKZVQmwRz5F1seW+gwC6DVU8sPURGcJ6uy6mu0UZBbwdV 8VQ6gTiCylAw= X-Developer-Key: i=tamird@kernel.org; a=openssh; fpr=SHA256:264rPmnnrb+ERkS7DDS3tuwqcJss/zevJRzoylqMsbc Extract helpers from `append_crate` to avoid the need to peek into `crates[-1]`. This improves readability. Change default parameters to `None` with true defaults applied in `build_crate` to avoid repeating the defaults in wrapper functions such as `append_crate`. Use `ruff format` to format modified lines. Suggested-by: Trevor Gross Reviewed-by: Daniel Almeida Tested-by: Daniel Almeida Reviewed-by: Fiona Behrens Reviewed-by: Trevor Gross Signed-off-by: Tamir Duberstein Reviewed-by: Jesung Yang Tested-by: Jesung Yang --- scripts/generate_rust_analyzer.py | 76 +++++++++++++++++++++++++++++++----= ---- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_anal= yzer.py index 147d0cc94068..fbf686f0dced 100755 --- a/scripts/generate_rust_analyzer.py +++ b/scripts/generate_rust_analyzer.py @@ -35,7 +35,22 @@ def generate_crates(srctree, objtree, sysroot_src, exter= nal_src, cfgs, core_edit crates_indexes =3D {} crates_cfgs =3D args_crates_cfgs(cfgs) =20 - def append_crate(display_name, root_module, deps, cfg=3D[], is_workspa= ce_member=3DTrue, is_proc_macro=3DFalse, edition=3D"2021"): + def build_crate( + display_name, + root_module, + deps, + *, + cfg, + is_workspace_member, + is_proc_macro, + edition, + ): + cfg =3D cfg if cfg is not None else [] + is_workspace_member =3D ( + is_workspace_member if is_workspace_member is not None else Tr= ue + ) + is_proc_macro =3D is_proc_macro if is_proc_macro is not None else = False + edition =3D edition if edition is not None else "2021" crate =3D { "display_name": display_name, "root_module": str(root_module), @@ -54,20 +69,46 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit stdin=3Dsubprocess.DEVNULL, ).decode('utf-8').strip() crate["proc_macro_dylib_path"] =3D f"{objtree}/rust/{proc_macr= o_dylib_name}" - crates_indexes[display_name] =3D len(crates) + return crate + + def register_crate(crate): + crates_indexes[crate["display_name"]] =3D len(crates) crates.append(crate) =20 + def append_crate( + display_name, + root_module, + deps, + *, + cfg=3DNone, + is_workspace_member=3DNone, + is_proc_macro=3DNone, + edition=3DNone, + ): + return register_crate( + build_crate( + display_name, + root_module, + deps, + cfg=3Dcfg, + is_workspace_member=3Dis_workspace_member, + is_proc_macro=3Dis_proc_macro, + edition=3Dedition, + ) + ) + def append_sysroot_crate( display_name, deps, - cfg=3D[], - edition=3D"2021", + *, + cfg=3DNone, + edition=3DNone, ): - append_crate( + return append_crate( display_name, sysroot_src / display_name / "src" / "lib.rs", deps, - cfg, + cfg=3Dcfg, is_workspace_member=3DFalse, edition=3Dedition, ) @@ -145,20 +186,27 @@ def generate_crates(srctree, objtree, sysroot_src, ex= ternal_src, cfgs, core_edit display_name, deps, ): - append_crate( + crate =3D build_crate( display_name, srctree / "rust"/ display_name / "lib.rs", deps, cfg=3Dcfg, + is_workspace_member=3DTrue, + is_proc_macro=3DFalse, + edition=3DNone, ) - crates[-1]["env"]["OBJTREE"] =3D str(objtree.resolve(True)) - crates[-1]["source"] =3D { - "include_dirs": [ - str(srctree / "rust" / display_name), - str(objtree / "rust") - ], - "exclude_dirs": [], + crate["env"]["OBJTREE"] =3D str(objtree.resolve(True)) + crate_with_generated =3D { + **crate, + "source": { + "include_dirs": [ + str(srctree / "rust" / display_name), + str(objtree / "rust"), + ], + "exclude_dirs": [], + }, } + return register_crate(crate_with_generated) =20 append_crate_with_generated("bindings", ["core", "ffi", "pin_init"]) append_crate_with_generated("uapi", ["core", "ffi", "pin_init"]) --=20 2.52.0 From nobody Sat Feb 7 20:58:14 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DECB1366047; Thu, 22 Jan 2026 17:30:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103057; cv=none; b=L+g6mp5d/ShrMDJY6q8ldRg6oXNqXiYhC+HV3eQEqKTVW+Zf+JsCHY1aTP2Bdu0ILHSBPbSGR3tbmPqAwY3P3ajRz+Ceyyk3uyEulVTcviPyHGpsROu38TZ4b6cJQh5tR+v8JqBSp3chJJc8BiqTpjczqYvbmByJC3ts1+nsTh0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103057; c=relaxed/simple; bh=rqkfMsPmGDvPE2L5/f+Gzp/R09gApJ9QjhDPUA9qg4I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WpMvIHrJcfAI6EtqymbXObs89Z3t/vaiuRU8zrMgkNmwUIcIN/DzUHH+0ZcTDs7rFbpl503PpdZxeLZoFQMQLv8DOyQAVIyQR2DLCRArrxF60l5kWla0kLPBz6sw44Ja3O4oy/yg5x1iNCvGADNVYeZFYXPVhLzUdNwyf6Mygu4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ijhg0gDv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ijhg0gDv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3887EC116C6; Thu, 22 Jan 2026 17:30:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769103057; bh=rqkfMsPmGDvPE2L5/f+Gzp/R09gApJ9QjhDPUA9qg4I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Ijhg0gDv5v1DZ02tAuaih2+qfvRWYbA3RrBWzRP37QVPJ1Cklv80ZKalTMx24h8HY s/LNcgE+ngpjscOpyaZ+9KOrNuvHDi95020NL7ebzj9g1kBIqnRY2uPKWQx5Ovb4zv UpcUflfEWBTNtwuQmqCwQSBtZIZmTxnGDzkF4QoY3Lodt2KipQbUsVz+1i5BbTk+7m G2wx7Go6si2tDi+9DqMVUTLPfXdipwIgRaH5tKa3yUg+qkVLVaev76rnj/bq7/vnDv Mz29LFHFXFdfmmQloG78gzazE8EROdZS2QHrCHN2MlDL6iPnzW04FFGhNSo/HWe1DK 3J75DNdOSr8dQ== From: Tamir Duberstein Date: Thu, 22 Jan 2026 12:30:46 -0500 Subject: [PATCH 2/4] scripts: generate_rust_analyzer.py: drop `"is_proc_macro": false` Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260122-rust-analyzer-types-v1-2-29cc2e91dcd5@kernel.org> References: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> In-Reply-To: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> To: Jesung Yang , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Tamir Duberstein , Daniel Almeida X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openssh-sha256; t=1769103052; l=5649; i=tamird@kernel.org; h=from:subject:message-id; bh=rqkfMsPmGDvPE2L5/f+Gzp/R09gApJ9QjhDPUA9qg4I=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgtYz36g7iDMSkY5K7Ab51ksGX7hJgs MRt+XVZTrIzMVIAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QHH8mXRFRmnUphKAu9VNG/SEWTkjCFYPQdyIMGB3XHvtlVu9pMcrjn+3dSQRR7GtCrSsz/ikSPf V9hRlsPxtCwM= X-Developer-Key: i=tamird@kernel.org; a=openssh; fpr=SHA256:264rPmnnrb+ERkS7DDS3tuwqcJss/zevJRzoylqMsbc Add a dedicated `append_proc_macro_crate` function to reduce overloading in `append_crate`. This has the effect of removing `"is_proc_macro": false` from the output; this field is interpreted as false if absent[1] so this doesn't change the behavior of rust-analyzer. Use the `/` operator on `pathlib.Path` rather than directly crafting a string. This is consistent with all other path manipulation in this script. Link: https://github.com/rust-lang/rust-analyzer/blob/8d01570b5e812a49daa1f= 08404269f6ea5dd73a1/crates/project-model/src/project_json.rs#L372-L373 [1] Tested-by: Daniel Almeida Reviewed-by: Daniel Almeida Reviewed-by: Trevor Gross Signed-off-by: Tamir Duberstein Reviewed-by: Jesung Yang Tested-by: Jesung Yang --- scripts/generate_rust_analyzer.py | 60 ++++++++++++++++++++++++++++-------= ---- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_anal= yzer.py index fbf686f0dced..bc79e4d8e8e7 100755 --- a/scripts/generate_rust_analyzer.py +++ b/scripts/generate_rust_analyzer.py @@ -42,20 +42,17 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit *, cfg, is_workspace_member, - is_proc_macro, edition, ): cfg =3D cfg if cfg is not None else [] is_workspace_member =3D ( is_workspace_member if is_workspace_member is not None else Tr= ue ) - is_proc_macro =3D is_proc_macro if is_proc_macro is not None else = False edition =3D edition if edition is not None else "2021" - crate =3D { + return { "display_name": display_name, "root_module": str(root_module), "is_workspace_member": is_workspace_member, - "is_proc_macro": is_proc_macro, "deps": [{"crate": crates_indexes[dep], "name": dep} for dep i= n deps], "cfg": cfg, "edition": edition, @@ -63,13 +60,47 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit "RUST_MODFILE": "This is only for rust-analyzer" } } - if is_proc_macro: - proc_macro_dylib_name =3D subprocess.check_output( - [os.environ["RUSTC"], "--print", "file-names", "--crate-na= me", display_name, "--crate-type", "proc-macro", "-"], + + def append_proc_macro_crate( + display_name, + root_module, + deps, + *, + cfg=3DNone, + is_workspace_member=3DNone, + edition=3DNone, + ): + crate =3D build_crate( + display_name, + root_module, + deps, + cfg=3Dcfg, + is_workspace_member=3Dis_workspace_member, + edition=3Dedition, + ) + proc_macro_dylib_name =3D ( + subprocess.check_output( + [ + os.environ["RUSTC"], + "--print", + "file-names", + "--crate-name", + display_name, + "--crate-type", + "proc-macro", + "-", + ], stdin=3Dsubprocess.DEVNULL, - ).decode('utf-8').strip() - crate["proc_macro_dylib_path"] =3D f"{objtree}/rust/{proc_macr= o_dylib_name}" - return crate + ) + .decode("utf-8") + .strip() + ) + proc_macro_crate =3D { + **crate, + "is_proc_macro": True, + "proc_macro_dylib_path": str(objtree / "rust" / proc_macro_dyl= ib_name), + } + return register_crate(proc_macro_crate) =20 def register_crate(crate): crates_indexes[crate["display_name"]] =3D len(crates) @@ -82,7 +113,6 @@ def generate_crates(srctree, objtree, sysroot_src, exter= nal_src, cfgs, core_edit *, cfg=3DNone, is_workspace_member=3DNone, - is_proc_macro=3DNone, edition=3DNone, ): return register_crate( @@ -92,7 +122,6 @@ def generate_crates(srctree, objtree, sysroot_src, exter= nal_src, cfgs, core_edit deps, cfg=3Dcfg, is_workspace_member=3Dis_workspace_member, - is_proc_macro=3Dis_proc_macro, edition=3Dedition, ) ) @@ -148,11 +177,10 @@ def generate_crates(srctree, objtree, sysroot_src, ex= ternal_src, cfgs, core_edit cfg=3Dcrates_cfgs["syn"], ) =20 - append_crate( + append_proc_macro_crate( "macros", srctree / "rust" / "macros" / "lib.rs", ["std", "proc_macro", "proc_macro2", "quote", "syn"], - is_proc_macro=3DTrue, ) =20 append_crate( @@ -161,12 +189,11 @@ def generate_crates(srctree, objtree, sysroot_src, ex= ternal_src, cfgs, core_edit ["core", "compiler_builtins"], ) =20 - append_crate( + append_proc_macro_crate( "pin_init_internal", srctree / "rust" / "pin-init" / "internal" / "src" / "lib.rs", [], cfg=3D["kernel"], - is_proc_macro=3DTrue, ) =20 append_crate( @@ -192,7 +219,6 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit deps, cfg=3Dcfg, is_workspace_member=3DTrue, - is_proc_macro=3DFalse, edition=3DNone, ) crate["env"]["OBJTREE"] =3D str(objtree.resolve(True)) --=20 2.52.0 From nobody Sat Feb 7 20:58:14 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 329FE23ED75; Thu, 22 Jan 2026 17:30:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103059; cv=none; b=iiyHx279fOA6kQW2ZvXmUaL27qjyC0DXTRevNE9qSr7taBgEf/9BAU33CjdEzgDLWzItmwjGq9x65GqkAQtKqYG0doLZYMYSYlMuUlK1TnE4AnjHYEDBy0EKOG7Y+ZMxWflonU4rPOrb/v8qIbkl3hqKd2aqkCymzgt9zBRKsWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103059; c=relaxed/simple; bh=36ruCmo+r1BzderDNTCI9lf9enZ1Me+RMKf1acltnyo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kq1vRWoBXloOz+xUHemdHN0VEx//16QUczk/9lEWhhXt7zZIVrEkLWFmhj9PSJkfYQFM8TYyILD1LtTx4/lA2KU+tYD0xS44c45H8YUerUoHr85CAPRflhs84wIoT0Ck2pf9D210uszDQKhIjSCU3ZbVEe7zZxeDe6Q9RB31WMw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ITMWVIWM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ITMWVIWM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9BF51C19423; Thu, 22 Jan 2026 17:30:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769103058; bh=36ruCmo+r1BzderDNTCI9lf9enZ1Me+RMKf1acltnyo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ITMWVIWMq86fI6T7gyFwdk+En6sO7V+aJFOAoBhyvescyVBhvVjDj/2NDHm81gJHH ZDCmmjfsUINFy13G3G0GkjzXFa7+dgMkeUTErGk8/omuMVJuRa5d8cDhm/LWyXH/Q+ 04hzGyIyQ8rtARwL1+2JQFOlQ3UwEOFJZB52/t0/e/ouh6pBhxsE35qQkHEdQllogb EyQJ6xG8mjcLSG/cs11bjMoZRTj1ri/pjEg2Gke7qCifjcgW62+J0Ebz8vf5VTTZgC 0GO28FT9Mr4bV3lkMQEk9Iu51aKWPZlNrvx465DjU7GJWDxrB+c8sBNiNgaQVG8Hbf RlFa4tYIJd7Dw== From: Tamir Duberstein Date: Thu, 22 Jan 2026 12:30:47 -0500 Subject: [PATCH 3/4] scripts: generate_rust_analyzer.py: add type hints Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260122-rust-analyzer-types-v1-3-29cc2e91dcd5@kernel.org> References: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> In-Reply-To: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> To: Jesung Yang , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Tamir Duberstein , Daniel Almeida X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openssh-sha256; t=1769103052; l=8692; i=tamird@kernel.org; h=from:subject:message-id; bh=36ruCmo+r1BzderDNTCI9lf9enZ1Me+RMKf1acltnyo=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgtYz36g7iDMSkY5K7Ab51ksGX7hJgs MRt+XVZTrIzMVIAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QNNymsf14WPoK5+wOQqIeRu5U+mOArn0IFVnX2lua9wVTMRuGaV+zI73fsHVwn+JbVqOWNbjv7K HwYtmzcJRcA8= X-Developer-Key: i=tamird@kernel.org; a=openssh; fpr=SHA256:264rPmnnrb+ERkS7DDS3tuwqcJss/zevJRzoylqMsbc Python type hints allow static analysis tools like mypy to detect type errors during development, improving the developer experience. Python type hints have been present in the kernel since 2019 at the latest; see commit 6ebf5866f2e8 ("kunit: tool: add Python wrappers for running KUnit tests"). Add a subclass of `argparse.Namespace` to get type checking on the CLI arguments. Run `mypy --strict scripts/generate_rust_analyzer.py --python-version 3.9` to verify. Note that `mypy` no longer supports python < 3.9. Tested-by: Daniel Almeida Reviewed-by: Daniel Almeida Reviewed-by: Trevor Gross Signed-off-by: Tamir Duberstein Reviewed-by: Jesung Yang Tested-by: Jesung Yang --- scripts/generate_rust_analyzer.py | 130 ++++++++++++++++++++++++++--------= ---- 1 file changed, 90 insertions(+), 40 deletions(-) diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_anal= yzer.py index bc79e4d8e8e7..2723154f207c 100755 --- a/scripts/generate_rust_analyzer.py +++ b/scripts/generate_rust_analyzer.py @@ -10,8 +10,9 @@ import os import pathlib import subprocess import sys +from typing import Dict, Iterable, List, Literal, Optional, TypedDict =20 -def args_crates_cfgs(cfgs): +def args_crates_cfgs(cfgs: List[str]) -> Dict[str, List[str]]: crates_cfgs =3D {} for cfg in cfgs: crate, vals =3D cfg.split("=3D", 1) @@ -19,7 +20,43 @@ def args_crates_cfgs(cfgs): =20 return crates_cfgs =20 -def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, cor= e_edition): +class Dependency(TypedDict): + crate: int + name: str + + +class Source(TypedDict): + include_dirs: List[str] + exclude_dirs: List[str] + + +class Crate(TypedDict): + display_name: str + root_module: str + is_workspace_member: bool + deps: List[Dependency] + cfg: List[str] + edition: str + env: Dict[str, str] + + +class ProcMacroCrate(Crate): + is_proc_macro: Literal[True] + proc_macro_dylib_path: str # `pathlib.Path` is not JSON serializable. + + +class CrateWithGenerated(Crate): + source: Source + + +def generate_crates( + srctree: pathlib.Path, + objtree: pathlib.Path, + sysroot_src: pathlib.Path, + external_src: Optional[pathlib.Path], + cfgs: List[str], + core_edition: str, +) -> List[Crate]: # Generate the configuration list. cfg =3D [] with open(objtree / "include" / "generated" / "rustc_cfg") as fd: @@ -31,19 +68,19 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit # Now fill the crates list -- dependencies need to come first. # # Avoid O(n^2) iterations by keeping a map of indexes. - crates =3D [] - crates_indexes =3D {} + crates: List[Crate] =3D [] + crates_indexes: Dict[str, int] =3D {} crates_cfgs =3D args_crates_cfgs(cfgs) =20 def build_crate( - display_name, - root_module, - deps, + display_name: str, + root_module: pathlib.Path, + deps: List[str], *, - cfg, - is_workspace_member, - edition, - ): + cfg: Optional[List[str]], + is_workspace_member: Optional[bool], + edition: Optional[str], + ) -> Crate: cfg =3D cfg if cfg is not None else [] is_workspace_member =3D ( is_workspace_member if is_workspace_member is not None else Tr= ue @@ -62,14 +99,14 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit } =20 def append_proc_macro_crate( - display_name, - root_module, - deps, + display_name: str, + root_module: pathlib.Path, + deps: List[str], *, - cfg=3DNone, - is_workspace_member=3DNone, - edition=3DNone, - ): + cfg: Optional[List[str]] =3D None, + is_workspace_member: Optional[bool] =3D None, + edition: Optional[str] =3D None, + ) -> None: crate =3D build_crate( display_name, root_module, @@ -95,26 +132,26 @@ def generate_crates(srctree, objtree, sysroot_src, ext= ernal_src, cfgs, core_edit .decode("utf-8") .strip() ) - proc_macro_crate =3D { + proc_macro_crate: ProcMacroCrate =3D { **crate, "is_proc_macro": True, "proc_macro_dylib_path": str(objtree / "rust" / proc_macro_dyl= ib_name), } return register_crate(proc_macro_crate) =20 - def register_crate(crate): + def register_crate(crate: Crate) -> None: crates_indexes[crate["display_name"]] =3D len(crates) crates.append(crate) =20 def append_crate( - display_name, - root_module, - deps, + display_name: str, + root_module: pathlib.Path, + deps: List[str], *, - cfg=3DNone, - is_workspace_member=3DNone, - edition=3DNone, - ): + cfg: Optional[List[str]] =3D None, + is_workspace_member: Optional[bool] =3D None, + edition: Optional[str] =3D None, + ) -> None: return register_crate( build_crate( display_name, @@ -127,12 +164,12 @@ def generate_crates(srctree, objtree, sysroot_src, ex= ternal_src, cfgs, core_edit ) =20 def append_sysroot_crate( - display_name, - deps, + display_name: str, + deps: List[str], *, - cfg=3DNone, - edition=3DNone, - ): + cfg: Optional[List[str]] =3D None, + edition: Optional[str] =3D None, + ) -> None: return append_crate( display_name, sysroot_src / display_name / "src" / "lib.rs", @@ -210,9 +247,9 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit ) =20 def append_crate_with_generated( - display_name, - deps, - ): + display_name: str, + deps: List[str], + ) -> None: crate =3D build_crate( display_name, srctree / "rust"/ display_name / "lib.rs", @@ -222,7 +259,7 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit edition=3DNone, ) crate["env"]["OBJTREE"] =3D str(objtree.resolve(True)) - crate_with_generated =3D { + crate_with_generated: CrateWithGenerated =3D { **crate, "source": { "include_dirs": [ @@ -238,7 +275,7 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit append_crate_with_generated("uapi", ["core", "ffi", "pin_init"]) append_crate_with_generated("kernel", ["core", "macros", "build_error"= , "pin_init", "ffi", "bindings", "uapi"]) =20 - def is_root_crate(build_file, target): + def is_root_crate(build_file: pathlib.Path, target: str) -> bool: try: return f"{target}.o" in open(build_file).read() except FileNotFoundError: @@ -247,7 +284,9 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit # Then, the rest outside of `rust/`. # # We explicitly mention the top-level folders we want to cover. - extra_dirs =3D map(lambda dir: srctree / dir, ("samples", "drivers")) + extra_dirs: Iterable[pathlib.Path] =3D ( + srctree / dir for dir in ("samples", "drivers") + ) if external_src is not None: extra_dirs =3D [external_src] for folder in extra_dirs: @@ -270,7 +309,7 @@ def generate_crates(srctree, objtree, sysroot_src, exte= rnal_src, cfgs, core_edit =20 return crates =20 -def main(): +def main() -> None: parser =3D argparse.ArgumentParser() parser.add_argument('--verbose', '-v', action=3D'store_true') parser.add_argument('--cfgs', action=3D'append', default=3D[]) @@ -280,7 +319,18 @@ def main(): parser.add_argument("sysroot", type=3Dpathlib.Path) parser.add_argument("sysroot_src", type=3Dpathlib.Path) parser.add_argument("exttree", type=3Dpathlib.Path, nargs=3D"?") - args =3D parser.parse_args() + + class Args(argparse.Namespace): + verbose: bool + cfgs: List[str] + srctree: pathlib.Path + objtree: pathlib.Path + sysroot: pathlib.Path + sysroot_src: pathlib.Path + exttree: Optional[pathlib.Path] + core_edition: str + + args =3D parser.parse_args(namespace=3DArgs()) =20 logging.basicConfig( format=3D"[%(asctime)s] [%(levelname)s] %(message)s", --=20 2.52.0 From nobody Sat Feb 7 20:58:14 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E8B830F925; Thu, 22 Jan 2026 17:31:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103062; cv=none; b=tGBrVlvPRZjCuFtyCmO2Iw3uCGotlkshKgwxn3ofinoQiUyUMrN32BV4FCJ0ZYj8bZhK76aeDnnN+jdxbWuqumETHDrhoCGENK6qW4Ty9j9PdE4cKWQykdAz2U0q0op3YpLu/ABSB1ehPUU/1+U+X5IBztTU29SFFqoC3X8yEwo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769103062; c=relaxed/simple; bh=zMXrgAtF0e7iHP7f42GLvdV5rWt3y/mmSt8wv4h7l9U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gvb82eWzLQJq9Z2QaeKJQ6nvdl5m7LEg0Hg6066eWW6tY/EdYPAs4MQpAVq4xe9MnW72IjTuLbbIGVr7X1Hf13XduwtOtoTXUplZxEDm8EZepjLE0DKD/0pJiqokanvGB5AWGOaha8uVlQp1ZOjVdXEOPSJzWf3+epnbD4pEc1g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uO8m8yqZ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uO8m8yqZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0A27DC116C6; Thu, 22 Jan 2026 17:30:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769103060; bh=zMXrgAtF0e7iHP7f42GLvdV5rWt3y/mmSt8wv4h7l9U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=uO8m8yqZP38LdNv/rSyEUO1QZXSrFm25o9C4qBarV0xAhI0jWA5DaHbXhmICIOFk8 sbRhKEo1jSNE8D9+3nCUbZmbQU2kBdPD0j87K5Wgak08K407Fzfx1UC7tVlK25LbeC Tu0h5JAKNY/K0dL02YzSQzcAbhMFWcm/vshfAS3YEVb3+AzTmg5eA+If+pRGaPv3ia B0uRm+XDdknsoEyCm8Y/vhLMsx8h3iUkvxIEAmwgpi3Twvj5QeJFy2MyDFtUrGQ25y suMQPsZwcJ3b4/EO/R8vaF8wKK5QPAPHq5NUWxjep51Zx4Xo1wg+n33wjU7UKe5QWz osv7ze9jTJrEQ== From: Tamir Duberstein Date: Thu, 22 Jan 2026 12:30:48 -0500 Subject: [PATCH 4/4] scripts: generate_rust_analyzer.py: identify crates explicitly Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260122-rust-analyzer-types-v1-4-29cc2e91dcd5@kernel.org> References: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> In-Reply-To: <20260122-rust-analyzer-types-v1-0-29cc2e91dcd5@kernel.org> To: Jesung Yang , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Tamir Duberstein , Fiona Behrens , Daniel Almeida X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openssh-sha256; t=1769103052; l=7970; i=tamird@kernel.org; h=from:subject:message-id; bh=zMXrgAtF0e7iHP7f42GLvdV5rWt3y/mmSt8wv4h7l9U=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgtYz36g7iDMSkY5K7Ab51ksGX7hJgs MRt+XVZTrIzMVIAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QLoDj7FdQyCDjkHHvRN7RFQVo7wlPYx8Ytsm9evXkDc0bVJCg/086ce3xMNKd3xVt6sfXHGz0aT ssmmovTKfkQI= X-Developer-Key: i=tamird@kernel.org; a=openssh; fpr=SHA256:264rPmnnrb+ERkS7DDS3tuwqcJss/zevJRzoylqMsbc Use the return of `append_crate` to declare dependency on that crate. This removes the need to build an index of crates and allows multiple crates with the same display_name be defined, which allows e.g. host crates to be defined separately from target crates. Reviewed-by: Fiona Behrens Reviewed-by: Daniel Almeida Tested-by: Daniel Almeida Reviewed-by: Trevor Gross Signed-off-by: Tamir Duberstein Reviewed-by: Jesung Yang Tested-by: Jesung Yang --- scripts/generate_rust_analyzer.py | 82 ++++++++++++++++++++---------------= ---- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_anal= yzer.py index 2723154f207c..b8fa1b4c37b0 100755 --- a/scripts/generate_rust_analyzer.py +++ b/scripts/generate_rust_analyzer.py @@ -65,17 +65,14 @@ def generate_crates( line =3D line.replace("\n", "") cfg.append(line) =20 - # Now fill the crates list -- dependencies need to come first. - # - # Avoid O(n^2) iterations by keeping a map of indexes. + # Now fill the crates list. crates: List[Crate] =3D [] - crates_indexes: Dict[str, int] =3D {} crates_cfgs =3D args_crates_cfgs(cfgs) =20 def build_crate( display_name: str, root_module: pathlib.Path, - deps: List[str], + deps: List[Dependency], *, cfg: Optional[List[str]], is_workspace_member: Optional[bool], @@ -90,7 +87,7 @@ def generate_crates( "display_name": display_name, "root_module": str(root_module), "is_workspace_member": is_workspace_member, - "deps": [{"crate": crates_indexes[dep], "name": dep} for dep i= n deps], + "deps": deps, "cfg": cfg, "edition": edition, "env": { @@ -101,12 +98,12 @@ def generate_crates( def append_proc_macro_crate( display_name: str, root_module: pathlib.Path, - deps: List[str], + deps: List[Dependency], *, cfg: Optional[List[str]] =3D None, is_workspace_member: Optional[bool] =3D None, edition: Optional[str] =3D None, - ) -> None: + ) -> Dependency: crate =3D build_crate( display_name, root_module, @@ -139,19 +136,20 @@ def generate_crates( } return register_crate(proc_macro_crate) =20 - def register_crate(crate: Crate) -> None: - crates_indexes[crate["display_name"]] =3D len(crates) + def register_crate(crate: Crate) -> Dependency: + index =3D len(crates) crates.append(crate) + return {"crate": index, "name": crate["display_name"]} =20 def append_crate( display_name: str, root_module: pathlib.Path, - deps: List[str], + deps: List[Dependency], *, cfg: Optional[List[str]] =3D None, is_workspace_member: Optional[bool] =3D None, edition: Optional[str] =3D None, - ) -> None: + ) -> Dependency: return register_crate( build_crate( display_name, @@ -165,11 +163,11 @@ def generate_crates( =20 def append_sysroot_crate( display_name: str, - deps: List[str], + deps: List[Dependency], *, cfg: Optional[List[str]] =3D None, edition: Optional[str] =3D None, - ) -> None: + ) -> Dependency: return append_crate( display_name, sysroot_src / display_name / "src" / "lib.rs", @@ -182,74 +180,76 @@ def generate_crates( # NB: sysroot crates reexport items from one another so setting up our= transitive dependencies # here is important for ensuring that rust-analyzer can resolve symbol= s. The sources of truth # for this dependency graph are `(sysroot_src / crate / "Cargo.toml" f= or crate in crates)`. - append_sysroot_crate("core", [], cfg=3Dcrates_cfgs.get("core", []), ed= ition=3Dcore_edition) - append_sysroot_crate("alloc", ["core"]) - append_sysroot_crate("std", ["alloc", "core"]) - append_sysroot_crate("proc_macro", ["core", "std"]) + core =3D append_sysroot_crate( + "core", [], cfg=3Dcrates_cfgs.get("core", []), edition=3Dcore_edit= ion + ) + alloc =3D append_sysroot_crate("alloc", [core]) + std =3D append_sysroot_crate("std", [alloc, core]) + proc_macro =3D append_sysroot_crate("proc_macro", [core, std]) =20 - append_crate( + compiler_builtins =3D append_crate( "compiler_builtins", srctree / "rust" / "compiler_builtins.rs", [], ) =20 - append_crate( + proc_macro2 =3D append_crate( "proc_macro2", srctree / "rust" / "proc-macro2" / "lib.rs", - ["core", "alloc", "std", "proc_macro"], + [core, alloc, std, proc_macro], cfg=3Dcrates_cfgs["proc_macro2"], ) =20 - append_crate( + quote =3D append_crate( "quote", srctree / "rust" / "quote" / "lib.rs", - ["alloc", "proc_macro", "proc_macro2"], + [alloc, proc_macro, proc_macro2], cfg=3Dcrates_cfgs["quote"], ) =20 - append_crate( + syn =3D append_crate( "syn", srctree / "rust" / "syn" / "lib.rs", - ["proc_macro", "proc_macro2", "quote"], + [proc_macro, proc_macro2, quote], cfg=3Dcrates_cfgs["syn"], ) =20 - append_proc_macro_crate( + macros =3D append_proc_macro_crate( "macros", srctree / "rust" / "macros" / "lib.rs", - ["std", "proc_macro", "proc_macro2", "quote", "syn"], + [std, proc_macro, proc_macro2, quote, syn], ) =20 - append_crate( + build_error =3D append_crate( "build_error", srctree / "rust" / "build_error.rs", - ["core", "compiler_builtins"], + [core, compiler_builtins], ) =20 - append_proc_macro_crate( + pin_init_internal =3D append_proc_macro_crate( "pin_init_internal", srctree / "rust" / "pin-init" / "internal" / "src" / "lib.rs", [], cfg=3D["kernel"], ) =20 - append_crate( + pin_init =3D append_crate( "pin_init", srctree / "rust" / "pin-init" / "src" / "lib.rs", - ["core", "pin_init_internal", "macros"], + [core, pin_init_internal, macros], cfg=3D["kernel"], ) =20 - append_crate( + ffi =3D append_crate( "ffi", srctree / "rust" / "ffi.rs", - ["core", "compiler_builtins"], + [core, compiler_builtins], ) =20 def append_crate_with_generated( display_name: str, - deps: List[str], - ) -> None: + deps: List[Dependency], + ) -> Dependency: crate =3D build_crate( display_name, srctree / "rust"/ display_name / "lib.rs", @@ -271,9 +271,11 @@ def generate_crates( } return register_crate(crate_with_generated) =20 - append_crate_with_generated("bindings", ["core", "ffi", "pin_init"]) - append_crate_with_generated("uapi", ["core", "ffi", "pin_init"]) - append_crate_with_generated("kernel", ["core", "macros", "build_error"= , "pin_init", "ffi", "bindings", "uapi"]) + bindings =3D append_crate_with_generated("bindings", [core, ffi, pin_i= nit]) + uapi =3D append_crate_with_generated("uapi", [core, ffi, pin_init]) + kernel =3D append_crate_with_generated( + "kernel", [core, macros, build_error, pin_init, ffi, bindings, uap= i] + ) =20 def is_root_crate(build_file: pathlib.Path, target: str) -> bool: try: @@ -303,7 +305,7 @@ def generate_crates( append_crate( name, path, - ["core", "kernel"], + [core, kernel], cfg=3Dcfg, ) =20 --=20 2.52.0