private void ProcessType(AssemblyLevelSettings assemblySettings, TypeDefinition type, AsyncIlHelper asyncIlHelper)
        {
            if (!type.HasMethods || type.IsCompilerGenerated() && type.IsIAsyncStateMachine())
            {
                return;
            }

            var typeSettings = new TypeLevelSettings(type, assemblySettings);

            foreach (var method in type.Methods)
            {
                var methodSettings = new MethodLevelSettings(method, typeSettings);
                var configureAwait = methodSettings.GetConfigureAwait();
                if (configureAwait == null)
                {
                    continue;
                }

                var asyncStateMachineType = method.GetAsyncStateMachineType();
                if (asyncStateMachineType == null)
                {
                    if (methodSettings.MethodConfigureAwait.HasValue)
                    {
                        LogWarning($"ConfigureAwaitAttribue applied to non-async method '{method.FullName}'.");
                    }
                    continue;
                }

                asyncIlHelper.AddAwaitConfigToAsyncMethod(asyncStateMachineType, configureAwait.Value);
            }
        }
        public void Execute()
        {
            var assemblyLevelSettings = new AssemblyLevelSettings(ModuleDefinition.Assembly);

            if (assemblyLevelSettings.AssemblyConfigureAwait.HasValue)
            {
                LogInfo(
                    $"Detected assembly wide configuration (ConfigureAwait({assemblyLevelSettings.AssemblyConfigureAwait.Value}))");
            }

            var types = ModuleDefinition.GetTypes().ToList();

            var typeProvider          = new TypeProvider(AssemblyResolver);
            var typeReferenceProvider = new TypeReferenceProvider(ModuleDefinition, typeProvider);

            var asyncIlHelper = new AsyncIlHelper(typeProvider, typeReferenceProvider, ModuleDefinition);
            var stopwach      = Stopwatch.StartNew();

            foreach (var typeDefinition in types)
            {
                ProcessType(assemblyLevelSettings, typeDefinition, asyncIlHelper);
            }

            LogInfo($"Needed {stopwach.ElapsedMilliseconds} ms to process {types.Count} types");
            RemoveReference();
        }