Exemple #1
0
        private async Task <int> Execute()
        {
            if (!TryValidateProjectPath(Project, out var projectPath))
            {
                return(1);
            }

            if (Plugins.Values.Count == 0)
            {
                ShowHelp();
                return(1);
            }

            var analysisContext = Analysis.CreateContext();
            var compilation     = await GetCompilationAsync(projectPath);

            analysisContext.SetData <CSharpCompilation>(compilation);

            var operations = new List <Operation>();

            for (var i = 0; i < Plugins.Values.Count; i++)
            {
                var name = Plugins.Values[i];

                Out.WriteLine($"Processing '{name}'...");

                if (!KnownPlugins.Plugins.TryGetValue(name, out var plugin))
                {
                    Out.WriteLine($"Unknown plugin '{name}'");
                    return(1);
                }

                operations.AddRange(await plugin.GetOperationsAsync(analysisContext));
            }

            Out.WriteLine("Resolved operations:");
            for (var i = 0; i < operations.Count; i++)
            {
                Out.WriteLine($"\t{operations[i]}");
            }
            Out.WriteLine();

            if (!DryRun.HasValue())
            {
                var editorContext = new EditorContext();
                editorContext.SetData <CSharpCompilation>(await analysisContext.GetDataAsync <CSharpCompilation>().ConfigureAwait(false));
                var editor = Editor.Create();

                Out.WriteLine("Performing operations:");
                for (var i = 0; i < operations.Count; i++)
                {
                    Out.WriteLine($"\t{operations[i]}");
                    await editor.ApplyAsync(editorContext, operations[i]);
                }
            }
            Out.WriteLine();

            return(0);
        }
        public override async Task ApplyAsync(EditorContext context, Operation operation, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (operation == null)
            {
                throw new ArgumentNullException(nameof(operation));
            }

            if (operation is MiddlewareDependencySet.AddOperation add)
            {
                var compilation = context.GetData <CSharpCompilation>();
                var syntaxTree  = FindCorrespondingSyntaxTree(compilation, add.ConfigureMethod.SyntaxTree);

                var root = await syntaxTree.GetRootAsync().ConfigureAwait(false);

                var configureMethod = root.GetCurrentNode(add.ConfigureMethod);
                var edited          = syntaxTree.WithRootAndOptions(
                    root.ReplaceNode(
                        configureMethod,
                        configureMethod.AddBodyStatements(
                            ExpressionStatement(
                                InvocationExpression(
                                    MemberAccessExpression(
                                        SyntaxKind.SimpleMemberAccessExpression,
                                        IdentifierName("app"),
                                        IdentifierName("UseMvc")))))),
                    syntaxTree.Options);

                File.WriteAllText(edited.FilePath, edited.GetRoot().NormalizeWhitespace().ToString());

                compilation = compilation.ReplaceSyntaxTree(syntaxTree, edited);
                context.SetData <CSharpCompilation>(compilation);
            }
        }