使用 Roslyn 检测 c# 6 功能
Detect c# 6 features with Roslyn
有没有办法使用 roslyn 诊断分析器检测 c# 6 功能?
我有一个解决方案可以链接到无法使用 c#6 功能的项目中的某些文件,因此我只想为这些文件设置一个错误。
要清楚 - 我不能将整个项目设置为 c#5,只有一些文件是禁止访问的。
我可以尝试捕捉特定的特征,但是很麻烦,想知道是否有更快的方法?
我相信最好的方法是使用高级构建选项。转到您的项目属性和 select "Build" 选项卡。在该选项卡的右下角(您可能需要向下滚动),您应该会看到一个 "Advanced" 按钮。单击它,您将看到此对话框:
如您所见,您可以将特定项目的语言级别更改为 C# 5.0。一旦你这样做了,并且你尝试使用,比如说,字符串插值,你会得到一个错误提示:
您可以使用此 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);
}
}
不幸的是,无法仅基于语法检查来检测文件是否在 6 版本上编写,因为某些功能是内容相关的,例如 nameof
运算符(它可以是特殊的也可以是通常的方法)
要测试 C# 6 功能,您可以使用来自 ANTLR 语法存储库的 this file。
有没有办法使用 roslyn 诊断分析器检测 c# 6 功能?
我有一个解决方案可以链接到无法使用 c#6 功能的项目中的某些文件,因此我只想为这些文件设置一个错误。 要清楚 - 我不能将整个项目设置为 c#5,只有一些文件是禁止访问的。
我可以尝试捕捉特定的特征,但是很麻烦,想知道是否有更快的方法?
我相信最好的方法是使用高级构建选项。转到您的项目属性和 select "Build" 选项卡。在该选项卡的右下角(您可能需要向下滚动),您应该会看到一个 "Advanced" 按钮。单击它,您将看到此对话框:
如您所见,您可以将特定项目的语言级别更改为 C# 5.0。一旦你这样做了,并且你尝试使用,比如说,字符串插值,你会得到一个错误提示:
您可以使用此 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);
}
}
不幸的是,无法仅基于语法检查来检测文件是否在 6 版本上编写,因为某些功能是内容相关的,例如 nameof
运算符(它可以是特殊的也可以是通常的方法)
要测试 C# 6 功能,您可以使用来自 ANTLR 语法存储库的 this file。