dc0d7653b9
Replace the deleted equipment-base-prefix {{equip}} mechanism (impossible now
that equipment is reference-only) with per-reference resolution:
{{equip}}/<RefName> resolves through the owning equipment's UnsTagReference rows
(by effective name) to the backing raw tag's RawPath. Every unresolved <RefName>
is a clear deploy error + authoring rejection + Monaco diagnostic — preserving
"editor accepts <=> publish accepts".
Commons:
- EquipmentScriptPaths: delete DeriveEquipmentBase; SubstituteEquipmentToken now
takes the equipment's reference map (effectiveName -> RawPath) and substitutes
{{equip}}/<RefName> inside path literals (unresolved left intact, never throws);
add ExtractEquipReferenceNames (path-literal scoped) +
ExtractEquipReferenceNamesFromText (message templates). Slash syntax replaces
the v2 dot joint.
- New EquipmentReferenceMap: shared, input-shape-agnostic builder (entity + JSON
sides) over RawPathResolver — the single authority both compose seams + the
validator use, so resolved RawPaths agree byte-for-byte.
Compose seams (byte-parity kept):
- AddressSpaceComposer.Compose + DeploymentArtifact.ParseComposition both build
the per-equipment reference map from UnsTagReferences + Tags + raw topology and
substitute VirtualTag AND ScriptedAlarm-predicate sources before dependency
extraction (runtime dep refs = resolved RawPaths).
Deploy gate + authoring + editor:
- DraftValidator.ValidateEquipReferenceResolution: EquipReferenceUnresolved error
for unresolved {{equip}}/<RefName> in VirtualTag/ScriptedAlarm scripts + alarm
message-template tokens (naming script, equipment, missing ref).
- UnsTreeService.ValidateEquipTokenAsync (Wave-A M1): reference-relative authoring
rejection, replacing the stale DeriveEquipmentBase(empty)->reject-all logic.
- ScriptAnalysisService: {{equip}}/ completion offers the equipment's reference
effective names; DiagnoseAsync flags unresolved refs (OTSCRIPT_EQUIPREF) same as
the deploy gate. Requests carry optional EquipmentId (threaded MonacoEditor ->
monaco-init.js -> fetch bodies). IScriptTagCatalog.GetEquipmentRelativeLeavesAsync
repurposed to GetEquipmentReferenceNamesAsync(equipmentId, filter).
Tests: EquipmentScriptPaths substitution/extraction (slash pinned); composer<->
artifact reference-resolution byte-parity; DraftValidator unresolved-ref;
ScriptAnalysis completion+diagnostic; M1 authoring gate. Build clean (0/0); all
five affected suites green.
Claude-Session: https://claude.ai/code/session_01LVneM3eh1UtJxEisFXgmox
29 lines
1.6 KiB
C#
29 lines
1.6 KiB
C#
namespace ZB.MOM.WW.OtOpcUa.AdminUI.ScriptAnalysis;
|
|
|
|
// EquipmentId (optional) carries the owning-equipment context the {{equip}}/<RefName> completion +
|
|
// diagnostic need to resolve reference effective names. Null on the shared ScriptEdit page (no single
|
|
// equipment) — the equip-ref features are then inert, matching the deploy gate (which only resolves per
|
|
// owning equipment).
|
|
public record DiagnoseRequest(string Code, string? EquipmentId = null);
|
|
public record DiagnoseResponse(IReadOnlyList<DiagnosticMarker> Markers);
|
|
public record DiagnosticMarker(int Severity, int StartLineNumber, int StartColumn,
|
|
int EndLineNumber, int EndColumn, string Message, string Code);
|
|
|
|
public record CompletionsRequest(string CodeText, int Line, int Column, string? EquipmentId = null);
|
|
public record CompletionsResponse(IReadOnlyList<CompletionItem> Items);
|
|
public record CompletionItem(string Label, string InsertText, string Detail, string Kind, int InsertTextRules = 0);
|
|
|
|
public record HoverRequest(string CodeText, int Line, int Column, string? EquipmentId = null);
|
|
public record HoverResponse(string? Markdown);
|
|
|
|
public record SignatureHelpRequest(string CodeText, int Line, int Column);
|
|
public record SignatureHelpResponse(string? Label, IReadOnlyList<SignatureHelpParameter>? Parameters, int ActiveParameter);
|
|
public record SignatureHelpParameter(string Label, string? Documentation);
|
|
|
|
public record FormatRequest(string Code);
|
|
public record FormatResponse(string Code);
|
|
|
|
public record InlayHintsRequest(string Code);
|
|
public record InlayHintsResponse(IReadOnlyList<InlayHint> Hints);
|
|
public record InlayHint(int Line, int Column, string Label);
|