在roslyn降低了操作

当在Roslyn中引入操作时,其中一个目标就是提供降低的操作(我认为这是在devise审查会议video中),据我所知应该为高级隐式编译器操作提供显式操作。 我在Roslyn看到降低目录,但是课程在那里。 现在有可能降低操作或没有公共API可用?

在下面的示例操作中,已经删除了一些隐式部分 – 为expression式主体添加return语句,并为重载操作符显示符号。 但是前后增量仅仅因种类而异。

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 ++(co) { return o; } static c pre(co) => ++o; static c post(co) => 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

这个答案的不同angular度 – 编译器的这个方面呢?

InternalVisibleTo Attribute

链接: https : //msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v=vs.110).aspx

可能会使用一个“不同的angular度”来进行debugging的有趣话题?

更多信息(来自文章):

版本信息

通用Windows平台自8 .NET Framework开始提供
可用于2.0 便携式类库
受以下版本支持:可移植的.NET平台Silverlight
自2.0 Windows Phone Silverlight以来可用
Windows Phone 7.0以来可用
自8.1起可用

检查这个例子将帮助你解决他的问题

 using System.Collections.Immutable; using System.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.CSharp { /// <summary> /// The dynamic operation factories below return this struct so that the caller /// have the option of separating the call-site initialization from its invocation. /// /// Most callers just call <see cref="ToExpression"/> to get the combo but some (object and array initializers) /// hoist all call-site initialization code and emit multiple invocations of the same site. /// </summary> internal struct LoweredDynamicOperation { private readonly SyntheticBoundNodeFactory _factory; private readonly TypeSymbol _resultType; private readonly ImmutableArray<LocalSymbol> _temps; public readonly BoundExpression SiteInitialization; public readonly BoundExpression SiteInvocation; public LoweredDynamicOperation(SyntheticBoundNodeFactory factory, BoundExpression siteInitialization, BoundExpression siteInvocation, TypeSymbol resultType, ImmutableArray<LocalSymbol> temps) { _factory = factory; _resultType = resultType; _temps = temps; this.SiteInitialization = siteInitialization; this.SiteInvocation = siteInvocation; } public static LoweredDynamicOperation Bad( BoundExpression loweredReceiver, ImmutableArray<BoundExpression> loweredArguments, BoundExpression loweredRight, TypeSymbol resultType) { var children = ArrayBuilder<BoundNode>.GetInstance(); children.AddOptional(loweredReceiver); children.AddRange(loweredArguments); children.AddOptional(loweredRight); return LoweredDynamicOperation.Bad(resultType, children.ToImmutableAndFree()); } public static LoweredDynamicOperation Bad(TypeSymbol resultType, ImmutableArray<BoundNode> children) { Debug.Assert(children.Length > 0); var bad = new BoundBadExpression(children[0].Syntax, LookupResultKind.Empty, ImmutableArray<Symbol>.Empty, children, resultType); return new LoweredDynamicOperation(null, null, bad, resultType, default(ImmutableArray<LocalSymbol>)); } public BoundExpression ToExpression() { if (_factory == null) { Debug.Assert(SiteInitialization == null && SiteInvocation is BoundBadExpression && _temps.IsDefaultOrEmpty); return SiteInvocation; } // TODO (tomat): we might be able to use SiteInvocation.Type instead of resultType once we stop using GetLoweredType if (_temps.IsDefaultOrEmpty) { return _factory.Sequence(new[] { SiteInitialization }, SiteInvocation, _resultType); } else { return new BoundSequence(_factory.Syntax, _temps, ImmutableArray.Create(SiteInitialization), SiteInvocation, _resultType) { WasCompilerGenerated = true }; } } } }