Lorsque les opérations ont été introduites dans Roslyn, l'un des objectifs était de fournir des opérations abaissées (je pense que c'était dans la vidéo de la réunion de revue de conception) qui, d'après ce que je comprends, devraient fournir des opérations explicites pour les actions implicites du compilateur sur les opérations de haut niveau. Je vois le répertoire Lowering dans Roslyn, mais les classes y sont internes. Est-il possible d'obtenir des opérations abaissées maintenant ou aucune API publique n'est encore disponible ?
Dans l'exemple ci-dessous, les opérations ont déjà supprimé certaines parties implicites - en ajoutant l'instruction return pour le corps de l'expression et le symbole expose pour l'opérateur surchargé. Mais les incréments pré et post ne diffèrent que par leur nature.
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?
}
}
}
}
Code sur github - https://github.com/isanych/so-39468373
3 votes
D'après ce que je peux voir, il y a un certain nombre de questions ouvertes concernant ce sujet, vous pouvez en suivre l'évolution ici : github.com/dotnet/roslyn/