diff --git a/src/Analysis/Engine/Test/LanguageServerTests.cs b/src/Analysis/Engine/Test/LanguageServerTests.cs index d569b31eb..86922f0f4 100644 --- a/src/Analysis/Engine/Test/LanguageServerTests.cs +++ b/src/Analysis/Engine/Test/LanguageServerTests.cs @@ -28,6 +28,7 @@ using Microsoft.Python.Tests.Utilities.FluentAssertions; using Microsoft.PythonTools; using Microsoft.PythonTools.Analysis; +using Microsoft.PythonTools.Analysis.Analyzer; using Microsoft.PythonTools.Analysis.FluentAssertions; using Microsoft.PythonTools.Analysis.Infrastructure; using Microsoft.PythonTools.Interpreter; @@ -340,6 +341,28 @@ public async Task ParseAndAnalysisDiagnostics() { ); } + [TestMethod, Priority(0)] + public async Task DiagnosticsSettingChange() { + var diags = new Dictionary(); + + using (var s = await CreateServer((Uri)null, null, diags)) { + var u = await s.OpenDefaultDocumentAndGetUriAsync("import foo\nx = y"); + + await s.WaitForCompleteAnalysisAsync(CancellationToken.None); + GetDiagnostics(diags, u).Should().OnlyContain( + "Warning;Unable to resolve 'foo'. IntelliSense may be missing for this module.;Python (analysis);0;7;10", + "Warning;unknown variable 'y';Python (analysis);1;4;5" + ); + + var newSettings = new ServerSettings(); + newSettings.analysis.SetErrorSeverityOptions(Array.Empty(), Array.Empty(), Array.Empty(), new[] { ErrorMessages.UsedBeforeAssignmentCode, ErrorMessages.UnresolvedImportCode }); + await s.SendDidChangeConfiguration(newSettings); + + await s.WaitForCompleteAnalysisAsync(CancellationToken.None); + GetDiagnostics(diags, u).Where(st => !st.StartsWith($"{DiagnosticSeverity.Unspecified}")).Should().BeEmpty(); + } + } + [TestMethod, Priority(0)] public async Task OnTypeFormattingLine() { using (var s = await CreateServer()) { diff --git a/src/LanguageServer/Impl/Definitions/ServerSettings.cs b/src/LanguageServer/Impl/Definitions/ServerSettings.cs index 463331da5..982446351 100644 --- a/src/LanguageServer/Impl/Definitions/ServerSettings.cs +++ b/src/LanguageServer/Impl/Definitions/ServerSettings.cs @@ -27,10 +27,10 @@ public class PythonAnalysisOptions { public int symbolsHierarchyDepthLimit = 10; public int symbolsHierarchyMaxSymbols = 1000; - public string[] errors { get; } = Array.Empty(); - public string[] warnings { get; } = Array.Empty(); - public string[] information { get; } = Array.Empty(); - public string[] disabled { get; } = Array.Empty(); + public string[] errors { get; private set; } = Array.Empty(); + public string[] warnings { get; private set; } = Array.Empty(); + public string[] information { get; private set; } = Array.Empty(); + public string[] disabled { get; private set; } = Array.Empty(); public DiagnosticSeverity GetEffectiveSeverity(string code, DiagnosticSeverity defaultSeverity) => _map.TryGetValue(code, out var severity) ? severity : defaultSeverity; @@ -50,6 +50,11 @@ public void SetErrorSeverityOptions(string[] errors, string[] warnings, string[] foreach (var x in disabled) { _map[x] = DiagnosticSeverity.Unspecified; } + + this.errors = errors; + this.warnings = warnings; + this.information = information; + this.disabled = disabled; } } public readonly PythonAnalysisOptions analysis = new PythonAnalysisOptions(); diff --git a/src/LanguageServer/Impl/Implementation/Server.cs b/src/LanguageServer/Impl/Implementation/Server.cs index 9f398d473..a030ea360 100644 --- a/src/LanguageServer/Impl/Implementation/Server.cs +++ b/src/LanguageServer/Impl/Implementation/Server.cs @@ -378,7 +378,7 @@ private async Task DoInitializeAsync(InitializeParams @params, CancellationToken _traceLogging = @params.initializationOptions.traceLogging; _analysisUpdates = @params.initializationOptions.analysisUpdates; - Analyzer.EnableDiagnostics = _clientCaps?.python?.liveLinting ?? false; + Analyzer.EnableDiagnostics = _clientCaps?.python?.liveLinting ?? true; _reloadModulesQueueItem = new ReloadModulesQueueItem(this); if (@params.initializationOptions.displayOptions != null) { diff --git a/src/LanguageServer/Impl/LanguageServer.cs b/src/LanguageServer/Impl/LanguageServer.cs index ff0a46f80..a7c3f029e 100644 --- a/src/LanguageServer/Impl/LanguageServer.cs +++ b/src/LanguageServer/Impl/LanguageServer.cs @@ -421,7 +421,7 @@ private void PublishPendingDiagnostics() { foreach (var kvp in list) { var parameters = new PublishDiagnosticsParams { uri = kvp.Key, - diagnostics = kvp.Value + diagnostics = kvp.Value.Where(d => d.severity != DiagnosticSeverity.Unspecified).ToArray() }; _rpc.NotifyWithParameterObjectAsync("textDocument/publishDiagnostics", parameters).DoNotWait(); }