Когда в Roslyn были введены операции, одной из целей было обеспечение пониженных операций (я думаю, что это было в видеоролике с обзором дизайна), который, насколько я понимаю, должен обеспечивать явные операции для неявных действий компилятора на высоком уровне. Я вижу в Roslyn каталог «Понижение», но классы там внутренние. Можно ли получить пониженные операции сейчас или публичный API еще не доступен?
В приведенном ниже примере операции уже удаляют некоторые неявные части - добавление оператора возврата для тела выражения и отображение символа для перегруженного оператора. Но приращения до и после различаются только по виду.
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Semantics;
using System.Linq;
namespace so39468373
{
internal static class Program
{
private static void Main()
{
var tree = CSharpSyntaxTree.ParseText(@"
public class c
{
public static c operator ++(c o) { return o; }
static c pre(c o) => ++o;
static c post(c o) => o++;
public static void Main() {}
}");
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create(null, new[] { tree }, new[] { mscorlib });
var model = compilation.GetSemanticModel(tree);
foreach (var node in tree.GetRoot().DescendantNodes().OfType<ArrowExpressionClauseSyntax>())
{
var operation = model.GetOperation(node);
var block = (IBlockStatement)operation;
var statement = (IReturnStatement)block.Statements.First();
var increment = (IIncrementExpression)statement.ReturnedValue;
// How to get lowered operations for increment here?
}
}
}
}
Код на github - https://github.com/isanych/so-39468373