Roslyn的“.WithFooToken()”调用是否多余?

6
我正在尝试使用LinqPad运行Roslyn的代码生成功能。LinqPad的.Dump()扩展方法可将对象呈现为格式化视图,并在结果窗格中显示。
http://roslynquoter.azurewebsites.net/ 生成的代码包含很多似乎没有什么用处,只会增加臃肿的代码。无论是否注释掉.WithFooToken(...)调用,以下代码都将输出return null;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

var syn =
    SyntaxFactory.ReturnStatement(
        SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)
//          .WithToken(SyntaxFactory.Token(SyntaxKind.NullKeyword))
    )
//  .WithReturnKeyword(
//      SyntaxFactory.Token(SyntaxKind.ReturnKeyword)
//  )
//  .WithSemicolonToken(
//      SyntaxFactory.Token(SyntaxKind.SemicolonToken)
//  )
;
syn.NormalizeWhitespace().ToFullString().Dump();

这些调用是否对所有语言都是可选的,还是仅适用于其Roslyn支持库中具有合理默认值的语言?

这些调用在像 return /**/ null; 这样的情况下肯定很有用。至于为什么它们总是被包含在内,也许是因为很难区分这两种情况吧? - svick
有一种情况我认为这可能很重要,即在代码只部分构建的情况下。默认情况下,它假定已经存在return关键字和分号,因此它们会被默认添加-但是如果分号还没有输入呢?syntax = syntax.WithSemicolonToken(SyntaxFactory.MissingToken(SyntaxKind.SemicolonToken)); - Jeroen Vannevel
2个回答

7

@svick的回答是正确的。我只是忘记重新启用那段代码,因为Roslyn脚本不可用。

现在Scripting已经公开,我重新启用了该代码并更新了网站: http://roslynquoter.azurewebsites.net/

现在立即尝试该网站,冗余调用就像你上面提到的那样将消失(当需要修改trivia/comments等时,它们仍然会出现)。


5

是的,在简单的情况下,这些调用是不必要的。 RoslynQuoter的代码 具有RemoveRedundantModifyingCalls选项,我认为它应该正好符合您的要求。但是它没有实现,唯一的使用被注释了:

private void AddModifyingCall(ApiCall apiCall, MethodCall methodCall)
{
    // TODO: this needs scripting
    ////if (RemoveRedundantModifyingCalls)
    ////{
    ////    var before = Evaluate(apiCall, UseDefaultFormatting);
    ////    apiCall.Add(methodCall);
    ////    var after = Evaluate(apiCall, UseDefaultFormatting);
    ////    if (before == after)
    ////    {
    ////        apiCall.Remove(methodCall);
    ////    }
    ////}

    apiCall.Add(methodCall);
    return;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接