本文整理汇总了C#中Microsoft.CodeAnalysis.CSharp.BoundBinaryOperator.Update方法的典型用法代码示例。如果您正苦于以下问题:C# BoundBinaryOperator.Update方法的具体用法?C# BoundBinaryOperator.Update怎么用?C# BoundBinaryOperator.Update使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Microsoft.CodeAnalysis.CSharp.BoundBinaryOperator
的用法示例。
在下文中一共展示了BoundBinaryOperator.Update方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: TryFoldWithConditionalAccess
private BoundExpression TryFoldWithConditionalAccess(BoundBinaryOperator node)
{
var syntax = node.Syntax;
var left = node.Left;
var right = node.Right;
BoundConditionalAccess conditionalAccess;
if (!node.OperatorKind.IsLifted())
{
var operatorKind = node.OperatorKind;
if (operatorKind == BinaryOperatorKind.NullableNullEqual || operatorKind == BinaryOperatorKind.NullableNullNotEqual)
{
var leftAlwaysNull = NullableNeverHasValue(left);
var rightAlwaysNull = NullableNeverHasValue(right);
if (leftAlwaysNull || rightAlwaysNull)
{
BoundExpression maybeNull = leftAlwaysNull ? right : left;
if (TryGetOptimizableNullableConditionalAccess(maybeNull, out conditionalAccess))
{
BoundExpression accessExpression = conditionalAccess.AccessExpression;
accessExpression = _factory.Sequence(accessExpression, MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NullableNullNotEqual));
conditionalAccess = conditionalAccess.Update(conditionalAccess.Receiver, accessExpression, accessExpression.Type);
var whenNull = operatorKind == BinaryOperatorKind.NullableNullEqual ? MakeBooleanConstant(syntax, true) : null;
return RewriteConditionalAccess(conditionalAccess, used: true, rewrittenWhenNull: whenNull);
}
}
}
}
else
{
var unliftedOperatorKind = node.OperatorKind.Unlifted();
if (unliftedOperatorKind.IsComparison() && TryGetOptimizableNullableConditionalAccess(left, out conditionalAccess))
{
var rightAlwaysHasValue = NullableAlwaysHasValue(VisitExpression(right));
// reading rightAlwaysHasValue should not have sideeffects here
// otherwise we would need to read it even when we knew that LHS is null
if (rightAlwaysHasValue != null && !IntroducingReadCanBeObservable(rightAlwaysHasValue))
{
BoundExpression accessExpression = conditionalAccess.AccessExpression;
accessExpression = node.Update(unliftedOperatorKind, accessExpression, rightAlwaysHasValue, null, node.MethodOpt, node.ResultKind, node.Type);
conditionalAccess = conditionalAccess.Update(conditionalAccess.Receiver, accessExpression, accessExpression.Type);
var whenNull = unliftedOperatorKind.Operator() == BinaryOperatorKind.NotEqual ? MakeBooleanConstant(syntax, true) : null;
return RewriteConditionalAccess(conditionalAccess, used: true, rewrittenWhenNull: whenNull);
}
}
}
return null;
}
示例2: RewriteBuiltInShiftOperation
/// <summary>
/// Spec section 7.9: if the left operand is int or uint, mask the right operand with 0x1F;
/// if the left operand is long or ulong, mask the right operand with 0x3F.
/// </summary>
private BoundExpression RewriteBuiltInShiftOperation(
BoundBinaryOperator oldNode,
CSharpSyntaxNode syntax,
BinaryOperatorKind operatorKind,
BoundExpression loweredLeft,
BoundExpression loweredRight,
TypeSymbol type,
int rightMask)
{
CSharpSyntaxNode rightSyntax = loweredRight.Syntax;
ConstantValue rightConstantValue = loweredRight.ConstantValue;
TypeSymbol rightType = loweredRight.Type;
Debug.Assert(rightType.SpecialType == SpecialType.System_Int32);
if (rightConstantValue != null && rightConstantValue.IsIntegral)
{
int shiftAmount = rightConstantValue.Int32Value & rightMask;
if (shiftAmount == 0)
{
return loweredLeft;
}
loweredRight = MakeLiteral(rightSyntax, ConstantValue.Create(shiftAmount), rightType);
}
else
{
BinaryOperatorKind andOperatorKind = (operatorKind & ~BinaryOperatorKind.OpMask) | BinaryOperatorKind.And;
loweredRight = new BoundBinaryOperator(
rightSyntax,
andOperatorKind,
loweredRight,
MakeLiteral(rightSyntax, ConstantValue.Create(rightMask), rightType),
null,
null,
LookupResultKind.Viable,
rightType);
}
return oldNode == null
? new BoundBinaryOperator(
syntax,
operatorKind,
loweredLeft,
loweredRight,
null,
null,
LookupResultKind.Viable,
type)
: oldNode.Update(
operatorKind,
loweredLeft,
loweredRight,
null,
null,
oldNode.ResultKind,
type);
}
示例3: RewriteStringEquality
private BoundExpression RewriteStringEquality(BoundBinaryOperator oldNode, CSharpSyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
{
if (oldNode != null && (loweredLeft.ConstantValue == ConstantValue.Null || loweredRight.ConstantValue == ConstantValue.Null))
{
return oldNode.Update(operatorKind, loweredLeft, loweredRight, oldNode.ConstantValueOpt, oldNode.MethodOpt, oldNode.ResultKind, type);
}
var method = GetSpecialTypeMethod(syntax, member);
Debug.Assert((object)method != null);
return BoundCall.Synthesized(syntax, null, method, loweredLeft, loweredRight);
}
示例4: MakeBinaryOperator
//.........这里部分代码省略.........
return RewritePointerSubtraction(operatorKind, loweredLeft, loweredRight, type);
case BinaryOperatorKind.IntAddition:
case BinaryOperatorKind.UIntAddition:
case BinaryOperatorKind.LongAddition:
case BinaryOperatorKind.ULongAddition:
if (loweredLeft.IsDefaultValue())
{
return loweredRight;
}
if (loweredRight.IsDefaultValue())
{
return loweredLeft;
}
goto default;
case BinaryOperatorKind.IntSubtraction:
case BinaryOperatorKind.LongSubtraction:
case BinaryOperatorKind.UIntSubtraction:
case BinaryOperatorKind.ULongSubtraction:
if (loweredRight.IsDefaultValue())
{
return loweredLeft;
}
goto default;
case BinaryOperatorKind.IntMultiplication:
case BinaryOperatorKind.LongMultiplication:
case BinaryOperatorKind.UIntMultiplication:
case BinaryOperatorKind.ULongMultiplication:
if (loweredLeft.IsDefaultValue())
{
return loweredLeft;
}
if (loweredRight.IsDefaultValue())
{
return loweredRight;
}
if (loweredLeft.ConstantValue?.UInt64Value == 1)
{
return loweredRight;
}
if (loweredRight.ConstantValue?.UInt64Value == 1)
{
return loweredLeft;
}
goto default;
case BinaryOperatorKind.IntGreaterThan:
case BinaryOperatorKind.IntLessThanOrEqual:
if (loweredLeft.Kind == BoundKind.ArrayLength && loweredRight.IsDefaultValue())
{
//array length is never negative
var newOp = operatorKind == BinaryOperatorKind.IntGreaterThan ?
BinaryOperatorKind.NotEqual :
BinaryOperatorKind.Equal;
operatorKind &= ~BinaryOperatorKind.OpMask;
operatorKind |= newOp;
loweredLeft = UnconvertArrayLength((BoundArrayLength)loweredLeft);
}
goto default;
case BinaryOperatorKind.IntLessThan:
case BinaryOperatorKind.IntGreaterThanOrEqual:
if (loweredRight.Kind == BoundKind.ArrayLength && loweredLeft.IsDefaultValue())
{
//array length is never negative
var newOp = operatorKind == BinaryOperatorKind.IntLessThan ?
BinaryOperatorKind.NotEqual :
BinaryOperatorKind.Equal;
operatorKind &= ~BinaryOperatorKind.OpMask;
operatorKind |= newOp;
loweredRight = UnconvertArrayLength((BoundArrayLength)loweredRight);
}
goto default;
case BinaryOperatorKind.IntEqual:
case BinaryOperatorKind.IntNotEqual:
if (loweredLeft.Kind == BoundKind.ArrayLength && loweredRight.IsDefaultValue())
{
loweredLeft = UnconvertArrayLength((BoundArrayLength)loweredLeft);
}
else if (loweredRight.Kind == BoundKind.ArrayLength && loweredLeft.IsDefaultValue())
{
loweredRight = UnconvertArrayLength((BoundArrayLength)loweredRight);
}
goto default;
default:
break;
}
}
return (oldNode != null) ?
oldNode.Update(operatorKind, loweredLeft, loweredRight, oldNode.ConstantValueOpt, oldNode.MethodOpt, oldNode.ResultKind, type) :
new BoundBinaryOperator(syntax, operatorKind, loweredLeft, loweredRight, null, null, LookupResultKind.Viable, type);
}
示例5: VisitBinaryOperator
public override BoundNode VisitBinaryOperator(BoundBinaryOperator node)
{
BoundSpillSequence2 ss = null;
var right = VisitExpression(ref ss, node.Right);
BoundExpression left;
if (ss == null)
{
left = VisitExpression(ref ss, node.Left);
}
else
{
var ssLeft = new BoundSpillSequence2();
left = VisitExpression(ref ssLeft, node.Left);
left = Spill(ssLeft, left);
if (node.OperatorKind == BinaryOperatorKind.LogicalBoolOr || node.OperatorKind == BinaryOperatorKind.LogicalBoolAnd)
{
ssLeft.Add(F.If(
node.OperatorKind == BinaryOperatorKind.LogicalBoolAnd ? left : F.Not(left),
UpdateStatement(ss, F.Assignment(left, right))
));
return UpdateExpression(ssLeft, left);
}
else
{
// if the right-hand-side has await, spill the left
ssLeft.IncludeSequence(ss);
ss = ssLeft;
}
}
return UpdateExpression(ss, node.Update(node.OperatorKind, left, right, node.ConstantValue, node.MethodOpt, node.ResultKind, node.Type));
}
示例6: VisitBinaryOperator
public override BoundNode VisitBinaryOperator(BoundBinaryOperator node)
{
BoundExpression left = (BoundExpression)this.Visit(node.Left);
BoundExpression right = (BoundExpression)this.Visit(node.Right);
TypeSymbol type = this.VisitType(node.Type);
if (!RequiresSpill(left, right))
{
return node.Update(node.OperatorKind, left, right, node.ConstantValueOpt, node.MethodOpt, node.ResultKind, type);
}
var subExprs = ReadOnlyArray<BoundExpression>.CreateFrom(left, right);
var spillBuilder = new SpillBuilder();
var newArgs = SpillExpressionList(spillBuilder, subExprs);
Debug.Assert(newArgs.Count == 2);
var newBinaryOperator = node.Update(
node.OperatorKind,
newArgs[0],
newArgs[1],
node.ConstantValueOpt,
node.MethodOpt,
node.ResultKind,
type);
return spillBuilder.BuildSequenceAndFree(F, newBinaryOperator);
}