Когда в Roslyn были введены операции, одна из целей заключалась в том, чтобы обеспечить пониженные операции (я думаю, это было в видеоролике, посвященном обзору дизайна), который, насколько я понимаю, должен обеспечивать явные операции для неявных действий компилятора на высокоуровневых. Я вижу, что в Roslyn находится каталог, но классы там внутренние. Можно ли теперь опускать операции или нет общедоступного API?
В примере ниже операции уже удаляются некоторые неявные части - добавление оператора return для тела выражения и отображение символа для перегруженного оператора. Но pre и post increments отличаются только по виду.
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