本文整理汇总了C#中ConstantValue.ToAstNode方法的典型用法代码示例。如果您正苦于以下问题:C# ConstantValue.ToAstNode方法的具体用法?C# ConstantValue.ToAstNode怎么用?C# ConstantValue.ToAstNode使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConstantValue
的用法示例。
在下文中一共展示了ConstantValue.ToAstNode方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Visit
public override AstNode Visit(BinaryOperation node)
{
// Process the left expression.
Expression left = node.GetLeftExpression();
left = (Expression)left.Accept(this);
node.SetLeftExpression(left);
// Process the right expression.
Expression right = node.GetRightExpression();
right = (Expression)right.Accept(this);
node.SetRightExpression(node);
// Get the node type.
IChelaType nodeType = node.GetNodeType();
if(!nodeType.IsConstant())
return node;
// Perform left constant coercion.
ConstantValue leftConstant = (ConstantValue)left.GetNodeValue();
IChelaType leftType = left.GetNodeType();
IChelaType leftCoercion = node.GetCoercionType();
if(leftType != leftCoercion)
leftConstant = leftConstant.Cast(leftCoercion);
// Perform right constant coercion.
ConstantValue rightConstant = (ConstantValue)right.GetNodeValue();
IChelaType rightType = right.GetNodeType();
IChelaType rightCoercion = node.GetSecondCoercion();
if(rightType != rightCoercion)
rightConstant = rightConstant.Cast(rightCoercion);
// Perform the constant operation.
ConstantValue res = null;
switch(node.GetOperation())
{
case BinaryOperation.OpAdd:
res = leftConstant + rightConstant;
break;
case BinaryOperation.OpSub:
res = leftConstant - rightConstant;
break;
case BinaryOperation.OpMul:
res = leftConstant * rightConstant;
break;
case BinaryOperation.OpDiv:
res = leftConstant / rightConstant;
break;
case BinaryOperation.OpMod:
res = leftConstant % rightConstant;
break;
case BinaryOperation.OpEQ:
res = ConstantValue.Equals(leftConstant, rightConstant);
break;
case BinaryOperation.OpNEQ:
res = ConstantValue.NotEquals(leftConstant, rightConstant);
break;
case BinaryOperation.OpLT:
res = leftConstant < rightConstant;
break;
case BinaryOperation.OpLEQ:
res = leftConstant <= rightConstant;
break;
case BinaryOperation.OpGT:
res = leftConstant > rightConstant;
break;
case BinaryOperation.OpGEQ:
res = leftConstant >= rightConstant;
break;
case BinaryOperation.OpBitAnd:
res = leftConstant & rightConstant;
break;
case BinaryOperation.OpBitOr:
res = leftConstant | rightConstant;
break;
case BinaryOperation.OpBitXor:
res = leftConstant ^ rightConstant;
break;
case BinaryOperation.OpBitLeft:
res = ConstantValue.BitLeft(leftConstant, rightConstant);
break;
case BinaryOperation.OpBitRight:
res = ConstantValue.BitRight(leftConstant, rightConstant);
break;
case BinaryOperation.OpLAnd:
res = new ConstantValue(leftConstant.GetBoolValue() && rightConstant.GetBoolValue());
break;
case BinaryOperation.OpLOr:
res = new ConstantValue(leftConstant.GetBoolValue() || rightConstant.GetBoolValue());
break;
default:
throw new System.NotImplementedException();
}
// Return the result node.
return res.ToAstNode(node.GetPosition());
}