public static async Task <ImmutableArray <TextChange> > GetFormattingChangesAsync(
            Document document,
            char typedChar,
            int position,
            DocumentOptionSet documentOptions,
            CancellationToken cancellationToken)
        {
            Contract.ThrowIfFalse(document.Project.Language is LanguageNames.CSharp);
            var formattingService = document.GetRequiredLanguageService <ISyntaxFormattingService>();

            if (!await formattingService.ShouldFormatOnTypedCharacterAsync(document, typedChar, position, cancellationToken).ConfigureAwait(false))
            {
                return(ImmutableArray <TextChange> .Empty);
            }

            var languageServices = document.Project.LanguageServices;

            var services        = document.Project.Solution.Workspace.Services;
            var globalOptions   = services.GetRequiredService <ILegacyGlobalOptionsWorkspaceService>();
            var optionsProvider = (OptionsProvider <SyntaxFormattingOptions>)globalOptions.CleanCodeGenerationOptionsProvider;
            var fallbackOptions = await optionsProvider.GetOptionsAsync(languageServices, cancellationToken).ConfigureAwait(false);

            var optionService = services.GetRequiredService <IOptionService>();
            var configOptions = documentOptions.AsAnalyzerConfigOptions(optionService, document.Project.Language);

            var indentationOptions = new IndentationOptions(formattingService.GetFormattingOptions(configOptions, fallbackOptions))
            {
                AutoFormattingOptions = globalOptions.GetAutoFormattingOptions(languageServices)
            };

            return(await formattingService.GetFormattingChangesOnTypedCharacterAsync(document, position, indentationOptions, cancellationToken).ConfigureAwait(false));
        }