3"""Semantic inventory for named-hardware waivers on canned silent stubs."""
5from __future__
import annotations
7from pathlib
import Path
9from check_no_silent_stubs
import CANNED_ERRORS, EXCLUDED, ROOTS, real_definitions, scan_text
10from suppression_catalog
import ownership
11from suppression_model
import Finding, Suppression
14def scan_hardware_todo_controls(
15 root: Path, paths: list[str]
16) -> tuple[list[Suppression], list[Finding]]:
17 """Bind TODO hardware names only to real CANNED candidates, never SHADOW."""
22 and rel.startswith(tuple(f
"{prefix}/" for prefix
in ROOTS))
23 and not rel.startswith(EXCLUDED)
24 and ownership(rel) ==
"first-party"
26 pairs = [(rel, root / rel)
for rel
in rels
if (root / rel).is_file()]
27 files = [item[1]
for item
in pairs]
28 definitions = real_definitions(files)
29 records: list[Suppression] = []
30 for rel, file_path
in pairs:
31 for candidate
in scan_text(file_path.read_text(errors=
"replace"), rel):
32 if candidate[
"returns"]
not in CANNED_ERRORS
or not candidate[
"waiver"]:
36 for item
in definitions.get(candidate[
"name"], [])
37 if item[
"path"] != rel
and not item[
"internal"]
and not candidate[
"internal"]
41 reason = str(candidate[
"waiver"])
45 int(candidate[
"line"]),
48 "check-no-silent-stubs",
49 "hardware-blocked-canned-stub",
50 "TODO(named-hardware)",
51 f
"function:{candidate['name']}",
53 "semantic-function-binding",