Расширение синтаксиса С# с roslyn

Я пытаюсь реализовать "return if" / "return value if" без случая else, так как я хочу только вернуть или вернуть значение, если условие действительно.

Я знаю, что есть if (condition) return; или if (condition) return value;, но я хочу, чтобы код был немного чистым, и было бы неплохо иметь этот синтаксис, поскольку он более читабельен.

Я слышал с roslyn, это возможно и прочитал вопрос с его ответами здесь: Есть ли способ реализовать пользовательские языковые функции на С#?, но у меня нет подсказки как его реализовать.

Итак, код будет примерно таким:

public class Testclass
{
    public static void Main(String[] args)
    {
        Testclass t = new Testclass();
        t.TestMyClassWithVoid();
        bool success = t.TestMyClassWithInt(3) == 3;
        bool fail = t.TestMyClassWithInt(2) == 2;
    }

    public void TestMyClassWithVoid()
    {
        int value = GetValueFromSomeWhere();
        return if value == 3;

        DoSomeOtherStuffSinceValueIsNotThree();
    }

    public int TestMyClassWithInt(int value)
    {
        return value if value == 3;

        DoSomeOtherStuffSinceValueIsNotThree();
        return -1;
    }
}

любая идея, как я мог это решить? Я начал пробовать с Roslyn.Compilers.CSharp -namespace, но я не знаю, как начать реализацию.

Ответы

Ответ 1

Если вы можете создать правильный IL для этого, это должно быть работой. Поскольку это не новая функция CLR, вам не нужно ничего делать с ядром dot net, просто Roslyn.

Для этого у вас есть два варианта:

Один из них - оставить Roslyn как есть и переписать новый синтаксис на соответствующий синтаксис С#, а затем скомпилировать как обычный.

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

Ответ 2

Вот альтернативное предложение, которое может работать для тех, кто ищет точки расширения в roslyn. Он может быть даже представлен как пакет nuget! Создайте анализатор и поставщик исправления кода для вашего синтаксиса.

По сути, вы получите красную строку squiggly под любым синтаксисом по вашему выбору, с подсказкой авто-фиксации, которая позволит вам преобразовать его в обычный эквивалент С#.

Он также может использоваться для проверки использования вашей библиотеки, проверки правильности атрибутов в правильных местах, обнаружения общих запахов кода и т.д.

Читайте больше на анализаторах кода на этом посту: https://msdn.microsoft.com/en-us/magazine/dn879356.aspx

Краткое резюме этой ссылки (но отнюдь не замена):

  • Установить VS SDK, SDK Roslyn, SDK компилятора.
  • Создайте новый проект: Analyzer с шаблоном Code Fix (NuGet + VSIX).
  • Будет создано 3 примера создания поставщика анализатора/кода.
  • Задайте проект VSIX как проект запуска и запустите