Binder\Binder_InterpolatedString.cs (14)
438private bool TryBindUnconvertedBinaryOperatorToDefaultInterpolatedStringHandler(BoundBinaryOperator binaryOperator, BindingDiagnosticBag diagnostics, [NotNullWhen(true)] out BoundBinaryOperator? convertedBinaryOperator)
515private BoundBinaryOperator UpdateBinaryOperatorWithInterpolatedContents(BoundBinaryOperator originalOperator, ImmutableArray<ImmutableArray<BoundExpression>> appendCalls, InterpolatedStringHandlerData data, SyntaxNode rootSyntax, BindingDiagnosticBag diagnostics)
521Func<BoundBinaryOperator, BoundExpression, BoundExpression, (ImmutableArray<ImmutableArray<BoundExpression>>, TypeSymbol), BoundExpression> binaryOperatorFactory =
524var rewritten = (BoundBinaryOperator)originalOperator.RewriteInterpolatedStringAddition((appendCalls, @string), interpolationFactory, binaryOperatorFactory);
526return rewritten.Update(BoundBinaryOperator.UncommonData.InterpolatedStringHandlerAddition(data));
540static BoundBinaryOperator createBinaryOperator(BoundBinaryOperator original, BoundExpression left, BoundExpression right, (ImmutableArray<ImmutableArray<BoundExpression>> _, TypeSymbol @string) arg)
570BoundBinaryOperator binary => BindUnconvertedBinaryOperatorToInterpolatedStringHandlerType(binary, interpolatedStringHandlerType, diagnostics, additionalConstructorArguments, additionalConstructorRefKinds),
601private BoundBinaryOperator BindUnconvertedBinaryOperatorToInterpolatedStringHandlerType(
602BoundBinaryOperator binaryOperator,
628var result = UpdateBinaryOperatorWithInterpolatedContents(binaryOperator, appendCalls, data, binaryOperator.Syntax, diagnostics);
Binder\Binder_Operators.cs (9)
987&& left is BoundUnconvertedInterpolatedString or BoundBinaryOperator { IsUnconvertedInterpolatedStringAddition: true }
988&& right is BoundUnconvertedInterpolatedString or BoundBinaryOperator { IsUnconvertedInterpolatedStringAddition: true })
992return new BoundBinaryOperator(node, BinaryOperatorKind.StringConcatenation, BoundBinaryOperator.UncommonData.UnconvertedInterpolatedStringAddition(stringConstant), LookupResultKind.Empty, left, right, right.Type);
1246private BoundExpression RebindSimpleBinaryOperatorAsConverted(BoundBinaryOperator unconvertedBinaryOperator, BindingDiagnosticBag diagnostics)
1248if (TryBindUnconvertedBinaryOperatorToDefaultInterpolatedStringHandler(unconvertedBinaryOperator, diagnostics, out var convertedBinaryOperator))
1256BoundExpression doRebind(BindingDiagnosticBag diagnostics, BoundBinaryOperator? current)
1258var stack = ArrayBuilder<BoundBinaryOperator>.GetInstance();
1263current = current.Left as BoundBinaryOperator;
1274BoundBinaryOperator b => doRebind(diagnostics, b),
BoundTree\BoundNodeExtensions.cs (26)
108this BoundBinaryOperator binary,
111Action<BoundBinaryOperator, TArg>? binaryOperatorCallback = null)
114var stack = ArrayBuilder<BoundBinaryOperator>.GetInstance();
118while (stack.TryPop(out BoundBinaryOperator? current))
122case BoundBinaryOperator:
136case BoundBinaryOperator rightOperator:
154static void pushLeftNodes(BoundBinaryOperator binary, ArrayBuilder<BoundBinaryOperator> stack, TArg arg, Action<BoundBinaryOperator, TArg>? binaryOperatorCallback)
157BoundBinaryOperator? current = binary;
162current = current.Left as BoundBinaryOperator;
183this BoundBinaryOperator binary,
186Func<BoundBinaryOperator, TResult, TResult, TArg, TResult> binaryOperatorFactory)
196BoundBinaryOperator binary,
199Func<BoundBinaryOperator, TResult, TResult, TArg, TResult> binaryOperatorFactory,
203var originalStack = ArrayBuilder<BoundBinaryOperator>.GetInstance();
207while (originalStack.TryPop(out var currentBinary))
213BoundBinaryOperator => result!,
224BoundBinaryOperator binaryOperator => doRewrite(binaryOperator, arg, interpolatedStringFactory, binaryOperatorFactory, ref i),
237static void pushLeftNodes(BoundBinaryOperator binary, ArrayBuilder<BoundBinaryOperator> stack)
239BoundBinaryOperator? current = binary;
244current = current.Left as BoundBinaryOperator;
252BoundBinaryOperator { InterpolatedStringHandlerData: { } d } => d,
254BoundBinaryOperator or BoundInterpolatedString when !throwOnMissing => default,
255BoundBinaryOperator or BoundInterpolatedString => throw ExceptionUtilities.Unreachable(),
Generated\BoundNodes.xml.Generated.cs (11)
1655public BoundBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1673public BoundBinaryOperator.UncommonData? Data { get; }
1679public BoundBinaryOperator Update(BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type)
1683var result = new BoundBinaryOperator(this.Syntax, operatorKind, data, resultKind, left, right, type, this.HasErrors);
8976return VisitBinaryOperator((BoundBinaryOperator)node, arg);
9409public virtual R VisitBinaryOperator(BoundBinaryOperator node, A arg) => this.DefaultVisit(node, arg);
9645public virtual BoundNode? VisitBinaryOperator(BoundBinaryOperator node) => this.DefaultVisit(node);
9973public override BoundNode? VisitBinaryOperator(BoundBinaryOperator node)
11104public override BoundNode? VisitBinaryOperator(BoundBinaryOperator node)
15490public override TreeDumperNode VisitBinaryOperator(BoundBinaryOperator node, object? arg) => new TreeDumperNode("binaryOperator", null, new TreeDumperNode[]
Lowering\LocalRewriter\LocalRewriter_BinaryOperator.cs (13)
16public override BoundNode VisitBinaryOperator(BoundBinaryOperator node)
114public BoundExpression VisitBinaryOperator(BoundBinaryOperator node, BoundUnaryOperator? applyParentUnaryOperator)
140var stack = ArrayBuilder<BoundBinaryOperator>.GetInstance();
142for (BoundBinaryOperator? current = node; current != null && current.ConstantValueOpt == null; current = current.Left as BoundBinaryOperator)
157BoundBinaryOperator original = stack.Pop();
167private static ImmutableArray<BoundExpression> CollectBinaryOperatorInterpolatedStringParts(BoundBinaryOperator node)
197BoundBinaryOperator? oldNode,
2014private BoundExpression RewriteStringEquality(BoundBinaryOperator? oldNode, SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2146BoundBinaryOperator? oldNode,
2208BoundBinaryOperator? oldNode,
2259var result = oldNode == null
2459var multiplication = _factory.Binary(multiplicationKind, multiplicationResultType, numericOperand, sizeOfExpression);
Lowering\SyntheticBoundNodeFactory.cs (11)
642public BoundBinaryOperator Binary(BinaryOperatorKind kind, TypeSymbol type, BoundExpression left, BoundExpression right)
661public BoundBinaryOperator LogicalAnd(BoundExpression left, BoundExpression right)
668public BoundBinaryOperator LogicalOr(BoundExpression left, BoundExpression right)
675public BoundBinaryOperator IntEqual(BoundExpression left, BoundExpression right)
680public BoundBinaryOperator ObjectEqual(BoundExpression left, BoundExpression right)
706public BoundBinaryOperator ObjectNotEqual(BoundExpression left, BoundExpression right)
711public BoundBinaryOperator IntNotEqual(BoundExpression left, BoundExpression right)
716public BoundBinaryOperator IntLessThan(BoundExpression left, BoundExpression right)
721public BoundBinaryOperator IntGreaterThanOrEqual(BoundExpression left, BoundExpression right)
726public BoundBinaryOperator IntSubtract(BoundExpression left, BoundExpression right)
731public BoundBinaryOperator IntMultiply(BoundExpression left, BoundExpression right)
Operations\CSharpOperationFactory.cs (8)
1448if (boundBinaryOperatorBase is BoundBinaryOperator { InterpolatedStringHandlerData: not null } binary)
1462} while (currentBinary is not null and not BoundBinaryOperator { InterpolatedStringHandlerData: not null });
1473BoundBinaryOperator binaryOp => CreateBoundBinaryOperatorOperation(binaryOp, left, right),
1507private IBinaryOperation CreateBoundBinaryOperatorOperation(BoundBinaryOperator boundBinaryOperator, IOperation left, IOperation right)
1527private IOperation CreateBoundInterpolatedStringBinaryOperator(BoundBinaryOperator boundBinaryOperator)
1533Func<BoundBinaryOperator, IOperation, IOperation, (CSharpOperationFactory, InterpolatedStringHandlerData), IOperation> createBinaryOperator
1545BoundBinaryOperator boundBinaryOperator,
2430case BoundBinaryOperator binaryOperator: