Model 1C modules as object parts
CI / python (push) Has been cancelled
CI / rust (push) Has been cancelled

This commit is contained in:
2026-05-17 18:43:43 +03:00
parent 1ad103b6dc
commit 35dd134ebc
7 changed files with 298 additions and 32 deletions
@@ -1095,9 +1095,15 @@ def _attach_bsl_modules(root: Path, normalized: NormalizedProject) -> None:
"original_hash": source.original_hash,
"source_text": source.text,
"module_role": role,
"owner_qualified_name": owner.qualified_name,
"owner_kind": owner.object_kind,
"object_part": _module_object_part(role, form_name),
}
if form_name:
attributes["form_name"] = form_name
form = _find_owner_form(owner, form_name)
if form is not None:
attributes["form_qualified_name"] = form.qualified_name
owner.modules.append(
Module(
name=source_file.stem,
@@ -1189,6 +1195,29 @@ def _module_qualified_name(owner: MetadataObject, role: str, form_name: str, mod
return f"{owner.qualified_name}.{role_suffix}"
def _module_object_part(role: str, form_name: str = "") -> str:
return {
"OBJECT_MODULE": "object.module",
"MANAGER_MODULE": "object.manager",
"RECORD_SET_MODULE": "object.record_set",
"FORM_MODULE": f"form.{form_name}.module" if form_name else "form.module",
"MODULE": "module",
}.get(role, "module")
def _find_owner_form(owner: MetadataObject, form_name: str) -> Form | None:
normalized = form_name.casefold()
return next(
(
form
for form in owner.forms
if form.name.casefold() == normalized
or str(form.qualified_name or "").casefold().endswith(f".{normalized}")
),
None,
)
def _form_name_for_module(root: Path, source_file: Path) -> str:
parts = list(_relative_path(source_file, root).parts)
normalized_parts = [_normalize_path_part(part) for part in parts]