private void HandleCodeActionsChanges(JToken pythonSection) { var refactoring = new Dictionary <string, object>(); var quickFix = new Dictionary <string, object>(); var refactoringToken = pythonSection["refactoring"]; var quickFixToken = pythonSection["quickfix"]; // +1 is for last "." after prefix AppendToMap(refactoringToken, refactoringToken?.Path.Length + 1 ?? 0, refactoring); AppendToMap(quickFixToken, quickFixToken?.Path.Length + 1 ?? 0, quickFix); var codeActionSettings = new CodeActionSettings(refactoring, quickFix); _server.HandleCodeActionsChange(codeActionSettings); void AppendToMap(JToken setting, int prefixLength, Dictionary <string, object> map) { if (setting == null || !setting.HasValues) { return; } foreach (var child in setting) { if (child is JValue value) { // there shouldn't be duplicates and prefix must exist. var path = child.Path; if (path.Length <= prefixLength) { // nothing to add continue; } // get rid of common "settings.python..." prefix map[path.Substring(prefixLength)] = value.Value; continue; } AppendToMap(child, prefixLength, map); } } }
public void HandleCodeActionsChange(CodeActionSettings settings) { _codeActionSettings = settings; }
public async Task <CodeAction[]> GetCodeActionsAsync(IDocumentAnalysis analysis, CodeActionSettings settings, Diagnostic[] diagnostics, CancellationToken cancellationToken) { var results = new List <CodeAction>(); foreach (var diagnostic in GetMatchingDiagnostics(analysis, diagnostics, cancellationToken)) { foreach (var codeActionProvider in _codeActionProviders) { cancellationToken.ThrowIfCancellationRequested(); if (codeActionProvider.FixableDiagnostics.Any(code => code == diagnostic.ErrorCode)) { results.AddRange(await codeActionProvider.GetCodeActionsAsync(analysis, settings, diagnostic, cancellationToken)); } } } return(results.ToArray()); }
public async Task <CodeAction[]> GetCodeActionsAsync(IDocumentAnalysis analysis, CodeActionSettings settings, Range range, CancellationToken cancellationToken) { var results = new List <CodeAction>(); foreach (var codeActionProvider in _codeActionProviders) { cancellationToken.ThrowIfCancellationRequested(); results.AddRange(await codeActionProvider.GetCodeActionsAsync(analysis, settings, range, cancellationToken)); } return(results.ToArray()); }