Как определить имена и значения по умолчанию для параметров форматирования, предоставляемых расширением C # / OmniSharp для кода Visual Studio? - PullRequest
0 голосов
/ 09 февраля 2020

Я создаю omnisharp.json файл для установки моих настроек форматирования C#. Как узнать, какие свойства доступны для установки и каковы их значения по умолчанию?

Конечно, должен существовать либо точный, актуальный источник этой информации, либо способ, которым я могу определить ее самостоятельно , верно?

1 Ответ

0 голосов
/ 09 февраля 2020

Свойство FormattingOptions omnisharp.json сопоставлено с экземпляром класса OmniSharp.Options.FormattingOptions . Теперь вы можете взять этот исходный код и выполнить некоторые текстовые манипуляции с ним ...

  • ... чтобы преобразовать инициализации свойств в конструкторе в JSON (например, NewLine = "\n";"NewLine": "\n",), но тогда вы не получите никаких свойств, которые не были явно инициализированы.
  • ... для преобразования определений свойств в JSON (например, public string NewLine { get; set; }"NewLine": "",), но тогда вы не получите значения по умолчанию.

... но я думаю, что лучший способ - просто создать экземпляр этого класса самостоятельно и проверить его свойства. Это можно легко сделать с помощью PowerShell (Core) .

Первое, что вам нужно сделать, это определить путь к сборке OmniSharp.Shared.dll, содержащей класс OmniSharp.Options.FormattingOptions. Начиная с вашего каталога установки расширений (%UserProfile%\.vscode\extensions в Windows; ~/.vscode/extensions в Mac / Linux), вы найдете его здесь ...

  • .vscode
    • extensions
      • ms-vscode
        • csharp-{major}.{minor}.{patch}
          • .omnisharp
            • {major}.{minor}.{patch}
              • OmniSharp.Shared.dll

У меня v1.21.11 расширения ms-vscode.csharp, установленного на Windows, поэтому мой путь к этой сборке C:\Users\UserName\.vscode\extensions\ms-vscode.csharp-1.21.11\.omnisharp\1.34.11\OmniSharp.Shared.dll.

В сеансе PowerShell передайте этот путь команде, чтобы загрузить сборку. ..

PS> Add-Type -Path 'C:\Users\UserName\.vscode\extensions\ms-vscode.csharp-1.21.11\.omnisharp\1.34.11\OmniSharp.Shared.dll'

В случае успеха не выдаст выходных данных. Тогда вам просто нужно создать экземпляр FormattingOptions, из которого имена свойств и значения по умолчанию будут отображаться на консоли ...

PS> New-Object -TypeName 'OmniSharp.Options.FormattingOptions'

OrganizeImports                                      : False
EnableEditorConfigSupport                            : False
NewLine                                              :

UseTabs                                              : False
TabSize                                              : 4
[snip]

Вы даже можете создать соответствующий JSON для Вы ...

PS> [PSCustomObject] @{ FormattingOptions = New-Object -TypeName 'OmniSharp.Options.FormattingOptions' } | ConvertTo-Json
{
  "FormattingOptions": {
    "OrganizeImports": false,
    "EnableEditorConfigSupport": false,
    "NewLine": "\n",
    "UseTabs": false,
    "TabSize": 4,
    [snip]
  }
}

... или записываете его непосредственно в файл по умолчанию omnisharp.json в текущем каталоге ...

PS> [PSCustomObject] @{ FormattingOptions = New-Object -TypeName 'OmniSharp.Options.FormattingOptions' } | ConvertTo-Json | Set-Content -Path 'omnisharp.json'

Если PowerShell вам не подходит мог всегда создавать и отражать свойства экземпляра FormattingOptions в такой маленькой программе, как эта ...

using System;
using System.Linq;
using System.Reflection;

namespace SO60131765
{
    class Program
    {
        const string FormattingOptionsQualifiedTypeName = "OmniSharp.Options.FormattingOptions";

        static int Main(string[] args)
        {
            try
            {
                if (args == null || !args.Any() || string.IsNullOrEmpty(args[0]))
                    throw new Exception($"The path to the assembly containing the {FormattingOptionsQualifiedTypeName} is required.");
                else
                {
                    object formattingOptions = CreateFormattingOptionsFromAssembly(args[0]);

                    WriteHeader();
                    WriteProperties(formattingOptions);

                    return 0;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"ERROR: {ex.Message}");

                return 1;
            }
        }

        static object CreateFormattingOptionsFromAssembly(string assemblyPath)
        {
            Assembly assembly;
            try
            {
                assembly = Assembly.LoadFrom(assemblyPath);
            }
            catch (Exception ex)
            {
                throw new Exception($"Assembly load failed with message \"{ex.Message}\".", ex);
            }

            object formattingOptions;
            try
            {
                formattingOptions = assembly.CreateInstance(FormattingOptionsQualifiedTypeName);
            }
            catch (Exception ex)
            {
                throw new Exception($"Instantiating type {FormattingOptionsQualifiedTypeName} failed with message \"{ex.Message}\".");
            }

            if (formattingOptions == null)
                throw new Exception($"A public type {FormattingOptionsQualifiedTypeName} was not found in the specified assembly.");

            return formattingOptions;
        }

        static void WriteHeader()
        {
            string headerText = $"Public instance properties of type {FormattingOptionsQualifiedTypeName}";

            Console.WriteLine(headerText);
            Console.WriteLine(new string('=', headerText.Length));
        }

        static void WriteProperties(object formattingOptions)
        {
            PropertyInfo[] properties = formattingOptions.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
            int longestPropertyNameLength = properties.Max(property => property.Name.Length);
            string format = $"{{0,{longestPropertyNameLength}}}: {{1}}";

            foreach (PropertyInfo property in properties)
            {
                object propertyValue = property.GetValue(formattingOptions);
                string propertyValueText = propertyValue == null
                    ? "<null>"
                    : propertyValue is string
                    ? $"\"{propertyValue}\""
                    : propertyValue.ToString();

                Console.WriteLine(format, property.Name, propertyValueText);
            }
        }
    }
}

..., а затем выполнять его с путем к сборке OmniSharp.Shared.dll. .

> SO60131765.exe "C:\Users\UserName\.vscode\extensions\ms-vscode.csharp-1.21.11\.omnisharp\1.34.11\OmniSharp.Shared.dll"
Public instance properties of type OmniSharp.Options.FormattingOptions
======================================================================
                                     OrganizeImports: False
                           EnableEditorConfigSupport: False
                                             NewLine: "
"
                                             UseTabs: False
                                             TabSize: 4
                                               [snip]

Вышеупомянутая методика, вероятно, будет работать для других редакторов, использующих расширение на основе OmniSharp ; просто нужно найти, где хранится OmniSharp.Shared.dll. Обратите внимание, что я не предоставляю полный текст по умолчанию omnisharp.json, так что это не станет еще одним устаревшим источником для конфигурации копирования и вставки. Идея состоит в том, чтобы динамически запрашивать значения для вашей установленной версии OmniSharp.

...