使用Roslyn检测c#6功能

Rob*_*anc 5 c# roslyn

有没有办法用roslyn诊断分析仪检测ac#6功能?

我有一个解决方案,链接在一个不能使用c#6功能的项目的某些文件中,所以我想为那些文件做出错误.要清楚 - 我不能将整个项目设置为c#5,只有一些文件没有限制.

我可以尝试捕捉特定的功能,但它很麻烦,并想知道是否有更快的方法?

Iva*_*kin 2

您可以使用此 Walker 来检测 C# 6 语法功能:

public class CSharp6FeaturesWalker : CSharpSyntaxWalker
{
    public bool CSharp6Features { get; private set; }

    public CSharp6FeatureWalker()
    {
    }

    public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        else if (node.Initializer != null)
        {
            CSharp6Features = true;
        }
        base.VisitPropertyDeclaration(node);
    }

    public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitMethodDeclaration(node);
    }

    public override void VisitOperatorDeclaration(OperatorDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitOperatorDeclaration(node);
    }

    public override void VisitConversionOperatorDeclaration(ConversionOperatorDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitConversionOperatorDeclaration(node);
    }

    public override void VisitIndexerDeclaration(IndexerDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitIndexerDeclaration(node);
    }

    public override void VisitConditionalAccessExpression(ConditionalAccessExpressionSyntax node)
    {
        CSharp6Features = true;
        base.VisitConditionalAccessExpression(node);
    }

    public override void VisitInterpolatedStringExpression(InterpolatedStringExpressionSyntax node)
    {
        CSharp6Features = true;
        base.VisitInterpolatedStringExpression(node);
    }

    public override void VisitCatchFilterClause(CatchFilterClauseSyntax node)
    {
        CSharp6Features = true;
        base.VisitCatchFilterClause(node);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,仅基于语法检查无法检测文件是否是在 6 版本上编写的,因为某些功能是依赖于内容的,例如nameof运算符(可以是特殊方法或常用方法)

要测试 C# 6 功能,您可以使用ANTLR 语法存储库中的此文件。