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);
                }
            }
        }
예제 #2
0
 public void HandleCodeActionsChange(CodeActionSettings settings)
 {
     _codeActionSettings = settings;
 }
예제 #3
0
        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());
        }