public RunCodeIssuesResponse FixCodeIssue(Request req) { var issues = GetContextualCodeActions(req).ToList(); var issue = issues.FirstOrDefault(i => i.Start.Line == req.Line); if (issue == null) { return new RunCodeIssuesResponse { Text = req.Buffer } } ; var context = OmniSharpRefactoringContext.GetContext(_bufferParser, req); using (var script = new OmniSharpScript(context, _config)) { var action = issue.Actions.FirstOrDefault(); if (action != null) { action.Run(script); return(new RunCodeIssuesResponse { Text = context.Document.Text }); } } return(new RunCodeIssuesResponse { Text = req.Buffer }); }
/// <summary> /// Inserts the given EntityDeclaration with the given /// script at the end of the type declaration under the /// cursor (e.g. class / struct). /// </summary> /// <remarks> /// Alters the given script. Returns its CurrentDocument /// property. Alters the given memberDeclaration, adding /// Modifiers.Override to its Modifiers as well as removing /// Modifiers.Virtual. /// </remarks> IDocument runOverrideTargetWorker (Request request , OmniSharpRefactoringContext refactoringContext , ParsedResult parsedContent , EntityDeclaration memberDeclaration , OmniSharpScript script) { // Add override flag memberDeclaration.Modifiers |= Modifiers.Override; // Remove virtual flag memberDeclaration.Modifiers &= ~Modifiers.Virtual; // Remove abstract flag memberDeclaration.Modifiers &= ~Modifiers.Abstract; // The current type declaration, e.g. class, struct.. var typeDeclaration = parsedContent.SyntaxTree.GetNodeAt (refactoringContext.Location , n => n.NodeType == NodeType.TypeDeclaration); // Even empty classes have nodes, so this works var lastNode = typeDeclaration.Children.Last(); script.InsertBefore (node: lastNode , newNode: memberDeclaration); script.FormatText(memberDeclaration); return(script.CurrentDocument); }
string AddUsingLinq(AstNode astNode, string buffer) { var request = CreateRequest(buffer, astNode); var context = OmniSharpRefactoringContext.GetContext(_bufferParser, request); var script = new OmniSharpScript(context, _config); UsingHelper.InsertUsingAndRemoveRedundantNamespaceUsage(context, script, "System.Linq"); return(context.Document.Text); }
public FixUsingsResponse FixUsings(Request request) { _fileName = request.FileName; string buffer = RemoveUsings(request.Buffer); buffer = SortUsings(buffer); buffer = AddLinqForQueryIfMissing(buffer); bool ambiguousResultsFound = false; bool usingsAdded = true; while (usingsAdded) { var content = _bufferParser.ParsedContent(buffer, _fileName); var tree = content.SyntaxTree; var resolver = new CSharpAstResolver(content.Compilation, content.SyntaxTree, content.UnresolvedFile); var unresolvedNodes = GetAllUnresolvedNodes(tree, resolver).Select(nr => GetNodeToAddUsing(nr)); usingsAdded = false; request.Buffer = buffer; var outerContext = OmniSharpRefactoringContext.GetContext(_bufferParser, request); using (var script = new OmniSharpScript(outerContext, _config)) { foreach (var unresolvedNode in unresolvedNodes) { _logger.Info(unresolvedNode); var requestForNode = CreateRequest(buffer, unresolvedNode); var innerContext = OmniSharpRefactoringContext.GetContext(_bufferParser, requestForNode); var addUsingAction = new AddUsingAction(); var actions = addUsingAction.GetActions(innerContext).Where(a => a.Description.StartsWith("using")).ToArray(); if (actions.Length == 1) { var a = actions[0]; _logger.Info("Adding " + a.Description); a.Run(script); usingsAdded = true; break; } ambiguousResultsFound |= actions.Length > 1; } } buffer = outerContext.Document.Text; } IEnumerable <QuickFix> ambiguous = Enumerable.Empty <QuickFix>(); if (ambiguousResultsFound) { ambiguous = GetAmbiguousNodes(buffer, request.FileName); } return(new FixUsingsResponse(buffer, ambiguous)); }
private IEnumerable <CodeAction> GetContextualCodeActions(Request req) { var refactoringContext = OmniSharpRefactoringContext.GetContext(_bufferParser, req); var actions = new List <CodeAction>(); var providers = new CodeActionProviders().GetProviders(); foreach (var provider in providers) { var providerActions = provider.GetActions(refactoringContext); actions.AddRange(providerActions); } return(actions); }
string RunActions(OmniSharpRefactoringContext context, IEnumerable <CodeAction> actions) { using (var script = new OmniSharpScript(context, _config)) { foreach (var action in actions) { if (action != null) { action.Run(script); } } } return(context.Document.Text); }
string SortUsings(string buffer) { var content = _bufferParser.ParsedContent(buffer, _fileName); var tree = content.SyntaxTree; var firstUsing = tree.Descendants.FirstOrDefault(IsUsingDeclaration); if (firstUsing != null) { var request = CreateRequest(buffer, firstUsing); var context = OmniSharpRefactoringContext.GetContext(_bufferParser, request); var actions = new SortUsingsAction().GetActions(context); buffer = RunActions(context, actions); } return(buffer); }
private IEnumerable <CodeIssue> GetContextualCodeActions(Request req) { var refactoringContext = OmniSharpRefactoringContext.GetContext(_bufferParser, req); var actions = new List <CodeIssue>(); var providers = new CodeIssueProviders().GetProviders(); foreach (var provider in providers) { try { var codeIssues = provider.GetIssues(refactoringContext); actions.AddRange(codeIssues.Where(ShouldIncludeIssue)); } catch (Exception) { } } return(actions); }
private IEnumerable <CodeIssue> GetContextualCodeActions(Request req) { var refactoringContext = OmniSharpRefactoringContext.GetContext(_bufferParser, req); var ignoredCodeIssues = ConfigurationLoader.Config.IgnoredCodeIssues; var actions = new List <CodeIssue>(); var providers = new CodeIssueProviders().GetProviders(); foreach (var provider in providers) { try { var codeIssues = provider.GetIssues(refactoringContext); actions.AddRange(codeIssues.Where(issue => !ignoredCodeIssues.Contains(issue.Description))); } catch (Exception) { } } return(actions); }
string RemoveUsings(string buffer) { var content = _bufferParser.ParsedContent(buffer, _fileName); var tree = content.SyntaxTree; var firstUsing = tree.Children.FirstOrDefault(IsUsingDeclaration); if (firstUsing != null) { var request = CreateRequest(buffer, firstUsing); var context = OmniSharpRefactoringContext.GetContext(_bufferParser, request); var redundantUsings = new RedundantUsingDirectiveIssue().GetIssues(context, null); if (redundantUsings.Any()) { var actions = redundantUsings.First().Actions; buffer = RunActions(context, actions); } } return(buffer); }
public RunCodeActionsResponse RunCodeAction(CodeActionRequest req) { var actions = GetContextualCodeActions(req).ToList(); if (req.CodeAction > actions.Count) { return(new RunCodeActionsResponse()); } var context = OmniSharpRefactoringContext.GetContext(_bufferParser, req); using (var script = new OmniSharpScript(context, _config)) { CodeAction action = actions[req.CodeAction]; action.Run(script); } return(new RunCodeActionsResponse { Text = context.Document.Text }); }
/// <summary> /// Takes an editing context. Inserts an override /// declaration of the chosen member in the context. Returns /// the new context. /// </summary> /// <remarks> /// The text editor cursor stays in the same line and column /// it originally was. /// </remarks> public RunOverrideTargetResponse RunOverrideTarget (RunOverrideTargetRequest request) { var overrideContext = new OverrideContext(request, _parser); var refactoringContext = OmniSharpRefactoringContext.GetContext (overrideContext.BufferParser, request); var memberToOverride = overrideContext.GetOverridableMembers() .First(ot => { var memberSignature = GetOverrideTargetsResponse.GetOverrideTargetName (ot, overrideContext.CompletionContext.ResolveContext); return(memberSignature == request.OverrideTargetName); }); var builder = new TypeSystemAstBuilder (new CSharpResolver (overrideContext.CompletionContext.ResolveContext)) // Will generate a "throw new // NotImplementedException();" statement in the // bodies { GenerateBody = true }; var newEditorContents = runOverrideTargetWorker (request , refactoringContext , overrideContext.CompletionContext.ParsedContent , script: new OmniSharpScript(refactoringContext, _config) , memberDeclaration: builder.ConvertEntity(memberToOverride)); return(new RunOverrideTargetResponse (fileName: request.FileName , buffer: newEditorContents.Text , line: request.Line , column: request.Column)); }
public RenameResponse Rename(RenameRequest req) { var project = _solution.ProjectContainingFile(req.FileName); var syntaxTree = project.CreateParser().Parse(req.Buffer, req.FileName); var sourceNode = syntaxTree.GetNodeAt(req.Line, req.Column); if (sourceNode == null) { return(new RenameResponse()); } IEnumerable <AstNode> nodes = _findUsagesHandler.FindUsageNodes(req).ToArray(); var response = new RenameResponse(); var modfiedFiles = new List <ModifiedFileResponse>(); response.Changes = modfiedFiles; foreach (IGrouping <string, AstNode> groupedNodes in nodes.GroupBy(n => n.GetRegion().FileName.LowerCaseDriveLetter())) { string fileName = groupedNodes.Key; OmniSharpRefactoringContext context; if (groupedNodes.Key != req.FileName) { var file = _solution.GetFile(fileName); var bufferParser = new BufferParser(_solution); var content = bufferParser.ParsedContent(file.Document.Text, file.FileName); var resolver = new CSharpAstResolver(content.Compilation, content.SyntaxTree, content.UnresolvedFile); context = new OmniSharpRefactoringContext(file.Document, resolver); } else { context = OmniSharpRefactoringContext.GetContext(_bufferParser, req); } string modifiedBuffer = null; var lastToFirstNodes = groupedNodes.OrderByDescending(n => n.EndLocation.Line) .ThenByDescending(n => n.EndLocation.Column); foreach (var node in lastToFirstNodes) { using (var script = new OmniSharpScript(context, _config)) { script.Rename(node, req.RenameTo); modifiedBuffer = script.CurrentDocument.Text; } } if (modifiedBuffer != null) { var modifiedFile = new ModifiedFileResponse { FileName = fileName, Buffer = modifiedBuffer }; modfiedFiles.Add(modifiedFile); response.Changes = modfiedFiles; _bufferParser.ParsedContent(modifiedBuffer, fileName); _solution.ProjectContainingFile(fileName).UpdateFile(fileName, modifiedBuffer); } } return(response); }