Created
May 29, 2017 13:26
-
-
Save Wolfsblvt/ba3e95db46358f763a13d85bb1cd4711 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Composition; | |
using System.Threading; | |
using System.Threading.Tasks; | |
using EnvDTE; | |
using EnvDTE80; | |
using Microsoft.CodeAnalysis; | |
using Microsoft.CodeAnalysis.CodeActions; | |
using Microsoft.CodeAnalysis.CodeRefactorings; | |
using Microsoft.CodeAnalysis.CSharp; | |
using Microsoft.CodeAnalysis.CSharp.Syntax; | |
using Microsoft.VisualStudio.Shell; | |
using Document = Microsoft.CodeAnalysis.Document; | |
using Solution = Microsoft.CodeAnalysis.Solution; | |
using Task = System.Threading.Tasks.Task; | |
namespace TestsCreatorCommands | |
{ | |
[ExportCodeRefactoringProvider(RefactoringId, LanguageNames.CSharp)] | |
[Shared] | |
internal class TestsCreatorCommands : CodeRefactoringProvider | |
{ | |
public const string RefactoringId = "MyAction"; | |
public static readonly DTE2 DTE; | |
static TestsCreatorCommands() | |
{ | |
DTE = Package.GetGlobalService(typeof(DTE)) as DTE2; | |
} | |
public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) | |
{ | |
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(continueOnCapturedContext: false); | |
var node = root.FindNode(context.Span); | |
var dec = node as MethodDeclarationSyntax; | |
if (dec == null) | |
return; | |
context.RegisterRefactoring(CodeAction.Create("MyAction", c => DoMyAction(context.Document, dec, c))); | |
} | |
private static async Task<Solution> DoMyAction(Document document, MethodDeclarationSyntax method, CancellationToken cancellationToken) | |
{ | |
var syntaxTree = await document.GetSyntaxTreeAsync(cancellationToken); | |
var root = await syntaxTree.GetRootAsync(cancellationToken); | |
// some - for the question irrelevant changes, like: | |
document = document.WithSyntaxRoot(root.ReplaceNode(method, method.WithIdentifier(SyntaxFactory.ParseToken(method.Identifier.Text + "Suffix")))); | |
// now the DTE magic | |
var preview = false; // TODO: How to check if I am in preview here? | |
if (!preview) | |
{ | |
var requestedItem = DTE.Solution.FindProjectItem(document.FilePath); | |
var window = requestedItem.Open(Constants.vsViewKindCode); | |
window.Activate(); | |
var position = method.Identifier.GetLocation().GetLineSpan().EndLinePosition; | |
var textSelection = (TextSelection) window.Document.Selection; | |
textSelection.MoveTo(position.Line, position.Character); | |
} | |
return document.Project.Solution; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment