使用 Roslyn 确定 BinaryExpression 是否为算术表达式
Using Roslyn to determine if a BinaryExpression is an arithmetic expression
我想使用 CSharpSyntaxRewriter 来确定特定的 BinaryExpression 是否是算术表达式。有没有比下面的代码片段更简单的方法来确定这一点。
private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
return node.IsKind(SyntaxKind.AddExpression) ||
node.IsKind(SyntaxKind.MultiplyExpression) ||
node.IsKind(SyntaxKind.DivideExpression) ||
node.IsKind(SyntaxKind.SubtractExpression) ||
node.IsKind(SyntaxKind.ModuloExpression);
}
只是感觉有点笨拙。
我不确定这是否可行,但枚举中有些东西也许可以帮助你,
算术表达式在枚举 SyntaxKind
中按顺序排列,但 ModuloExpression
除外,您可以单独检查。
也许此范围内的其他 SyntaxKind
也能满足您的需求。
AddExpression = 307,
SubtractExpression = 308,
MultiplyExpression = 309,
DivideExpression = 310,
IntegerDivideExpression = 311,
ExponentiateExpression = 314,
LeftShiftExpression = 315,
RightShiftExpression = 316,
ConcatenateExpression = 317,
ModuloExpression = 318,
所以你可以这样做:
private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
SyntaxKind expressionKind = node.Kind();
return (expressionKind >= SyntaxKind.AddExpression && expressionKind <= SyntaxKind.DivideExpression)
|| expressionKind == SyntaxKind.ModuloExpression;
}
更新
这仅适用于 Microsoft.CodeAnalysis.VisualBasic
并且不会为 Microsoft.CodeAnalysis.CSharp
工作
我想使用 CSharpSyntaxRewriter 来确定特定的 BinaryExpression 是否是算术表达式。有没有比下面的代码片段更简单的方法来确定这一点。
private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
return node.IsKind(SyntaxKind.AddExpression) ||
node.IsKind(SyntaxKind.MultiplyExpression) ||
node.IsKind(SyntaxKind.DivideExpression) ||
node.IsKind(SyntaxKind.SubtractExpression) ||
node.IsKind(SyntaxKind.ModuloExpression);
}
只是感觉有点笨拙。
我不确定这是否可行,但枚举中有些东西也许可以帮助你,
算术表达式在枚举 SyntaxKind
中按顺序排列,但 ModuloExpression
除外,您可以单独检查。
也许此范围内的其他 SyntaxKind
也能满足您的需求。
AddExpression = 307,
SubtractExpression = 308,
MultiplyExpression = 309,
DivideExpression = 310,
IntegerDivideExpression = 311,
ExponentiateExpression = 314,
LeftShiftExpression = 315,
RightShiftExpression = 316,
ConcatenateExpression = 317,
ModuloExpression = 318,
所以你可以这样做:
private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
SyntaxKind expressionKind = node.Kind();
return (expressionKind >= SyntaxKind.AddExpression && expressionKind <= SyntaxKind.DivideExpression)
|| expressionKind == SyntaxKind.ModuloExpression;
}
更新
这仅适用于 Microsoft.CodeAnalysis.VisualBasic
并且不会为 Microsoft.CodeAnalysis.CSharp