refactor(ui/scripts): cache diagnostics + semantic forbidden-API check
Two pre-flagged follow-ups from the Monaco integration: 1. IMemoryCache for diagnostics keyed by SHA256 of the script body. Same-code Diagnose() now short-circuits the Roslyn compile and forbidden-API walk. SizeLimit 200 entries with 5-minute sliding expiration. Completions aren't cached — position + form context vary too much for a useful hit rate. 2. Forbidden-API analyzer now resolves identifiers through the SemanticModel instead of matching names. A user identifier named File / Thread / Process / etc. no longer false-positives — only references that resolve to a NamedTypeSymbol whose containing namespace is on the banned list are flagged. The diagnostic message now names the offending namespace, e.g. "Type 'File' from forbidden namespace 'System.IO' is not allowed in scripts." Refactor: extracted ISharedScriptCatalog so ScriptAnalysisService can be unit-tested without standing up SharedScriptService's EF chain. Concrete SharedScriptCatalog wraps the existing service. 16 new xUnit tests in ScriptAnalysisServiceTests: - Empty / clean / missing-semicolon paths - SCADA001 on each banned using namespace (theory) - SCADA002 on real File.ReadAllText through System.IO - No-false-positive checks for user-defined File / Thread locals - Cache returns the same response instance on repeat - Different code → different cache entries - String-literal completions for Parameters / CallScript / CallShared - General completion at file scope returns ScriptHost members Total CentralUI test count: 113 -> 129.
This commit is contained in:
@@ -24,7 +24,9 @@ public static class ServiceCollectionExtensions
|
||||
services.AddScoped<IDialogService, DialogService>();
|
||||
|
||||
// Roslyn-backed C# analysis for the Monaco script editor.
|
||||
// Scoped because SharedScriptService (a dependency) is scoped.
|
||||
// Scoped because SharedScriptCatalog wraps a scoped service.
|
||||
services.AddMemoryCache(o => o.SizeLimit = 200);
|
||||
services.AddScoped<ISharedScriptCatalog, SharedScriptCatalog>();
|
||||
services.AddScoped<ScriptAnalysisService>();
|
||||
|
||||
return services;
|
||||
|
||||
Reference in New Issue
Block a user