0b24b4537d
Phases 3+4 of the script-scope rollout. Wires the runtime accessors
landed in efba01d through to Monaco completion, diagnostics, and
hover.
New analyzer surface in ScriptAnalysisService:
String-literal completion contexts (added to TryStringLiteralCompletions):
Attributes["..."] -> SelfAttributes
Children["..."] -> composition names
Children["X"].Attributes["..."] -> child template's attributes
Children["X"].CallScript("...") -> child template's scripts
Parent.Attributes["..."] -> parent template's attributes
Parent.CallScript("...") -> parent template's scripts
Diagnostics:
SCADA006 Attribute "Typo" is not declared on {this template,
child composition 'X', the parent}. (warning)
SCADA007 Composition "Unknown" is not declared on this template.
(warning)
CallShared / CallScript snippet-expansion now routes through the
child / parent shape catalogs when invoked on Children["X"] /
Parent — picking a child script accepts `Sample", ${1:count})`.
Contract additions:
- AttributeShape (Name, Type) record
- CompositionContext (Name, Attributes, Scripts) record
- SelfAttributes / Children / Parent fields on DiagnoseRequest,
CompletionsRequest, HoverRequest, SignatureHelpRequest
ScriptHost (analyzer-side globals) gains stub AttributeBag /
ChildrenBag / CompositionBag types so Roslyn doesn't emit CS0103 on
Attributes / Children / Parent. The stubs are never invoked — only
their signatures are read by the analyzer's compilation pass.
MonacoEditor.razor exposes SelfAttributes / Children / Parent
parameters; GetContext returns them; monaco-init.js forwards all
three on completion / hover / signature-help / diagnostics requests.
TemplateEdit fetches each composition's resolved child template
shape via GetTemplateWithChildrenAsync, and queries GetAllTemplatesAsync
for any single parent that composes the open template. Multi-parent
or no-parent → Parent is suppressed.
11 new xUnit tests on the new completion / diagnostic paths. Total:
149 -> 159.
Browser-verified via curl:
- Children["..."] suggests composition names
- Attributes["..."] suggests attributes with type detail
- Attributes["Typo"] squiggles SCADA006
- Children["Unknown"] squiggles SCADA007
- No spurious CS0103 on the new accessors
Hover, signature help, and inlay hints for the new accessors keep
working because they reuse the same dispatch logic.
54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
namespace ScadaLink.CentralUI.ScriptAnalysis;
|
|
|
|
/// <summary>
|
|
/// Globals type seen by user scripts during analysis. Mirrors the surface
|
|
/// the runtime exposes (see ScadaLink.SiteRuntime.Scripts.ScriptGlobals).
|
|
/// The methods and indexers here are never invoked — Roslyn only reads
|
|
/// their signatures to know what's in scope while compiling for diagnostics
|
|
/// and completions.
|
|
/// </summary>
|
|
public class ScriptHost
|
|
{
|
|
public IReadOnlyDictionary<string, object?> Parameters { get; init; } =
|
|
new Dictionary<string, object?>();
|
|
|
|
/// <summary>Invokes another shared script by name and returns its result.</summary>
|
|
public object? CallShared(string name, params object?[] args) => null;
|
|
|
|
/// <summary>Invokes another script on the same template and returns its result.</summary>
|
|
public object? CallScript(string name, params object?[] args) => null;
|
|
|
|
// Scope-aware accessors. SCADA-specific completion + diagnostics live in
|
|
// ScriptAnalysisService; these stubs exist so the bare Roslyn pass doesn't
|
|
// produce CS0103 errors on Attributes / Children / Parent.
|
|
|
|
public AttributeBag Attributes { get; } = new();
|
|
public ChildrenBag Children { get; } = new();
|
|
public CompositionBag? Parent { get; } = new();
|
|
|
|
public class AttributeBag
|
|
{
|
|
public object? this[string name]
|
|
{
|
|
get => null;
|
|
set { /* no-op for analyzer */ }
|
|
}
|
|
public System.Threading.Tasks.Task<object?> GetAsync(string name) =>
|
|
System.Threading.Tasks.Task.FromResult<object?>(null);
|
|
public System.Threading.Tasks.Task SetAsync(string name, object? value) =>
|
|
System.Threading.Tasks.Task.CompletedTask;
|
|
}
|
|
|
|
public class CompositionBag
|
|
{
|
|
public AttributeBag Attributes { get; } = new();
|
|
public System.Threading.Tasks.Task<object?> CallScript(string name, params object?[] args) =>
|
|
System.Threading.Tasks.Task.FromResult<object?>(null);
|
|
}
|
|
|
|
public class ChildrenBag
|
|
{
|
|
public CompositionBag this[string compositionName] => new();
|
|
}
|
|
}
|