mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-05 11:10:20 +03:00
fix(meta-info): обобщённые ссылочные типы вместо сырого cfg:
Ветка TypeSet в Format-Type распознавала только DefinedType и Characteristic, а остальные наборы отдавала в вывод как есть. Голое имя метатипа без «.Имя» означает все ссылки этого класса (docs/meta-dsl-spec.md), и такие типы печатались сырыми — 254 вхождения в 82 строках на корпусе acc/erp/ut/unf: ЗначениеПустойСсылки cfg:ExchangePlanRef | cfg:BusinessProcessRef | … Свойство1 Булево | Строка(128) | ДатаВремя | cfg:AnyIBRef Разбор вынесен в Format-SingleTypeSet: AnyRef → ЛюбаяСсылка, AnyIBRef → ЛюбаяСсылкаИБ, голые XxxRef — через существующий refTypeMap. Конкретный тип всегда пишется с точкой, поэтому «СправочникСсылка» без точки однозначно читается как обобщённый. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
cdf0944b2f
commit
c687860535
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.5 — Compact summary of 1C metadata object
|
||||
# meta-info v1.6 — Compact summary of 1C metadata object
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][Alias('Path')][string]$ObjectPath,
|
||||
@@ -170,6 +170,22 @@ function Get-MLText($node) {
|
||||
return ""
|
||||
}
|
||||
|
||||
# Тип-множество: голое имя метатипа без `.Имя` означает ВСЕ ссылки этого класса
|
||||
# (см. docs/meta-dsl-spec.md §«Тип-множество»). Конкретный тип всегда пишется с точкой,
|
||||
# поэтому «СправочникСсылка» без точки читается однозначно как обобщённый.
|
||||
function Format-SingleTypeSet([string]$raw) {
|
||||
$raw = $raw -replace '^d\d+p\d+:', 'cfg:'
|
||||
if ($raw -match '^cfg:DefinedType\.(.+)$') { return "ОпределяемыйТип.$($Matches[1])" }
|
||||
if ($raw -match '^cfg:Characteristic\.(.+)$') { return "Характеристика.$($Matches[1])" }
|
||||
if ($raw -eq 'cfg:AnyRef') { return "ЛюбаяСсылка" }
|
||||
if ($raw -eq 'cfg:AnyIBRef') { return "ЛюбаяСсылкаИБ" }
|
||||
if ($raw -match '^cfg:(\w+Ref)$' -and $refTypeMap.ContainsKey($Matches[1])) {
|
||||
return $refTypeMap[$Matches[1]]
|
||||
}
|
||||
if ($raw -match '^cfg:(.+)$') { return $Matches[1] }
|
||||
return $raw
|
||||
}
|
||||
|
||||
function Format-Type($typeNode) {
|
||||
if (-not $typeNode) { return "" }
|
||||
$types = @()
|
||||
@@ -178,14 +194,7 @@ function Format-Type($typeNode) {
|
||||
$types += Format-SingleType $raw $typeNode
|
||||
}
|
||||
foreach ($t in $typeNode.SelectNodes("v8:TypeSet", $ns)) {
|
||||
$raw = $t.InnerText
|
||||
if ($raw -match '^cfg:DefinedType\.(.+)$') {
|
||||
$types += "ОпределяемыйТип.$($Matches[1])"
|
||||
} elseif ($raw -match '^cfg:Characteristic\.(.+)$') {
|
||||
$types += "Характеристика.$($Matches[1])"
|
||||
} else {
|
||||
$types += $raw
|
||||
}
|
||||
$types += Format-SingleTypeSet $t.InnerText
|
||||
}
|
||||
if ($types.Count -eq 0) { return "" }
|
||||
if ($types.Count -eq 1) { return $types[0] }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.5 — Compact summary of 1C metadata object (Python port)
|
||||
# meta-info v1.6 — Compact summary of 1C metadata object (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import os
|
||||
@@ -227,6 +227,30 @@ def get_ml_text(node):
|
||||
return ""
|
||||
|
||||
|
||||
# Тип-множество: голое имя метатипа без `.Имя` означает ВСЕ ссылки этого класса
|
||||
# (см. docs/meta-dsl-spec.md §«Тип-множество»). Конкретный тип всегда пишется с точкой,
|
||||
# поэтому «СправочникСсылка» без точки читается однозначно как обобщённый.
|
||||
def format_single_type_set(raw):
|
||||
raw = re.sub(r'^d\d+p\d+:', 'cfg:', raw)
|
||||
m = re.match(r'^cfg:DefinedType\.(.+)$', raw)
|
||||
if m:
|
||||
return f"ОпределяемыйТип.{m.group(1)}"
|
||||
m = re.match(r'^cfg:Characteristic\.(.+)$', raw)
|
||||
if m:
|
||||
return f"Характеристика.{m.group(1)}"
|
||||
if raw == "cfg:AnyRef":
|
||||
return "ЛюбаяСсылка"
|
||||
if raw == "cfg:AnyIBRef":
|
||||
return "ЛюбаяСсылкаИБ"
|
||||
m = re.match(r'^cfg:(\w+Ref)$', raw)
|
||||
if m and m.group(1) in ref_type_map:
|
||||
return ref_type_map[m.group(1)]
|
||||
m = re.match(r'^cfg:(.+)$', raw)
|
||||
if m:
|
||||
return m.group(1)
|
||||
return raw
|
||||
|
||||
|
||||
def format_type(type_node_el):
|
||||
if type_node_el is None:
|
||||
return ""
|
||||
@@ -234,16 +258,7 @@ def format_type(type_node_el):
|
||||
for t in find_all(type_node_el, "v8:Type"):
|
||||
types.append(format_single_type(inner_text(t), type_node_el))
|
||||
for t in find_all(type_node_el, "v8:TypeSet"):
|
||||
raw = inner_text(t)
|
||||
m = re.match(r'^cfg:DefinedType\.(.+)$', raw)
|
||||
if m:
|
||||
types.append(f"ОпределяемыйТип.{m.group(1)}")
|
||||
continue
|
||||
m = re.match(r'^cfg:Characteristic\.(.+)$', raw)
|
||||
if m:
|
||||
types.append(f"Характеристика.{m.group(1)}")
|
||||
continue
|
||||
types.append(raw)
|
||||
types.append(format_single_type_set(inner_text(t)))
|
||||
if len(types) == 0:
|
||||
return ""
|
||||
if len(types) == 1:
|
||||
|
||||
Reference in New Issue
Block a user