private static void RegisterInternalPlugins(IFluentProjectConfiguration configuration)
        {
            configuration.RegisterPlugin(new DefaultAsyncCounterpartsFinder());
            configuration.RegisterPlugin(new ThreadSleepAsyncCounterpartFinder());
            configuration.RegisterPlugin(new ParallelForForEachTransformer());
            configuration.RegisterPlugin(new DefaultPreconditionChecker());

            // Document transformers
            configuration.RegisterPlugin(new RestoreNullableTransformer());

            // Type transformers
            configuration.RegisterPlugin(new DocumentCommentTypeTransformer());
            configuration.RegisterPlugin(new DisabledTextTypeTransformer());

            // Method transformers
            configuration.RegisterPlugin(new YieldMethodTransformer());
            configuration.RegisterPlugin(new OperationCanceledExceptionFunctionTransformer());
            configuration.RegisterPlugin(new ReturnTaskFunctionTransformer());
            configuration.RegisterPlugin(new InModifierRemovalTransformer());
            configuration.RegisterPlugin(new ObsoleteMissingMethodTransformer());

            configuration.RegisterPlugin(new AsyncLockMethodTransformer());
            configuration.RegisterPlugin(new CancellationTokenMethodTransformer());
            configuration.RegisterPlugin(new SplitTailMethodTransformer());
            configuration.RegisterPlugin(new DocumentationCommentMethodTransformer());
        }
        public virtual void Configure(AsyncGenerator configuration, Project project, IFluentProjectConfiguration projectConfiguration, Assembly assembly)
        {
            if (project.ApplyChanges.HasValue)
            {
                projectConfiguration.ApplyChanges(project.ApplyChanges.Value);
            }
            if (project.ConcurrentRun.HasValue)
            {
                projectConfiguration.ConcurrentRun(project.ConcurrentRun.Value);
            }
            if (!string.IsNullOrEmpty(project.TargetFramework))
            {
                projectConfiguration.TargetFramework(project.TargetFramework);
            }

            foreach (var item in project.SuppressDiagnosticFailures)
            {
                projectConfiguration.SuppressDiagnosticFailures(item.Pattern);
            }

            projectConfiguration.ConfigureAnalyzation(o => Configure(configuration, project.Analyzation, o));
            projectConfiguration.ConfigureTransformation(o => Configure(configuration, project.Transformation, o));

            if (!project.RegisterPlugin.Any())
            {
                return;
            }
            var assemblies = AppDomain.CurrentDomain.GetAssemblies()
                             .Where(o => !o.IsDynamic)
                             .Distinct()
                             .GroupBy(o => o.GetName().Name)    // there may be multiple versions of the same assembly
                             .ToDictionary(o => o.Key, o => o.First());

            foreach (var plugin in project.RegisterPlugin)
            {
                if (!string.IsNullOrEmpty(plugin.AssemblyName) && !assemblies.ContainsKey(plugin.AssemblyName))
                {
                    assemblies[plugin.AssemblyName] = Assembly.Load(plugin.AssemblyName);
                }
                if (string.IsNullOrEmpty(plugin.AssemblyName) && assembly == null)
                {
                    throw new InvalidOperationException($"Assembly name must be provided for type {plugin.Type}.");
                }

                var type = string.IsNullOrEmpty(plugin.AssemblyName)
                                        ? assembly.GetExportedTypes().FirstOrDefault(o => o.Name == plugin.Type)
                                        : assemblies[plugin.AssemblyName].GetExportedTypes().FirstOrDefault(o => o.FullName == plugin.Type);
                if (type == null)
                {
                    throw new InvalidOperationException($"Type {plugin.Type} was not found inside assembly {plugin.AssemblyName}. Hint: Make sure that the type is public.");
                }
                var pluginInstance = Activator.CreateInstance(type) as IPlugin;
                if (pluginInstance == null)
                {
                    throw new InvalidOperationException($"Type {plugin.Type} from assembly {plugin.AssemblyName} does not implement IPlugin interaface");
                }
                projectConfiguration.RegisterPlugin(pluginInstance);
            }
        }
Esempio n. 3
0
            public virtual void Configure(Core.FileConfiguration.AsyncGenerator configuration, Project project, IFluentProjectConfiguration projectConfiguration,
                                          Assembly assembly)
            {
                _realConfigurator.Configure(configuration, project, projectConfiguration, assembly);

                if (!string.IsNullOrEmpty(_fileName))
                {
                    projectConfiguration.ConfigureAnalyzation(a => a
                                                              .DocumentSelection(o => string.Join("/", o.Folders) == _inputFolderPath && o.Name == _fileName + ".cs")
                                                              );
                }
                else
                {
                    projectConfiguration.ConfigureAnalyzation(a => a
                                                              .DocumentSelection(o => string.Join("/", o.Folders) == _inputFolderPath)
                                                              );
                }
                _configureProjectAction?.Invoke(projectConfiguration);
            }
 private static void RegisterPlugin(IFluentProjectConfiguration configuration, IPlugin plugin)
 {
     configuration.RegisterPlugin(plugin);
 }