File: Options\OmniSharpSolutionAnalyzerConfigOptionsUpdater.cs
Web Access
Project: src\src\Features\ExternalAccess\OmniSharp\Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.csproj (Microsoft.CodeAnalysis.ExternalAccess.OmniSharp)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.ImplementType;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.ExternalAccess.OmniSharp.Options;
 
using Workspace = CodeAnalysis.Workspace;
 
internal static class OmniSharpSolutionAnalyzerConfigOptionsUpdater
{
    internal static bool UpdateOptions(Workspace workspace, OmniSharpEditorConfigOptions editorConfigOptions)
    {
        try
        {
            var oldSolution = workspace.CurrentSolution;
            var oldFallbackOptions = oldSolution.FallbackAnalyzerOptions;
            oldFallbackOptions.TryGetValue(LanguageNames.CSharp, out var csharpFallbackOptions);
 
            var builder = ImmutableDictionary.CreateBuilder<string, string>(AnalyzerConfigOptions.KeyComparer);
            if (csharpFallbackOptions is not null)
            {
                // copy existing option values:
                foreach (var oldKey in csharpFallbackOptions.Keys)
                {
                    if (csharpFallbackOptions.TryGetValue(oldKey, out var oldValue))
                    {
                        builder.Add(oldKey, oldValue);
                    }
                }
            }
 
            // add o# option values:
            var lineFormattingOptions = editorConfigOptions.LineFormattingOptions;
            AddOption(FormattingOptions2.UseTabs, lineFormattingOptions.UseTabs);
            AddOption(FormattingOptions2.TabSize, lineFormattingOptions.TabSize);
            AddOption(FormattingOptions2.IndentationSize, lineFormattingOptions.IndentationSize);
            AddOption(FormattingOptions2.NewLine, lineFormattingOptions.NewLine);
 
            var implementTypeOptions = editorConfigOptions.ImplementTypeOptions;
            AddOption(ImplementTypeOptionsStorage.InsertionBehavior, (ImplementTypeInsertionBehavior)implementTypeOptions.InsertionBehavior);
            AddOption(ImplementTypeOptionsStorage.PropertyGenerationBehavior, (ImplementTypePropertyGenerationBehavior)implementTypeOptions.PropertyGenerationBehavior);
 
            var newFallbackOptions = oldFallbackOptions.SetItem(
                LanguageNames.CSharp,
                StructuredAnalyzerConfigOptions.Create(new DictionaryAnalyzerConfigOptions(builder.ToImmutable())));
 
            var newSolution = oldSolution.WithFallbackAnalyzerOptions(newFallbackOptions);
            return workspace.TryApplyChanges(newSolution);
 
            void AddOption<T>(
                PerLanguageOption2<T> option,
                T value)
            {
                var configName = option.Definition.ConfigName;
                var configValue = option.Definition.Serializer.Serialize(value);
                builder[configName] = configValue;
            }
        }
        catch (Exception e) when (FatalError.ReportAndPropagate(e, ErrorSeverity.Diagnostic))
        {
            throw ExceptionUtilities.Unreachable();
        }
    }
}