Как генерировать перегрузки оператора Roslyn - PullRequest
0 голосов
/ 26 мая 2018

Я хочу использовать генерацию кода Roslyn для генерации унарного оператора и нескольких бинарных операторов, но мне было интересно, как мне это сделать.

Допущения, Descriptor несет с собой такую ​​информацию, как базовыйTypeSyntax, для которого я объявляю операторы .

До сих пор я постулировал что-то одно, только эти строки:

MemberDeclarationSyntax GenerateUnaryOperatorOverload(string methodName, SyntaxKind kind)
{
    const string other = nameof(other);

    var otherSyntax = Parameter(Identifier(other))
            .WithType(Descriptor.Type)
        ;

    var statementSyntax = ParseStatement($"return {otherSyntax.Identifier.ValueText}?.{methodName}();");

    return OperatorDeclaration(Descriptor.Type, Token(kind))
            // Assuming I need to specify Public and Static as part of the overload...
            .WithModifiers(Create(Token(PublicKeyword)).Add(Token(StaticKeyword)))
            .AddParameterListParameters(otherSyntax)
            .WithBody(Block(statementSyntax))
        ;
}

как локальная функция C # ..Где methodName - это имя метода в базовом классе, который должен быть вызван, а kind - это оператор, например BitwiseNotExpression (?) Для оператора Единственное дополнение .

Буквально, я хочу закончить чем-то вроде этого:

public static MyType operator ~(MyType other) => other?.BitwiseNot();

Если я смогу получить с помощью функции перегруженный оператор, тем лучше.Тем не менее, это было бы приемлемым результатом:

public static MyType operator ~(MyType other)
{
    return other?.BitwiseNot();
}

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

Затем, более или менее, промойте и повторите длябинарные операторы, то есть BitwiseOrExpression, BitwiseAndExpression и ExclusiveOrExpression видов.

Мысли?Рекомендации?

Спасибо!

1 Ответ

0 голосов
/ 26 мая 2018

Я нашел этот маленький драгоценный камень , который, хотя я и не брал бы результат в рутину из сгенерированного кода Roslyn, он показывает подсказки о том, что можно использовать в зависимости от типа кода, который вы хотитегенерировать.Я хотел бы использовать это и читать между строк, то есть с потенциально посторонними IdentifierName или new []{...}.Но он также показывает подсказки, такие как: мне действительно нужно указывать биты, даже такие подробные, как при использовании токена с запятой, то есть /* ... */ .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)).Вещи такой природы.

...