Binder\Binder.ValueChecks.cs (87)
126public BoundExpression? Receiver;
128public ImmutableArray<BoundExpression> ArgsOpt;
133public static MethodInvocationInfo FromCall(BoundCall call, BoundExpression? substitutedReceiver = null)
146public static MethodInvocationInfo FromCallParts(MethodSymbol method, BoundExpression receiver, ImmutableArray<BoundExpression> args, ThreeState receiverIsSubjectToCloning)
175public static MethodInvocationInfo FromIndexerAccess(BoundIndexerAccess indexerAccess, BoundExpression? substitutedReceiver = null)
250public static MethodInvocationInfo FromUserDefinedOrUnionConversion(MethodSymbol operatorMethod, BoundExpression operand, bool hasAnyErrors)
263public static MethodInvocationInfo FromInlineArrayConversion(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
309public static MethodInvocationInfo FromInlineArrayAccess(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
349internal BoundExpression Argument { get; }
365internal MixableDestination(ParameterSymbol parameter, BoundExpression argument)
374internal MixableDestination(BoundExpression argument, EscapeLevel escapeLevel)
403internal BoundExpression Argument { get; }
407internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
415public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
439internal BoundExpression Argument { get; }
450internal EscapeValue(ParameterSymbol? parameter, BoundExpression argument, EscapeLevel escapeLevel, bool isRefEscape)
458public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out EscapeLevel escapeLevel, out bool isRefEscape)
643var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(accessorForDefaultArguments.ParameterCount);
734private BoundExpression CheckValue(BoundExpression expr, BindValueKind valueKind, BindingDiagnosticBag diagnostics)
880var receiver = methodGroup.ReceiverOpt;
899receiver == null ? ImmutableArray<BoundExpression>.Empty : ImmutableArray.Create(AdjustBadExpressionChild(receiver)),
917internal static bool IsTypeOrValueExpression(BoundExpression expression)
942internal bool CheckValueKind(SyntaxNode node, BoundExpression expr, BindValueKind valueKind, bool checkingReceiver, BindingDiagnosticBag diagnostics)
1068var receiver = ((BoundPointerElementAccess)expr).Expression;
1223bool checkArrayAccessValueKind(SyntaxNode node, BindValueKind valueKind, ImmutableArray<BoundExpression> indices, BindingDiagnosticBag diagnostics)
1258private static bool CheckNotNamespaceOrType(BoundExpression expr, BindingDiagnosticBag diagnostics)
1570private bool CheckParameterRefEscape(SyntaxNode node, BoundExpression parameter, ParameterSymbol parameterSymbol, SafeContext escapeTo, bool checkingReceiver, BindingDiagnosticBag diagnostics)
1847BoundExpression receiver = boundEvent.ReceiverOpt;
1912private bool CheckIsValidReceiverForVariable(SyntaxNode node, BoundExpression receiver, BindValueKind kind, BindingDiagnosticBag diagnostics)
1931private static bool RequiresVariableReceiver(BoundExpression receiver, Symbol symbol)
1983private bool CheckPropertyValueKind(SyntaxNode node, BoundExpression expr, BindValueKind valueKind, bool checkingReceiver, BindingDiagnosticBag diagnostics)
1990BoundExpression receiver;
2166static bool isAllowedDespiteReadonly(BoundExpression receiver)
2177bool isAllowedInitOnlySet(BoundExpression receiver)
2208private bool IsBadBaseAccess(SyntaxNode node, BoundExpression receiverOpt, Symbol member, BindingDiagnosticBag diagnostics,
2227BoundExpression expression)
2553var receiver = methodInvocationInfo.Receiver;
2662var receiver = methodInvocationInfo.Receiver;
2695var argument = argsOpt[argIndex];
2742static bool isMixableArgument(BoundExpression argument)
2755static EscapeArgument getReceiver(in MethodInfo methodInfo, BoundExpression receiver)
2781static EscapeArgument getReceiverCore(MethodSymbol? method, BoundExpression receiver)
2807ImmutableArray<BoundExpression> argsOpt,
2814var argument = argsOpt[argIndex];
3147private bool ShouldInferDeclarationExpressionValEscape(BoundExpression argument, [NotNullWhen(true)] out SourceLocalSymbol? localSymbol)
3322void inferDeclarationExpressionValEscape(ImmutableArray<BoundExpression> argsOpt, ArrayBuilder<EscapeValue> escapeValues)
3334foreach (var argument in argsOpt)
3686internal void ValidateEscape(BoundExpression expr, SafeContext escapeTo, bool isByRef, BindingDiagnosticBag diagnostics)
3709internal SafeContext GetRefEscape(BoundExpression expr)
3904ImmutableArray<BoundExpression> arguments;
3986internal bool CheckRefEscape(SyntaxNode node, BoundExpression expr, SafeContext escapeTo, bool checkingReceiver, BindingDiagnosticBag diagnostics)
4201ImmutableArray<BoundExpression> arguments;
4326foreach (var element in expr.Arguments)
4349internal SafeContext GetValEscape(BoundExpression expr)
4531ImmutableArray<BoundExpression> arguments;
4614ImmutableArray<BoundExpression> arguments;
4838private SafeContext GetTupleValEscape(ImmutableArray<BoundExpression> elements)
4841foreach (var element in elements)
4852foreach (var expr in colExpr.Initializers)
4871foreach (var expr in initExpr.Initializers)
4880private SafeContext GetValEscapeOfObjectMemberInitializer(BoundExpression expr)
4985private SafeContext GetValEscape(ImmutableArray<BoundExpression> expressions)
4988foreach (var expression in expressions)
5001internal bool CheckValEscape(SyntaxNode node, BoundExpression expr, SafeContext escapeTo, bool checkingReceiver, BindingDiagnosticBag diagnostics)
5088BoundExpression underlyingReceiver = ((BoundCapturedReceiverPlaceholder)expr).Receiver;
5233ImmutableArray<BoundExpression> arguments;
5358ImmutableArray<BoundExpression> arguments;
5490var clauseValue = ((BoundQueryClause)expr).Value;
5494var variableValue = ((BoundRangeVariable)expr).Value;
5506var accessedExpression = ((BoundPointerElementAccess)expr).Expression;
5510var operandExpression = ((BoundPointerIndirectionOperator)expr).Operand;
5525var result = arm.Value;
5666private SignatureOnlyMethodSymbol GetInlineArrayAccessEquivalentSignatureMethod(BoundInlineArrayAccess elementAccess, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5728private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundConversion conversion, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5734private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundExpression inlineArray, TypeSymbol resultType, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5768private bool CheckTupleValEscape(ImmutableArray<BoundExpression> elements, SafeContext escapeTo, BindingDiagnosticBag diagnostics)
5770foreach (var element in elements)
5785foreach (var expr in colExpr.Initializers)
5810foreach (var expr in initExpr.Initializers)
5824private bool CheckInterpolatedStringHandlerConversionEscape(BoundExpression expression, SafeContext escapeTo, BindingDiagnosticBag diagnostics)
5851private SafeContext GetValEscapeOfInterpolatedStringHandlerCalls(BoundExpression expression)
5876foreach (var part in interpolatedString.Parts)
5892private bool CheckValEscapeOfInterpolatedStringHandlerCalls(BoundExpression expression, SafeContext escapeTo, BindingDiagnosticBag diagnostics)
5917foreach (var part in interpolatedString.Parts)
Binder\Binder.WithQueryLambdaParametersBinder.cs (5)
37protected override BoundExpression BindRangeVariable(SimpleNameSyntax node, RangeVariableSymbol qv, BindingDiagnosticBag diagnostics)
41BoundExpression translation;
72private BoundExpression SelectField(SimpleNameSyntax node, BoundExpression receiver, string name, BindingDiagnosticBag diagnostics)
99var result = BindMemberOfType(node, node, name, 0, invoked: false, indexed: false, receiver, default(SeparatedSyntaxList<TypeSyntax>), default(ImmutableArray<TypeWithAnnotations>), lookupResult, BoundMethodGroupFlags.None, diagnostics);
Binder\Binder_Attributes.cs (12)
188ImmutableArray<BoundExpression> boundConstructorArguments;
524var rhs = BindRValueWithoutTargetType(namedArgument.Expression, diagnostics);
569BoundExpression namedArgumentValue = this.BindValue(namedArgument.Expression, diagnostics, BindValueKind.RValue);
574BoundExpression lvalue;
769public ImmutableArray<TypedConstant> VisitArguments(ImmutableArray<BoundExpression> arguments, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool parentHasErrors = false)
777foreach (var argument in arguments)
843private TypedConstant VisitExpression(BoundExpression node, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool curArgumentHasErrors)
853private TypedConstant VisitExpression(BoundExpression node, TypedConstantKind typedConstantKind, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool curArgumentHasErrors)
903return VisitExpression((BoundExpression)node, diagnostics, ref attrHasErrors, curArgumentHasErrors);
919var operand = node.Operand;
981ImmutableArray<BoundExpression> bounds = node.Bounds;
1020private static TypedConstant CreateTypedConstant(BoundExpression node, TypedConstantKind typedConstantKind, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool curArgumentHasErrors,
Binder\Binder_Await.cs (22)
20private BoundExpression BindAwait(AwaitExpressionSyntax node, BindingDiagnosticBag diagnostics)
24BoundExpression expression = BindRValueWithoutTargetType(node.Expression, diagnostics);
29private BoundAwaitExpression BindAwait(BoundExpression expression, SyntaxNode node, BindingDiagnosticBag diagnostics)
52internal BoundAwaitableInfo BindAwaitInfo(BoundAwaitableValuePlaceholder getAwaiterPlaceholder, SyntaxNode node, BindingDiagnosticBag diagnostics, ref bool hasErrors, BoundExpression? expressionOpt = null)
58out BoundExpression? getAwaiter,
74private bool CouldBeAwaited(BoundExpression expression)
259BoundExpression expression,
260out BoundExpression? getAwaiterGetResultCall,
269BoundExpression expression,
270BoundExpression getAwaiterArgument,
272out BoundExpression? getAwaiter,
275out BoundExpression? getAwaiterGetResultCall,
323bool tryGetRuntimeAwaitHelper(BoundExpression expression, out BoundAwaitableValuePlaceholder? placeholder, out BoundCall? runtimeAwaitCall, BindingDiagnosticBag diagnostics)
374BoundExpression argument = CreateConversion(placeholder, argumentConversion, destination: method.Parameters[0].Type, diagnostics);
555private static bool ValidateAwaitedExpression(BoundExpression expression, SyntaxNode node, BindingDiagnosticBag diagnostics)
583private bool GetGetAwaiterMethod(BoundExpression expression, SyntaxNode node, BindingDiagnosticBag diagnostics, [NotNullWhen(true)] out BoundExpression? getAwaiterCall)
593getAwaiterCall = MakeInvocationExpression(node, expression, WellKnownMemberNames.GetAwaiter, ImmutableArray<BoundExpression>.Empty, diagnostics);
634var qualified = BindInstanceMemberAccess(node, node, receiver, name, 0, default(SeparatedSyntaxList<TypeSyntax>), default(ImmutableArray<TypeWithAnnotations>), invoked: false, indexed: false, diagnostics);
704private bool GetGetResultMethod(BoundExpression awaiterExpression, SyntaxNode node, TypeSymbol awaitedExpressionType, BindingDiagnosticBag diagnostics, out MethodSymbol? getResultMethod, [NotNullWhen(true)] out BoundExpression? getAwaiterGetResultCall)
707getAwaiterGetResultCall = MakeInvocationExpression(node, awaiterExpression, WellKnownMemberNames.GetResult, ImmutableArray<BoundExpression>.Empty, diagnostics);
Binder\Binder_Conversions.cs (86)
20internal BoundExpression CreateConversion(
21BoundExpression source,
32internal BoundExpression CreateConversion(
33BoundExpression source,
41internal BoundExpression CreateConversion(
43BoundExpression source,
54protected BoundExpression CreateConversion(
56BoundExpression source,
67var result = createConversion(syntax, source, conversion, isCast, conversionGroupOpt, inConversionGroupFlags, wasCompilerGenerated, destination, diagnostics, hasErrors);
80var result2 = createConversion(syntax, placeholder2, conversion, isCast, conversionGroupOpt: new ConversionGroup(conversion), InConversionGroupFlags.Unspecified, wasCompilerGenerated, destination, BindingDiagnosticBag.Discarded, hasErrors);
84static bool filterConversion(Conversion conversion, BoundExpression result)
134BoundExpression createConversion(
136BoundExpression source,
201var convertedSwitch = ConvertSwitchExpression((BoundUnconvertedSwitchExpression)source, destination, conversionIfTargetTyped: conversion, diagnostics);
217var convertedConditional = ConvertConditionalExpression((BoundUnconvertedConditionalOperator)source, destination, conversionIfTargetTyped: conversion, diagnostics);
359void reportUseSiteDiagnostics(SyntaxNode syntax, Conversion conversion, BoundExpression source, TypeSymbol destination, BindingDiagnosticBag diagnostics)
374void ensureAllUnderlyingConversionsChecked(SyntaxNode syntax, BoundExpression source, Conversion conversion, bool wasCompilerGenerated, TypeSymbol destination, BindingDiagnosticBag diagnostics)
471void checkConstraintLanguageVersionAndRuntimeSupportForConversion(SyntaxNode syntax, Conversion conversion, BoundExpression source, TypeSymbol destination, BindingDiagnosticBag diagnostics)
776private BoundExpression BindUnconvertedInterpolatedExpressionToFormattableStringFactory(BoundUnconvertedInterpolatedString unconvertedSource, TypeSymbol destination, BindingDiagnosticBag diagnostics)
781ImmutableArray<BoundExpression> parts = BindInterpolatedStringPartsForFactory(unconvertedSource, diagnostics, out bool haveErrors);
810private static BoundExpression ConvertObjectCreationExpression(
815BoundExpression expr = bindObjectCreationExpression(node.Syntax, node.InitializerOpt, node.Binder, destination.StrippedType(), arguments, diagnostics);
844static BoundExpression bindObjectCreationExpression(
908CollectionExpressionTypeKind collectionTypeKind, ImmutableArray<BoundNode> elements, BoundObjectOrCollectionValuePlaceholder? placeholder = null, BoundExpression? collectionCreation = null, MethodSymbol? collectionBuilderMethod = null, BoundCollectionBuilderElementsPlaceholder? collectionBuilderElementsPlaceholder = null)
1037var collectionCreation = bindCollectionConstructorConstruction(in this, _node.WithElement?.Syntax ?? _node.Syntax, constructor);
1067ImmutableArray.Create((BoundExpression)element),
1080static BoundExpression bindCollectionConstructorConstruction(
1095BoundExpression collectionCreation;
1156(BoundExpression)element,
1179var convertElement = @this._binder.CreateConversion(
1244static BoundExpression? bindCollectionArrayInterfaceConstruction(ref readonly CollectionExpressionConverter @this)
1329static (BoundExpression? collectionCreation, MethodSymbol? collectionBuilderMethod, BoundCollectionBuilderElementsPlaceholder? elementsPlaceholder) bindCollectionBuilderInfo(
1379var projectionInvocationExpression = @this._binder.BindInvocationExpression(
1452var collectionCreation = @this._binder.CreateConversion(builderCall, @this._targetType, @this._diagnostics);
1868BoundExpression receiver,
1873var boundExpression = addMethodBinder.BindInstanceMemberAccess(
2111ImmutableArray.Create<BoundExpression>(methodGroup.ReceiverOpt, new BoundValuePlaceholder(syntax, secondArgumentType) { WasCompilerGenerated = true }),
2201internal static BoundExpression GetUnderlyingCollectionExpressionElement(BoundCollectionExpression expr, BoundExpression element, bool throwOnErrors)
2237static BoundExpression getCollectionInitializerElement(BoundCollectionElementInitializer collectionInitializer)
2240var arg = collectionInitializer.Arguments[argIndex];
2250else if (arg is BoundConversion { Operand: BoundCollectionExpression { Elements: [BoundExpression collectionElement] } })
2264BoundExpression collectionExpr = new BoundValuePlaceholder(syntax, collectionType);
2292var withArgumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(withArguments.Length);
2293foreach (var argument in withArguments)
2305elementsBuilder.Add(element is BoundExpression expression
2401Conversion elementConversion = Conversions.ClassifyImplicitConversionFromExpression((BoundExpression)element, elementType, ref useSiteInfo);
2404GenerateImplicitConversionError(diagnostics, element.Syntax, elementConversion, (BoundExpression)element, elementType);
2423private BoundExpression ConvertConditionalExpression(
2434var condition = source.Condition;
2437var trueExpr =
2441var falseExpr =
2466private BoundExpression ConvertSwitchExpression(BoundUnconvertedSwitchExpression source, TypeSymbol destination, Conversion? conversionIfTargetTyped, BindingDiagnosticBag diagnostics, bool hasErrors = false)
2476var oldValue = oldCase.Value;
2477var newValue =
2493private BoundExpression CreateUserDefinedConversion(
2495BoundExpression source,
2557BoundExpression convertedOperand = CreateConversion(
2592BoundExpression userDefinedConversion;
2664BoundExpression finalConversion = CreateConversion(
2682private BoundExpression CreateUnionConversion(
2684BoundExpression source,
2709BoundExpression convertedOperand = CreateConversion(
2741BoundExpression finalConversion = CreateConversion(
2759private BoundExpression CreateFunctionTypeConversion(
2760SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast,
2787BoundExpression expr;
2820private BoundExpression CreateAnonymousFunctionConversion(
2821SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast,
2851private BoundExpression CreateMethodGroupConversion(
2852SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast,
3012private BoundExpression CreateStackAllocConversion(
3013SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast,
3052private BoundExpression CreateTupleLiteralConversion(
3109var convertedArguments = ArrayBuilder<BoundExpression>.GetInstance(arguments.Length);
3118var argument = arguments[i];
3125BoundExpression result = new BoundConvertedTupleLiteral(
3187BoundExpression? receiverOpt = group.ReceiverOpt;
3215private bool MemberGroupFinalValidation(BoundExpression? receiverOpt, MethodSymbol methodSymbol, SyntaxNode node, BindingDiagnosticBag diagnostics, bool invokedAsExtensionMethod)
3290private bool MemberGroupFinalValidationAccessibilityChecks(BoundExpression? receiverOpt, Symbol memberSymbol, SyntaxNode node, BindingDiagnosticBag diagnostics, bool invokedAsExtensionMethod)
3400private static bool IsMemberAccessedThroughVariableOrValue(BoundExpression? receiverOpt)
3410internal static bool IsMemberAccessedThroughType([NotNullWhen(true)] BoundExpression? receiverOpt)
3428internal static bool WasImplicitReceiver([NotNullWhen(false)] BoundExpression? receiverOpt)
3446internal bool MethodIsCompatibleWithDelegateOrFunctionPointer(BoundExpression? receiverOpt, bool isExtensionMethod, MethodSymbol method, TypeSymbol delegateType, Location errorLocation, BindingDiagnosticBag diagnostics)
3632BoundExpression? receiverOpt,
3730BoundExpression source,
Binder\Binder_Deconstruct.cs (28)
29internal BoundExpression BindDeconstruction(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics, bool resultIsUsedOverride = false)
99BoundExpression boundRight = rightPlaceholder ?? BindValue(right, deconstructionDiagnostics, BindValueKind.RValue);
115BoundExpression boundRHS,
209private BoundExpression FixTupleLiteral(ArrayBuilder<DeconstructionVariable> checkedVariables, BoundExpression boundRHS, CSharpSyntaxNode syntax, BindingDiagnosticBag diagnostics)
278BoundExpression deconstructInvocation = MakeDeconstructInvocationExpression(variables.Count,
296var nestedConversions = ArrayBuilder<(BoundValuePlaceholder?, BoundExpression?)>.GetInstance(count);
321var single = variable.Single;
369private BoundExpression SetInferredType(BoundExpression expression, TypeSymbol type, BindingDiagnosticBag diagnostics)
409BoundExpression errorLocal = ((DeconstructionVariablePendingInference)variable.Single).FailInference(this, diagnostics);
434internal readonly BoundExpression? Single;
438internal DeconstructionVariable(BoundExpression variable, SyntaxNode syntax)
482BoundExpression element = rhsLiteral.Arguments[i];
551var valuesBuilder = ArrayBuilder<BoundExpression>.GetInstance(count);
558BoundExpression value;
574ImmutableArray<BoundExpression> arguments = valuesBuilder.ToImmutableAndFree();
597private static string? ExtractDeconstructResultElementName(BoundExpression expression)
613private BoundExpression MakeDeconstructInvocationExpression(
615BoundExpression receiver,
640var variableOpt = variablesOpt?[i].Single;
654var memberAccess = BindInstanceMemberAccess(
672BoundExpression result = BindMethodGroupInvocation(
717private BoundBadExpression MissingDeconstruct(BoundExpression receiver, SyntaxNode rightSyntax, int numParameters, BindingDiagnosticBag diagnostics,
718out ImmutableArray<BoundDeconstructValuePlaceholder> outPlaceholders, BoundExpression childNode)
793var boundVariable = BindExpression(node, diagnostics, invoked: false, indexed: false);
794var checkedVariable = CheckValue(boundVariable, BindValueKind.Assignable, diagnostics);
867private BoundExpression BindDeconstructionVariable(
Binder\Binder_Expressions.cs (405)
26/// This portion of the binder converts an <see cref="ExpressionSyntax"/> into a <see cref="BoundExpression"/>.
126private BoundBadExpression BadExpression(SyntaxNode syntax, BoundExpression childNode)
134private BoundBadExpression BadExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> childNodes)
150protected BoundBadExpression BadExpression(SyntaxNode syntax, LookupResultKind lookupResultKind, BoundExpression childNode)
163ImmutableArray<BoundExpression>.Empty,
171private BoundBadExpression BadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol> symbols, BoundExpression childNode)
180internal BoundExpression AdjustBadExpressionChild(BoundExpression childNode)
196private BoundBadExpression BadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol> symbols, ImmutableArray<BoundExpression> childNodes, bool wasCompilerGenerated = false)
218private BoundExpression ToBadExpression(BoundExpression expr, LookupResultKind resultKind = LookupResultKind.Empty)
260internal BoundExpression BindValue(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BindValueKind valueKind)
262var result = this.BindExpression(node, diagnostics: diagnostics, invoked: false, indexed: false);
266internal BoundExpression BindRValueWithoutTargetType(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool reportNoTargetType = true)
275internal BoundExpression BindTypeOrRValue(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
277var valueOrType = BindExpression(node, diagnostics: diagnostics, invoked: false, indexed: false);
288internal BoundExpression BindToTypeForErrorRecovery(BoundExpression expression, TypeSymbol type = null)
293internal BoundExpression BindToTypeForErrorRecovery(BoundExpression expression, BindingDiagnosticBag diagnostics, TypeSymbol type = null)
297var result =
311internal BoundExpression BindToNaturalType(BoundExpression expression, BindingDiagnosticBag diagnostics, bool reportNoTargetType = true)
316BoundExpression result;
369var boundArgs = ArrayBuilder<BoundExpression>.GetInstance(sourceTuple.Arguments.Length);
370foreach (var arg in sourceTuple.Arguments)
446private BoundExpression BindToInferredDelegateType(BoundExpression expr, BindingDiagnosticBag diagnostics)
467internal BoundExpression BindValueAllowArgList(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BindValueKind valueKind)
469var result = this.BindExpressionAllowArgList(node, diagnostics: diagnostics);
488BoundExpression result = initializerBinder.BindVariableOrAutoPropInitializerValue(initializerOpt, field.RefKind,
501internal BoundExpression BindVariableOrAutoPropInitializerValue(
515BoundExpression initializer = BindPossibleArrayInitializer(value, varType, valueKind, diagnostics);
534out BoundExpression valueBeforeConversion)
563var initializer = initializerBinder.BindValue(equalsValueSyntax.Value, diagnostics, BindValueKind.RValue);
568public BoundExpression BindExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
573protected BoundExpression BindExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool invoked, bool indexed)
575BoundExpression expr = BindExpressionInternal(node, diagnostics, invoked, indexed);
591protected BoundExpression BindExpressionAllowArgList(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
593BoundExpression expr = BindExpressionInternal(node, diagnostics, invoked: false, indexed: false);
598private void CheckContextForPointerTypes(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BoundExpression expr)
611private BoundExpression BindExpressionInternal(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool invoked, bool indexed)
618BoundExpression result = bindExpressionInternal(node, diagnostics, invoked, indexed);
627BoundExpression bindExpressionInternal(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool invoked, bool indexed)
888private BoundExpression BindRefExpression(RefExpressionSyntax node, BindingDiagnosticBag diagnostics)
893node, LookupResultKind.Empty, ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(BindToTypeForErrorRecovery(BindValue(node.Expression, BindingDiagnosticBag.Discarded, BindValueKind.RefersToLocation))),
897private BoundExpression BindRefType(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
904private BoundExpression BindScopedType(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
911private BoundExpression BindThrowExpression(ThrowExpressionSyntax node, BindingDiagnosticBag diagnostics)
922var thrownExpression = BindThrownExpression(node.Expression, diagnostics, ref hasErrors);
961private BoundExpression BindDeclarationExpressionAsError(DeclarationExpressionSyntax node, BindingDiagnosticBag diagnostics)
978private BoundExpression BindDeclarationVariablesForErrorRecovery(TypeWithAnnotations declTypeWithAnnotations, VariableDesignationSyntax node, CSharpSyntaxNode syntax, BindingDiagnosticBag diagnostics)
986var result = BindDeconstructionVariable(declTypeWithAnnotations, single, syntax, diagnostics);
997var builder = ArrayBuilder<BoundExpression>.GetInstance(count);
1005ImmutableArray<BoundExpression> subExpressions = builder.ToImmutableAndFree();
1034private BoundExpression BindTupleExpression(TupleExpressionSyntax node, BindingDiagnosticBag diagnostics)
1046ImmutableArray<BoundExpression>.Empty;
1053var boundArguments = ArrayBuilder<BoundExpression>.GetInstance(arguments.Count);
1075BoundExpression boundArgument = BindValue(argumentSyntax.Expression, diagnostics, BindValueKind.RValue);
1081ImmutableArray.Create<BoundExpression>(boundArgument), CreateErrorType("void"));
1251private BoundExpression BindRefValue(RefValueExpressionSyntax node, BindingDiagnosticBag diagnostics)
1256BoundExpression argument = BindValue(node.Expression, diagnostics, BindValueKind.RValue);
1276private BoundExpression BindMakeRef(MakeRefExpressionSyntax node, BindingDiagnosticBag diagnostics)
1279BoundExpression argument = this.BindValue(node.Expression, diagnostics, BindValueKind.RefOrOut);
1300private BoundExpression BindRefType(RefTypeExpressionSyntax node, BindingDiagnosticBag diagnostics)
1304BoundExpression argument = BindValue(node.Expression, diagnostics, BindValueKind.RValue);
1322private BoundExpression BindArgList(CSharpSyntaxNode node, BindingDiagnosticBag diagnostics)
1389private BoundExpression BindQualifiedName(QualifiedNameSyntax node, BindingDiagnosticBag diagnostics)
1394private BoundExpression BindParenthesizedExpression(ExpressionSyntax innerExpression, BindingDiagnosticBag diagnostics)
1396var result = BindExpression(innerExpression, diagnostics);
1406private BoundExpression BindTypeOf(TypeOfExpressionSyntax node, BindingDiagnosticBag diagnostics)
1461private BoundExpression BindSizeOf(SizeOfExpressionSyntax node, BindingDiagnosticBag diagnostics)
1477private BoundExpression BindFieldExpression(FieldExpressionSyntax node, BindingDiagnosticBag diagnostics)
1627private BoundExpression BindDefaultExpression(DefaultExpressionSyntax node, BindingDiagnosticBag diagnostics)
1640private BoundExpression BindIdentifier(
1673BoundExpression expression;
1707var receiver = SynthesizeMethodGroupReceiver(node, members);
1945private BoundExpression SynthesizeMethodGroupReceiver(CSharpSyntaxNode syntax, ArrayBuilder<Symbol> members)
2055private BoundExpression BindNonMethod(SimpleNameSyntax node, Symbol symbol, BindingDiagnosticBag diagnostics, LookupResultKind resultKind, bool indexed, bool isError)
2191BoundExpression receiver = SynthesizeReceiver(node, symbol, diagnostics);
2197BoundExpression receiver = SynthesizeReceiver(node, symbol, diagnostics);
2203BoundExpression receiver = SynthesizeReceiver(node, symbol, diagnostics);
2361protected virtual BoundExpression BindRangeVariable(SimpleNameSyntax node, RangeVariableSymbol qv, BindingDiagnosticBag diagnostics)
2366private BoundExpression SynthesizeReceiver(SyntaxNode node, Symbol member, BindingDiagnosticBag diagnostics)
2442private BoundExpression TryBindInteractiveReceiver(SyntaxNode syntax, NamedTypeSymbol memberDeclaringType)
2484public BoundExpression BindNamespaceOrTypeOrExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2510public BoundExpression BindLabel(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2538public BoundExpression BindNamespaceOrType(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2544public BoundExpression BindNamespaceAlias(IdentifierNameSyntax node, BindingDiagnosticBag diagnostics)
2550private static BoundExpression CreateBoundNamespaceOrTypeExpression(ExpressionSyntax node, Symbol symbol)
2658private BoundExpression BindCast(CastExpressionSyntax node, BindingDiagnosticBag diagnostics)
2660BoundExpression operand = this.BindValue(node.Expression, diagnostics, BindValueKind.RValue);
2676private BoundExpression BindFromEndIndexExpression(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
2685BoundExpression boundOperand = BindValue(node.Operand, diagnostics, BindValueKind.RValue);
2713BoundExpression boundConversion = CreateConversion(boundOperand, conversion, intType, diagnostics);
2719private BoundExpression BindRangeExpression(RangeExpressionSyntax node, BindingDiagnosticBag diagnostics)
2765BoundExpression left = BindRangeExpressionOperand(node.LeftOperand, diagnostics);
2766BoundExpression right = BindRangeExpressionOperand(node.RightOperand, diagnostics);
2786private BoundExpression BindRangeExpressionOperand(ExpressionSyntax operand, BindingDiagnosticBag diagnostics)
2793BoundExpression boundOperand = BindValue(operand, diagnostics, BindValueKind.RValue);
2822private BoundExpression BindCastCore(ExpressionSyntax node, BoundExpression operand, TypeWithAnnotations targetTypeWithAnnotations, bool wasCompilerGenerated, BindingDiagnosticBag diagnostics)
2844BoundExpression operand,
2969ImmutableArray<BoundExpression> tupleArguments,
2981var argument = tupleArguments[i];
3001private BoundExpression BindExplicitNullableCastFromNonNullable(ExpressionSyntax node, BoundExpression operand, TypeWithAnnotations targetTypeWithAnnotations, BindingDiagnosticBag diagnostics)
3019var underlyingExpr = BindCastCore(node, operand, underlyingTargetTypeWithAnnotations, wasCompilerGenerated: false, diagnostics: bag);
3035var result = BindCastCore(node, operand, targetTypeWithAnnotations, wasCompilerGenerated: operand.WasCompilerGenerated, diagnostics: bag2);
3177BoundExpression boundArgument = BindArgumentValue(diagnostics, argumentSyntax, allowArglist, refKind);
3191var arg = result.Argument(0);
3208private BoundExpression BindArgumentValue(BindingDiagnosticBag diagnostics, ArgumentSyntax argumentSyntax, bool allowArglist, RefKind refKind)
3228private BoundExpression BindOutDeclarationArgument(DeclarationExpressionSyntax declarationExpression, BindingDiagnosticBag diagnostics)
3265private BoundExpression BindOutVariableDeclarationArgument(
3330BoundExpression receiver = SynthesizeReceiver(designation, expressionVariableField, diagnostics);
3407BoundExpression boundArgumentExpression,
3475private BoundExpression BindArgumentExpression(BindingDiagnosticBag diagnostics, ExpressionSyntax argumentExpression, RefKind refKind, bool allowArglist)
3484BoundExpression argument;
3503BoundExpression? receiver,
3511ArrayBuilder<BoundExpression>? paramsArgsBuilder = null;
3519BoundExpression argument = arguments[arg];
3558BoundExpression coerceArgument(
3560BoundExpression? receiver,
3562ArrayBuilder<BoundExpression>? argumentsForInterpolationConversion,
3563BoundExpression argument,
3570BoundExpression coercedArgument = argument;
3615static ArrayBuilder<BoundExpression> collectParamsArgs(
3618ArrayBuilder<BoundExpression> arguments,
3623var paramsArgsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
3649BoundExpression? receiver,
3653ArrayBuilder<BoundExpression> paramsArgsBuilder,
3679ImmutableArray<BoundExpression> collectionArgs = paramsArgsBuilder.ToImmutableAndFree();
3682BoundExpression collection = CreateParamsCollection(node, parameters[paramsIndex], collectionArgs, diagnostics);
3722void reportUnsafeIfNeeded(MemberResolutionResult<TMember> methodResult, BindingDiagnosticBag diagnostics, BoundExpression argument, TypeWithAnnotations parameterTypeWithAnnotations)
3739BoundExpression bindInterpolatedStringHandlerInMemberCall(
3740BoundExpression unconvertedString,
3742ArrayBuilder<BoundExpression>? arguments,
3746BoundExpression? receiver,
3956var interpolatedString = BindUnconvertedInterpolatedExpressionToHandlerType(
3977private void CheckArgumentRefKind(RefKind argRefKind, BoundExpression argument, int arg, ParameterSymbol parameter,
4049private BoundExpression BindArrayCreationExpression(ArrayCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
4133ArrayBuilder<BoundExpression> sizes = ArrayBuilder<BoundExpression>.GetInstance();
4138var size = BindArrayDimension(arg, diagnostics, ref hasErrors);
4159var size = BindRValueWithoutTargetType(arg, diagnostics);
4168ImmutableArray<BoundExpression> arraySizes = sizes.ToImmutableAndFree();
4175private BoundExpression BindArrayDimension(ExpressionSyntax dimension, BindingDiagnosticBag diagnostics, ref bool hasErrors)
4180var size = BindValue(dimension, diagnostics, BindValueKind.RValue);
4200private BoundExpression BindImplicitArrayCreationExpression(ImplicitArrayCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
4208ImmutableArray<BoundExpression> boundInitializerExpressions = BindArrayInitializerExpressions(initializer, diagnostics, dimension: 1, rank: rank);
4229sizes: ImmutableArray<BoundExpression>.Empty, boundInitExprOpt: boundInitializerExpressions);
4232private BoundExpression BindImplicitStackAllocArrayCreationExpression(ImplicitStackAllocArrayCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
4235ImmutableArray<BoundExpression> boundInitializerExpressions = BindArrayInitializerExpressions(initializer, diagnostics, dimension: 1, rank: 1);
4267private ImmutableArray<BoundExpression> BindArrayInitializerExpressions(InitializerExpressionSyntax initializer, BindingDiagnosticBag diagnostics, int dimension, int rank)
4269var exprBuilder = ArrayBuilder<BoundExpression>.GetInstance();
4284private void BindArrayInitializerExpressions(InitializerExpressionSyntax initializer, ArrayBuilder<BoundExpression> exprBuilder, BindingDiagnosticBag diagnostics, int dimension, int rank)
4296var boundExpression = BindValue(expression, diagnostics, BindValueKind.RValue);
4313var boundExpression = BindValue(expression, diagnostics, BindValueKind.RValue);
4355ImmutableArray<BoundExpression> boundInitExpr,
4361ArrayBuilder<BoundExpression> initializers = ArrayBuilder<BoundExpression>.GetInstance();
4371BoundExpression boundExpression = boundInitExpr[boundInitExprIndex];
4374BoundExpression convertedExpression = GenerateConversionForAssignment(elemType, boundExpression, diagnostics);
4383BoundExpression init = null;
4436ImmutableArray<BoundExpression> boundInitExprOpt = default(ImmutableArray<BoundExpression>))
4503ImmutableArray<BoundExpression> sizes,
4504ImmutableArray<BoundExpression> boundInitExprOpt = default(ImmutableArray<BoundExpression>),
4531var size = sizes[i];
4556BoundExpression[] sizeArray = new BoundExpression[rank];
4582private BoundExpression BindStackAllocArrayCreationExpression(
4595ImmutableArray<BoundExpression>.Empty,
4618var builder = ArrayBuilder<BoundExpression>.GetInstance();
4639BoundExpression count = null;
4743private BoundExpression BindStackAllocWithInitializer(
4749BoundExpression sizeOpt,
4752ImmutableArray<BoundExpression> boundInitExprOpt = default)
4795private static int? GetIntegerConstantForArraySize(BoundExpression expression)
4816private static bool IsNegativeConstantForArraySize(BoundExpression expression)
4862internal BoundExpression BindConstructorInitializer(
4874var result = (argumentListBinder ?? this).BindConstructorInitializerCore(initializerArgumentListOpt, constructor, diagnostics);
4886private BoundExpression BindConstructorInitializerCore(
5047private BoundExpression BindConstructorInitializerCoreContinued(
5080BoundExpression receiver = ThisReference(nonNullSyntax, initializerType, wasCompilerGenerated: true);
5222private static (ParameterSymbol, SyntaxNode) TryGetPrimaryConstructorParameterUsedAsValue(SynthesizedPrimaryConstructor primaryConstructor, BoundExpression boundExpression)
5257private BoundExpression BindImplicitObjectCreationExpression(ImplicitObjectCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
5274protected BoundExpression BindObjectCreationExpression(ObjectCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
5276BoundExpression result = bindObjectCreationExpression(node, diagnostics);
5283BoundExpression bindObjectCreationExpression(ObjectCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
5334private BoundExpression BindCollectionExpression(CollectionExpressionSyntax syntax, BindingDiagnosticBag diagnostics, int nestingLevel = 0)
5341return new BoundBadExpression(syntax, LookupResultKind.Empty, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, CreateErrorType());
5387var expression = @this.BindRValueWithoutTargetType(syntax.Expression, diagnostics);
5416var convertedExpression = @this.ConvertForEachCollection(expressionPlaceholder, conversion, collectionType, diagnostics);
5418BoundExpression? lengthOrCount;
5461var arg = arguments[i];
5504private BoundExpression BindDelegateCreationExpression(ObjectCreationExpressionSyntax node, NamedTypeSymbol type, BindingDiagnosticBag diagnostics)
5508var result = BindDelegateCreationExpression(node, type, analyzedArguments, node.Initializer, wasTargetTyped: false, diagnostics);
5513private BoundExpression BindDelegateCreationExpression(SyntaxNode node, NamedTypeSymbol type, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax initializerOpt, bool wasTargetTyped, BindingDiagnosticBag diagnostics)
5547BoundExpression argument = analyzedArguments.Arguments.Count >= 1 ? BindToNaturalType(analyzedArguments.Arguments[0], diagnostics) : null;
5682private BoundExpression BindClassCreationExpression(ObjectCreationExpressionSyntax node, NamedTypeSymbol type, string typeName, BindingDiagnosticBag diagnostics, TypeSymbol initializerType = null)
5716private BoundExpression MakeConstructorInvocation(
5718ArrayBuilder<BoundExpression> arguments,
5737var creation = BindClassCreationExpression(node, type.Name, node, type, analyzedArguments, diagnostics);
5747internal BoundExpression BindObjectCreationForErrorRecovery(BoundUnconvertedObjectCreationExpression node, BindingDiagnosticBag diagnostics)
5755private BoundExpression MakeBadExpressionForObjectCreation(ObjectCreationExpressionSyntax node, TypeSymbol type, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics, bool wasCompilerGenerated = false)
5763var children = ArrayBuilder<BoundExpression>.GetInstance();
5811private BoundExpression BindInitializerExpressionOrValue(
5863var initializers = ArrayBuilder<BoundExpression>.GetInstance(initializerSyntax.Expressions.Count);
5869BoundExpression boundMemberInitializer = BindInitializerMemberAssignment(
5884private BoundExpression BindInitializerMemberAssignment(
5906BoundExpression boundLeft = objectInitializerMemberBinder.BindObjectInitializerMember(initializer, implicitReceiver, diagnostics);
5917BoundExpression boundRight = BindInitializerExpressionOrValue(
5940var boundNode = objectInitializerMemberBinder.BindObjectInitializerMemberMissingAssignment(identifierName, implicitReceiver, diagnostics);
5962var boundExpression = BindValue(memberInitializer, diagnostics, BindValueKind.RValue);
5968private BoundExpression BindObjectInitializerMember(
5984private BoundExpression BindObjectInitializerMemberMissingAssignment(
5994private BoundExpression BindObjectInitializerMemberCommon(
6001BoundExpression boundMember;
6083ImmutableArray<BoundExpression> arguments = ImmutableArray<BoundExpression>.Empty;
6135foreach (var argument in arguments)
6233private BoundExpression BadObjectInitializerMemberAccess(
6234BoundExpression boundMember,
6275private static void ReportDuplicateObjectMemberInitializers(BoundExpression boundMemberInitializer, HashSet<string> memberNameMap, BindingDiagnosticBag diagnostics)
6317ImmutableArray<BoundExpression> initializers,
6336foreach (var initializer in initializers)
6427var initializerBuilder = ArrayBuilder<BoundExpression>.GetInstance();
6452BoundExpression boundElementInitializer = BindCollectionInitializerElement(elementInitializer, initializerType,
6497private BoundExpression BindCollectionInitializerElement(
6527var boundElementInitializer = BindInitializerExpressionOrValue(elementInitializer, initializerType, BindValueKind.RValue, implicitReceiver.Syntax, diagnostics);
6529BoundExpression result = BindCollectionInitializerElementAddMethod(
6542private BoundExpression BindComplexElementInitializerExpression(
6553var exprBuilder = ArrayBuilder<BoundExpression>.GetInstance();
6574private BoundExpression BindUnexpectedComplexElementInitializer(InitializerExpressionSyntax node, BindingDiagnosticBag diagnostics)
6581private BoundExpression BindCollectionInitializerElementAddMethod(
6583ImmutableArray<BoundExpression> boundElementInitializerExpressions,
6614var result = bindCollectionInitializerElementAddMethod(elementInitializer, boundElementInitializerExpressions, collectionInitializerAddMethodBinder, diagnostics, implicitReceiver);
6633BoundExpression bindCollectionInitializerElementAddMethod(
6635ImmutableArray<BoundExpression> boundElementInitializerExpressions,
6661var addMethodInvocation = collectionInitializerAddMethodBinder.MakeInvocationExpression(
6757var addMethodInvocation = BindCollectionInitializerElementAddMethod(
6759ImmutableArray.Create((BoundExpression)addElementPlaceholder),
6835protected BoundExpression BindClassCreationExpression(
6853BoundExpression result = null;
7019private BoundExpression CreateBadClassCreationExpression(
7069var childNodes = ArrayBuilder<BoundExpression>.GetInstance();
7092private BoundExpression BindInterfaceCreationExpression(ObjectCreationExpressionSyntax node, NamedTypeSymbol type, BindingDiagnosticBag diagnostics)
7096var result = BindInterfaceCreationExpression(node, type, diagnostics, node.Type, analyzedArguments, node.Initializer, wasTargetTyped: false);
7101private BoundExpression BindInterfaceCreationExpression(SyntaxNode node, NamedTypeSymbol type, BindingDiagnosticBag diagnostics, SyntaxNode typeNode, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax initializerOpt, bool wasTargetTyped)
7127private BoundExpression BindComImportCoClassCreationExpression(SyntaxNode node, NamedTypeSymbol interfaceType, NamedTypeSymbol coClassType, BindingDiagnosticBag diagnostics, SyntaxNode typeNode, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax initializerOpt, bool wasTargetTyped)
7165var classCreation = BindClassCreationExpression(
7208private BoundExpression BindNoPiaObjectCreationExpression(
7250private BoundExpression BindTypeParameterCreationExpression(ObjectCreationExpressionSyntax node, TypeParameterSymbol typeParameter, BindingDiagnosticBag diagnostics)
7254var result = BindTypeParameterCreationExpression(node, typeParameter, analyzedArguments, node.Initializer, node.Type, wasTargetTyped: false, diagnostics);
7271private BoundExpression BindTypeParameterCreationExpression(
7614private BoundExpression BindCheckedExpression(CheckedExpressionSyntax node, BindingDiagnosticBag diagnostics)
7623private BoundExpression BindMemberAccess(
7632BoundExpression boundLeft;
7681private BoundExpression BindLeftOfPotentialColorColorMemberAccess(ExpressionSyntax left, BindingDiagnosticBag diagnostics)
7694private BoundExpression BindLeftIdentifierOfPotentialColorColorMemberAccess(IdentifierNameSyntax left, BindingDiagnosticBag diagnostics)
7764var boundType = BindNamespaceOrType(left, BindingDiagnosticBag.Discarded);
7776var boundValue = bindAsValue(left, diagnostics);
7782BoundExpression bindAsValue(IdentifierNameSyntax left, BindingDiagnosticBag diagnostics)
7814private BoundExpression BindDynamicMemberAccess(
7816BoundExpression boundLeft,
7879/// <see cref="MakeQueryInvocation(CSharpSyntaxNode, BoundExpression, string, SeparatedSyntaxList{TypeSyntax}, ImmutableArray{TypeWithAnnotations}, ImmutableArray{BoundExpression}, BindingDiagnosticBag, string?)"/>.
7891private BoundExpression BindMemberAccessWithBoundLeft(
7893BoundExpression boundLeft,
7976BoundExpression result;
8041BoundExpression tryBindMemberAccessWithBoundNamespaceLeft(
8044BoundExpression boundLeft,
8114BoundExpression tryBindMemberAccessWithBoundTypeLeft(
8116BoundExpression boundLeft,
8165var nonMethodExtensionMember = ResolveExtensionMemberAccessIfResultIsNonMethod(node, boundLeft, rightName,
8182private void WarnOnAccessOfOffDefault(SyntaxNode node, BoundExpression boundLeft, BindingDiagnosticBag diagnostics)
8196private BoundExpression MakeMemberAccessValue(BoundExpression expr, BindingDiagnosticBag diagnostics)
8244internal BoundExpression? ResolveExtensionMemberAccessIfResultIsNonMethod(SyntaxNode syntax, BoundExpression receiver, string name,
8273private BoundExpression GetExtensionMemberAccess(SyntaxNode syntax, BoundExpression? receiver, Symbol extensionMember, BindingDiagnosticBag diagnostics)
8300private BoundExpression BindInstanceMemberAccess(
8303BoundExpression boundLeft,
8353var nonMethodExtensionMember = ResolveExtensionMemberAccessIfResultIsNonMethod(node, boundLeft, rightName,
8375private BoundMethodGroup MakeBoundMethodGroupAndCheckOmittedTypeArguments(BoundExpression boundLeft, string rightName,
8428BoundExpression boundLeft,
8507private BoundExpression BindMemberAccessBadResult(BoundMethodGroup node)
8517private BoundExpression BindMemberAccessBadResult(
8520BoundExpression boundLeft,
8559boundLeft == null ? ImmutableArray<BoundExpression>.Empty : ImmutableArray.Create(AdjustBadExpressionChild(BindToTypeForErrorRecovery(boundLeft))),
8591private static void CombineExtensionMethodArguments(BoundExpression receiver, AnalyzedArguments? originalArguments, AnalyzedArguments extensionMethodArguments)
8621private static void InitializeExtensionPropertyArguments(BoundExpression receiver, AnalyzedArguments extensionPropertyArguments)
8635private BoundExpression BindMemberOfType(
8642BoundExpression left,
8655BoundExpression result;
8722boundDimensionsOpt: ImmutableArray<BoundExpression>.Empty,
8762BoundExpression left,
8842BoundExpression left,
8954BoundExpression left,
9039BoundExpression left,
9079BoundExpression left,
9117private bool AllowRefOmittedArguments(BoundExpression receiver)
9125protected BoundExpression BindFieldAccess(
9127BoundExpression receiver,
9231BoundExpression expr = new BoundFieldAccess(node, receiver, fieldSymbol, constantValueOpt, resultKind, fieldType, hasErrors: (hasErrors || hasError));
9304private BoundExpression BindPropertyAccess(
9306BoundExpression? receiver,
9331private void CheckReceiverAndRuntimeSupportForSymbolAccess(SyntaxNode node, BoundExpression receiverOpt, Symbol symbol, BindingDiagnosticBag diagnostics)
9390private BoundExpression BindEventAccess(
9392BoundExpression receiver,
9418private static bool? IsInstanceReceiver(BoundExpression receiver)
9443BoundExpression receiver,
9611private BoundExpression BindElementAccess(ElementAccessExpressionSyntax node, BindingDiagnosticBag diagnostics)
9613BoundExpression receiver = BindExpression(node.Expression, diagnostics: diagnostics, invoked: false, indexed: true);
9614var result = BindElementAccess(node, receiver, node.ArgumentList, allowInlineArrayElementAccess: true, diagnostics);
9625private BoundExpression BindElementAccess(ExpressionSyntax node, BoundExpression receiver, BracketedArgumentListSyntax argumentList, bool allowInlineArrayElementAccess, BindingDiagnosticBag diagnostics)
9650private BoundExpression BindElementOrIndexerAccess(ExpressionSyntax node, BoundExpression expr, AnalyzedArguments analyzedArguments, bool allowInlineArrayElementAccess, BindingDiagnosticBag diagnostics)
9697BoundExpression result = BindElementAccessCore(node, expr, analyzedArguments, diagnosticsForBindElementAccessCore);
9716BoundExpression tryImplicitConversionToInlineArrayIndex(ExpressionSyntax node, BoundExpression index, BindingDiagnosticBag diagnostics, out WellKnownType indexOrRangeWellknownType)
9719BoundExpression convertedIndex = TryImplicitConversionToArrayIndex(index, SpecialType.System_Int32, node, diagnostics);
9742BoundExpression bindInlineArrayElementAccess(ExpressionSyntax node, BoundExpression expr, int length, AnalyzedArguments analyzedArguments, BoundExpression convertedIndex, WellKnownType indexOrRangeWellknownType, FieldSymbol elementField, BindingDiagnosticBag diagnostics)
9817if (rangeExpr.LeftOperandOpt is BoundExpression left)
9822if (rangeExpr.RightOperandOpt is BoundExpression right)
9868void checkInlineArrayBoundsForSystemIndex(BoundExpression convertedIndex, int length, bool excludeEnd, BindingDiagnosticBag diagnostics)
9880internal static int? InferConstantIndexFromSystemIndex(CSharpCompilation compilation, BoundExpression convertedIndex, int length, out SyntaxNode location)
9913private BoundExpression BadIndexerExpression(SyntaxNode node, BoundExpression expr, AnalyzedArguments analyzedArguments, DiagnosticInfo errorOpt, BindingDiagnosticBag diagnostics)
9924private BoundExpression BindElementAccessCore(
9926BoundExpression expr,
9959private BoundExpression BindArrayAccess(SyntaxNode node, BoundExpression expr, AnalyzedArguments arguments, BindingDiagnosticBag diagnostics)
9994BoundExpression[] convertedArguments = new BoundExpression[arguments.Arguments.Count];
9998BoundExpression argument = arguments.Arguments[i];
10000BoundExpression index = ConvertToArrayIndex(argument, diagnostics, allowIndexAndRange: rank == 1, out indexOrRangeWellknownType);
10034indexerOrSliceAccess: new BoundArrayAccess(node, receiverPlaceholder, ImmutableArray<BoundExpression>.CastUp(argumentPlaceholders), resultType) { WasCompilerGenerated = true },
10042private BoundExpression ConvertToArrayIndex(BoundExpression index, BindingDiagnosticBag diagnostics, bool allowIndexAndRange, out WellKnownType indexOrRangeWellknownType)
10058var result =
10109private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, WellKnownType wellKnownType, SyntaxNode node, BindingDiagnosticBag diagnostics)
10120var result = TryImplicitConversionToArrayIndex(expr, type, node, attemptDiagnostics);
10130private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, SpecialType specialType, SyntaxNode node, BindingDiagnosticBag diagnostics)
10136var result = TryImplicitConversionToArrayIndex(expr, type, node, attemptDiagnostics);
10147private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, TypeSymbol targetType, SyntaxNode node, BindingDiagnosticBag diagnostics)
10165BoundExpression result = CreateConversion(expr.Syntax, expr, conversion, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, destination: targetType, diagnostics); // UNDONE: was cast?
10171private BoundExpression BindPointerElementAccess(SyntaxNode node, BoundExpression expr, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
10193ArrayBuilder<BoundExpression> arguments = analyzedArguments.Arguments;
10210BoundExpression index = arguments[0];
10232private BoundExpression BindIndexerAccess(SyntaxNode node, BoundExpression expr, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
10246BoundExpression indexerAccessExpression;
10302private BoundExpression BindIndexedPropertyAccess(BoundPropertyGroup propertyGroup, bool mustHaveAllOptionalParameters, BindingDiagnosticBag diagnostics)
10305var receiver = propertyGroup.ReceiverOpt;
10319ImmutableArray<BoundExpression>.Empty,
10326var result = BindIndexedPropertyAccess(syntax, receiver, properties, arguments, diagnostics);
10332private BoundExpression BindIndexedPropertyAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<PropertySymbol> propertyGroup, AnalyzedArguments arguments, BindingDiagnosticBag diagnostics)
10339var result = BindIndexerOrIndexedPropertyAccess(syntax, receiver, properties, arguments, diagnostics);
10345private BoundExpression BindDynamicIndexer(
10347BoundExpression receiver,
10389private BoundExpression BindIndexerOrIndexedPropertyAccess(
10391BoundExpression receiver,
10429private BoundExpression BindIndexerOrIndexedPropertyAccessContinued(
10431BoundExpression receiver,
10437BoundExpression propertyAccess;
10476ImmutableArray<BoundExpression> arguments = BuildArgumentsForErrorRecovery(analyzedArguments, candidates);
10539BoundExpression receiver,
10556var argument = arguments.Arguments[0];
10573out var lengthOrCountAccess, out var indexerOrSliceAccess, out var argumentPlaceholders, diagnostics))
10626[NotNullWhen(true)] out BoundExpression? lengthOrCountAccess,
10627[NotNullWhen(true)] out BoundExpression? indexerOrSliceAccess,
10659[NotNullWhen(true)] out BoundExpression? indexerOrSliceAccess,
10761void makeCall(SyntaxNode syntax, BoundExpression receiver, MethodSymbol method,
10762out BoundExpression indexerOrSliceAccess, out ImmutableArray<BoundImplicitIndexerValuePlaceholder> argumentPlaceholders)
10799out BoundExpression lengthOrCountAccess,
11166BoundExpression receiver = node.ReceiverOpt;
11285private static bool IsStaticInstanceMismatchForUniqueSignatureFromMethodGroup(BoundExpression receiver, Symbol extensionMember)
11382BoundExpression receiver = node.ReceiverOpt;
11641BoundExpression receiver = BindConditionalAccessReceiver(node, diagnostics);
11644var access = conditionalAccessBinder.BindValue(node.WhenNotNull, diagnostics, BindValueKind.RValue);
11748private BoundConditionalAccess GenerateBadConditionalAccessNodeError(ConditionalAccessExpressionSyntax node, BoundExpression receiver, BoundExpression access, BindingDiagnosticBag diagnostics)
11757private BoundExpression BindMemberBindingExpression(MemberBindingExpressionSyntax node, bool invoked, bool indexed, BindingDiagnosticBag diagnostics)
11759BoundExpression receiver = GetReceiverForConditionalBinding(node, diagnostics);
11761var memberAccess = BindMemberAccessWithBoundLeft(node, receiver, node.Name, node.OperatorToken, invoked, indexed, diagnostics);
11765private BoundExpression BindElementBindingExpression(ElementBindingExpressionSyntax node, BindingDiagnosticBag diagnostics)
11767BoundExpression receiver = GetReceiverForConditionalBinding(node, diagnostics);
11769var memberAccess = BindElementAccess(node, receiver, node.ArgumentList, allowInlineArrayElementAccess: true, diagnostics);
11788private BoundExpression GetReceiverForConditionalBinding(ExpressionSyntax binding, BindingDiagnosticBag diagnostics)
11793BoundExpression receiver = this.ConditionalReceiverExpression;
11813private BoundExpression BindConditionalAccessReceiver(ConditionalAccessExpressionSyntax node, BindingDiagnosticBag diagnostics)
11816var receiver = BindRValueWithoutTargetType(receiverSyntax, diagnostics);
Binder\Binder_InterpolatedString.cs (58)
19private BoundExpression BindInterpolatedString(InterpolatedStringExpressionSyntax node, BindingDiagnosticBag diagnostics)
40var builder = ArrayBuilder<BoundExpression>.GetInstance();
90var value = BindValue(interpolation.Expression, diagnostics, BindValueKind.RValue);
97BoundExpression? alignment = null;
257ImmutableArray<BoundExpression> parts = BindInterpolatedStringPartsForFactory(unconvertedInterpolatedString, diagnostics, out bool haveErrors);
266BoundInterpolatedString constructWithoutData(ImmutableArray<BoundExpression> parts)
295bool canLowerToStringConcatenation(ImmutableArray<BoundExpression> parts)
297foreach (var part in parts)
317private ImmutableArray<BoundExpression> BindInterpolatedStringPartsForFactory(BoundUnconvertedInterpolatedString unconvertedInterpolatedString, BindingDiagnosticBag diagnostics, out bool haveErrors)
321ImmutableArray<BoundExpression> parts = BindInterpolatedStringParts(unconvertedInterpolatedString, partsDiagnostics);
333ImmutableArray<BoundExpression> parts,
340ImmutableArray<BoundExpression> expressions = makeInterpolatedStringFactoryArguments(syntax, parts, diagnostics);
342BoundExpression construction = MakeInvocationExpression( // Tracked by https://github.com/dotnet/roslyn/issues/78965 : interpolated string, test this scenario with a delegate-returning property (should be blocked by virtue of allowFieldsAndProperties: false)
370ImmutableArray<BoundExpression> makeInterpolatedStringFactoryArguments(SyntaxNode syntax, ImmutableArray<BoundExpression> parts, BindingDiagnosticBag diagnostics)
375var expressions = ArrayBuilder<BoundExpression>.GetInstance(n + 1);
380var part = parts[i];
396var value = fillin.Value;
435private static bool AllInterpolatedStringPartsAreStrings(ImmutableArray<BoundExpression> parts)
465var partsArrayBuilder = ArrayBuilder<ImmutableArray<BoundExpression>>.GetInstance();
469static (BoundUnconvertedInterpolatedString unconvertedInterpolatedString, ArrayBuilder<ImmutableArray<BoundExpression>> partsArrayBuilder) =>
515private BoundBinaryOperator UpdateBinaryOperatorWithInterpolatedContents(BoundBinaryOperator originalOperator, ImmutableArray<ImmutableArray<BoundExpression>> appendCalls, InterpolatedStringHandlerData data, SyntaxNode rootSyntax, BindingDiagnosticBag diagnostics)
519Func<BoundUnconvertedInterpolatedString, int, (ImmutableArray<ImmutableArray<BoundExpression>>, TypeSymbol), BoundExpression> interpolationFactory =
521Func<BoundBinaryOperator, BoundExpression, BoundExpression, (ImmutableArray<ImmutableArray<BoundExpression>>, TypeSymbol), BoundExpression> binaryOperatorFactory =
528static BoundInterpolatedString createInterpolation(BoundUnconvertedInterpolatedString expression, int i, (ImmutableArray<ImmutableArray<BoundExpression>> AppendCalls, TypeSymbol _) arg)
540static BoundBinaryOperator createBinaryOperator(BoundBinaryOperator original, BoundExpression left, BoundExpression right, (ImmutableArray<ImmutableArray<BoundExpression>> _, TypeSymbol @string) arg)
555private BoundExpression BindUnconvertedInterpolatedExpressionToHandlerType(
556BoundExpression unconvertedExpression,
610var partsArrayBuilder = ArrayBuilder<ImmutableArray<BoundExpression>>.GetInstance();
613static (BoundUnconvertedInterpolatedString unconvertedInterpolatedString, ArrayBuilder<ImmutableArray<BoundExpression>> partsArrayBuilder) =>
632private (ImmutableArray<ImmutableArray<BoundExpression>> AppendCalls, InterpolatedStringHandlerData Data) BindUnconvertedInterpolatedPartsToHandlerType(
634ImmutableArray<ImmutableArray<BoundExpression>> partsArray,
678foreach (var currentPart in parts)
682var value = insert.Value;
713var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(constructorArgumentLength);
730BoundExpression constructorCall;
732var outConstructorCall = MakeConstructorInvocation(interpolatedStringHandlerType, argumentsBuilder, refKindsBuilder, syntax, outConstructorDiagnostics);
744BoundExpression nonOutConstructorCall = MakeConstructorInvocation(interpolatedStringHandlerType, argumentsBuilder, refKindsBuilder, syntax, nonOutConstructorDiagnostics);
817static void populateArguments(SyntaxNode syntax, ImmutableArray<BoundInterpolatedStringArgumentPlaceholder> additionalConstructorArguments, int baseStringLength, int numFormatHoles, NamedTypeSymbol intType, ArrayBuilder<BoundExpression> argumentsBuilder)
850private ImmutableArray<BoundExpression> BindInterpolatedStringParts(BoundUnconvertedInterpolatedString unconvertedInterpolatedString, BindingDiagnosticBag diagnostics)
852ArrayBuilder<BoundExpression>? partsBuilder = null;
856var part = unconvertedInterpolatedString.Parts[i];
859BoundExpression newValue;
874partsBuilder = ArrayBuilder<BoundExpression>.GetInstance(unconvertedInterpolatedString.Parts.Length);
895private (ImmutableArray<ImmutableArray<BoundExpression>> AppendFormatCalls, bool UsesBoolReturn, ImmutableArray<ImmutableArray<(bool IsLiteral, bool HasAlignment, bool HasFormat)>>, int BaseStringLength, int NumFormatHoles) BindInterpolatedStringAppendCalls(
896ImmutableArray<ImmutableArray<BoundExpression>> partsArray,
902return (ImmutableArray<ImmutableArray<BoundExpression>>.Empty, false, ImmutableArray<ImmutableArray<(bool IsLiteral, bool HasAlignment, bool HasFormat)>>.Empty, 0, 0);
907var builderAppendCallsArray = ArrayBuilder<ImmutableArray<BoundExpression>>.GetInstance(partsArray.Length);
908var builderAppendCalls = ArrayBuilder<BoundExpression>.GetInstance(firstPartsLength);
911var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(3);
918foreach (var part in parts)
975var call = MakeInvocationExpression(part.Syntax, implicitBuilderReceiver, methodName, arguments, diagnostics, names: parameterNamesAndLocations, searchExtensionsIfNecessary: false);
Binder\Binder_Invocation.cs (91)
21/// This portion of the binder converts an <see cref="ExpressionSyntax"/> into a <see cref="BoundExpression"/>.
25private BoundExpression BindMethodGroup(ExpressionSyntax node, bool invoked, bool indexed, BindingDiagnosticBag diagnostics)
78internal BoundExpression MakeInvocationExpression(
80BoundExpression receiver,
82ImmutableArray<BoundExpression> args,
105var boundExpression = BindInstanceMemberAccess(node, node, receiver, methodName, typeArgs.NullToEmpty().Length, typeArgsSyntax, typeArgs, invoked: true, indexed: false, diagnostics, searchExtensionsIfNecessary);
140BoundExpression result = BindInvocationExpression(
159private static void ReportMakeInvocationExpressionBadMemberKind(SyntaxNode node, string methodName, BoundExpression boundExpression, BindingDiagnosticBag diagnostics)
183private BoundExpression BindInvocationExpression(
187BoundExpression result;
214BoundExpression boundExpression = BindMethodGroup(node.Expression, invoked: true, indexed: false, diagnostics: diagnostics);
237BoundExpression boundExpression = BindMethodGroup(node.Expression, invoked: true, indexed: false, diagnostics: diagnostics);
244BoundExpression bindArgumentsAndInvocation(InvocationExpressionSyntax node, BoundExpression boundExpression, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
265private BoundExpression BindArgListOperator(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics, AnalyzedArguments analyzedArguments)
279BoundExpression argument = analyzedArguments.Arguments[i];
319ImmutableArray<BoundExpression> arguments = analyzedArguments.Arguments.ToImmutable();
327private BoundExpression BindInvocationExpression(
331BoundExpression boundExpression,
347BoundExpression result;
399private BoundExpression BindDynamicInvocation(
401BoundExpression expression,
410BoundExpression? receiver;
458BoundExpression finalReceiver = ReplaceTypeOrValueReceiver(typeOrValue, useType, diagnostics);
488ImmutableArray<BoundExpression> argArray = BuildArgumentsForDynamicInvocation(arguments, diagnostics);
532private ImmutableArray<BoundExpression> BuildArgumentsForDynamicInvocation(AnalyzedArguments arguments, BindingDiagnosticBag diagnostics)
534var builder = ArrayBuilder<BoundExpression>.GetInstance(arguments.Arguments.Count);
553BoundExpression? receiver,
554ImmutableArray<BoundExpression> arguments,
582foreach (var arg in arguments)
629private BoundExpression BindDelegateInvocation(
633BoundExpression boundExpression,
639BoundExpression result;
698private BoundExpression BindMethodGroupInvocation(
719BoundExpression result = null;
733BoundExpression extensionMemberAccess = GetExtensionMemberAccess(expression, methodGroup.ReceiverOpt, extensionMember, diagnostics);
738BoundExpression extensionMemberInvocation = BindInvocationExpression(syntax, expression, methodName: null, extensionMemberAccess, analyzedArguments, diagnostics, acceptOnlyMethods: false);
752BoundExpression receiverOpt = methodGroup.ReceiverOpt;
895private bool IsAmbiguousDynamicParamsArgument<TMethodOrPropertySymbol>(ArrayBuilder<BoundExpression> arguments, MemberResolutionResult<TMethodOrPropertySymbol> candidate, out SyntaxNode argumentSyntax)
906var arg = arguments[i];
973private BoundExpression TryEarlyBindSingleCandidateInvocationWithDynamicArgument(
993BoundExpression result = BindInvocationExpressionContinued(
1012BoundExpression receiverOpt,
1073private void CheckRestrictedTypeReceiver(BoundExpression expression, CSharpCompilation compilation, BindingDiagnosticBag diagnostics)
1242var receiver = ReplaceTypeOrValueReceiver(methodGroup.Receiver, useType: !method.RequiresInstanceReceiver && !invokedAsExtensionMethod, diagnostics);
1255var extensionReceiver = isExtensionBlockMethod && !method.IsStatic ? receiver : null;
1268BoundExpression receiverArgument = analyzedArguments.Argument(0);
1371private BoundExpression CheckAndConvertExtensionReceiver(BoundExpression receiver, ParameterSymbol extensionParameter, BindingDiagnosticBag diagnostics)
1386internal ThreeState ReceiverIsSubjectToCloning(BoundExpression? receiver, PropertySymbol property)
1399internal ThreeState ReceiverIsSubjectToCloning(BoundExpression? receiver, MethodSymbol method)
1428private BoundExpression GetDefaultParameterSpecialNoConversion(SyntaxNode syntax, ParameterSymbol parameter, BindingDiagnosticBag diagnostics)
1445BoundExpression? defaultValue = null;
1532BoundExpression? extensionReceiver,
1533ArrayBuilder<BoundExpression> argumentsBuilder,
1638BoundExpression collection = CreateParamsCollection(node, parameters[paramsIndex], collectionArgs: ImmutableArray<BoundExpression>.Empty, diagnostics);
1664BoundExpression bindDefaultArgument(SyntaxNode syntax, ParameterSymbol parameter, Symbol? containingMember, bool enableCallerInfo, BindingDiagnosticBag diagnostics,
1665BoundExpression? extensionReceiver, ArrayBuilder<BoundExpression> argumentsBuilder, int argumentsCount, ImmutableArray<int> argsToParamsOpt)
1692BoundExpression defaultValue;
1712&& tryGetArgument(parameter.CallerArgumentExpressionParameterIndex, extensionReceiver, argumentsBuilder, argumentsCount, argsToParamsOpt, out var argument))
1778BoundExpression? extensionReceiver, ArrayBuilder<BoundExpression> argumentsBuilder, int argumentsCount, ImmutableArray<int> argsToParamsOpt,
1779[NotNullWhen(true)] out BoundExpression? argument)
1836private BoundExpression CreateParamsCollection(SyntaxNode node, ParameterSymbol paramsParameter, ImmutableArray<BoundExpression> collectionArgs, BindingDiagnosticBag diagnostics)
1839BoundExpression collection;
1844BoundExpression arraySize = new BoundLiteral(node, ConstantValue.Create(collectionArgs.Length), int32Type) { WasCompilerGenerated = true };
1907internal bool CheckImplicitThisCopyInReadOnlyMember(BoundExpression receiver, MethodSymbol method, BindingDiagnosticBag diagnostics)
1955private BoundExpression ReplaceTypeOrValueReceiver(BoundExpression receiver, bool useType, BindingDiagnosticBag diagnostics)
1981var boundValue = typeOrValue.Binder.BindIdentifier(identifier, invoked: false, indexed: false, diagnostics: diagnostics);
1993var value = q.Value;
1994var replaced = ReplaceTypeOrValueReceiver(value, useType, diagnostics);
2002private static Symbol GetValueSymbolIfTypeOrValueReceiver(BoundExpression receiver)
2026private static NamedTypeSymbol GetDelegateType(BoundExpression expr)
2042BoundExpression receiver,
2052ImmutableArray<BoundExpression> args;
2118private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments, ImmutableArray<MethodSymbol> methods, BindingDiagnosticBag diagnostics)
2138private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments, ImmutableArray<PropertySymbol> properties)
2159private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments, IEnumerable<ImmutableArray<ParameterSymbol>> parameterListList, BindingDiagnosticBag diagnostics)
2162ArrayBuilder<BoundExpression> newArguments = ArrayBuilder<BoundExpression>.GetInstance(argumentCount);
2166var argument = newArguments[i];
2316private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments)
2323BoundExpression expr,
2359private bool TryBindNameofOperator(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics, out BoundExpression result)
2376private BoundExpression BindNameofOperatorInternal(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics)
2380var boundArgument = BindExpression(argument, diagnostics);
2531private BoundFunctionPointerInvocation BindFunctionPointerInvocation(SyntaxNode node, BoundExpression boundExpression, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
Binder\Binder_Operators.cs (165)
24private BoundExpression BindCompoundAssignment(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics)
27BoundExpression result = bindCompoundAssignment(node, ref operatorResolutionForReporting, diagnostics);
31BoundExpression bindCompoundAssignment(AssignmentExpressionSyntax node, ref OperatorResolutionForReporting operatorResolutionForReporting, BindingDiagnosticBag diagnostics)
35BoundExpression left = BindValue(node.Left, diagnostics, GetBinaryAssignmentKind(node.Kind()));
37BoundExpression right = BindValue(node.Right, diagnostics, BindValueKind.RValue);
263BoundExpression rightConverted = CreateConversion(right, best.RightConversion, bestSignature.RightType, diagnostics);
272BoundExpression? finalConversion = GenerateConversionForAssignment(leftType, finalPlaceholder, diagnostics,
315var leftConversion = CreateConversion(node.Left, leftPlaceholder, best.LeftConversion, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, best.Signature.LeftType, diagnostics);
324BoundExpression left,
325BoundExpression right,
338bool shouldTryUserDefinedInstanceOperator(AssignmentExpressionSyntax node, bool checkOverflowAtRuntime, BoundExpression left, out string? checkedName, out string? ordinaryName)
378BoundExpression left,
379BoundExpression right,
423BoundExpression left,
424BoundExpression right,
476BoundExpression rightConverted = CreateConversion(right, overloadResolutionResult.ValidResult.Result.ConversionForArg(isExtension ? 1 : 0), method.Parameters[0].Type, diagnostics);
483BoundExpression? leftConversion = null;
578BoundExpression left,
579BoundExpression right,
658BoundExpression left,
659BoundExpression right,
690private BoundExpression BindEventAssignment(AssignmentExpressionSyntax node, BoundEventAccess left, BoundExpression right, BinaryOperatorKind opKind, BindingDiagnosticBag diagnostics)
697BoundExpression receiverOpt = left.ReceiverOpt;
713BoundExpression argument = CreateConversion(right, argumentConversion, delegateType, diagnostics);
776private static bool IsLegalDynamicOperand(BoundExpression operand)
799private BoundExpression BindDynamicBinaryOperator(
802BoundExpression left,
803BoundExpression right,
883private BoundExpression BindSimpleBinaryOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
902BoundExpression result = BindExpression(current, diagnostics);
926BoundExpression left = CheckValue(result, bindValueKind, diagnostics);
927BoundExpression right = BindValue(syntaxNode.Right, diagnostics, BindValueKind.RValue);
928BoundExpression boundOp = BindSimpleBinaryOperator(syntaxNode, diagnostics, left, right, leaveUnconvertedIfInterpolatedString: true);
936private BoundExpression BindSimpleBinaryOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics,
937BoundExpression left, BoundExpression right, bool leaveUnconvertedIfInterpolatedString)
1067BoundExpression resultLeft = left;
1068BoundExpression resultRight = right;
1134private bool BindSimpleBinaryOperatorParts(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, BinaryOperatorKind kind,
1156BoundExpression left,
1157BoundExpression right,
1240private BoundExpression RebindSimpleBinaryOperatorAsConverted(BoundBinaryOperator unconvertedBinaryOperator, BindingDiagnosticBag diagnostics)
1247var result = doRebind(diagnostics, unconvertedBinaryOperator);
1250BoundExpression doRebind(BindingDiagnosticBag diagnostics, BoundBinaryOperator? current)
1262BoundExpression? left = null;
1265var right = current.Right switch
1284private void ReportUnaryOperatorError(CSharpSyntaxNode node, BindingDiagnosticBag diagnostics, string operatorName, BoundExpression operand, LookupResultKind resultKind, ref OperatorResolutionForReporting operatorResolutionForReporting)
1304private void ReportAssignmentOperatorError(AssignmentExpressionSyntax node, BinaryOperatorKind kind, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right,
1324private void ReportBinaryOperatorError(ExpressionSyntax node, BindingDiagnosticBag diagnostics, SyntaxToken operatorToken, BoundExpression left, BoundExpression right,
1387private BoundExpression BindConditionalLogicalOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
1410BoundExpression left = BindRValueWithoutTargetType(child, diagnostics);
1415BoundExpression right = BindRValueWithoutTargetType(binary.Right, diagnostics);
1424private BoundExpression BindConditionalLogicalOperator(BinaryExpressionSyntax node, BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
1427BoundExpression result = bindConditionalLogicalOperator(node, left, right, ref operatorResolutionForReporting, diagnostics);
1431BoundExpression bindConditionalLogicalOperator(BinaryExpressionSyntax node, BoundExpression left, BoundExpression right, ref OperatorResolutionForReporting operatorResolutionForReporting, BindingDiagnosticBag diagnostics)
1516var resultLeft = CreateConversion(left, best.LeftConversion, signature.LeftType, diagnostics);
1517var resultRight = CreateConversion(right, best.RightConversion, signature.RightType, diagnostics);
1538BoundExpression operandConversion = CreateConversion(
1588private bool IsValidDynamicCondition(BoundExpression left, bool isNegative, BindingDiagnosticBag diagnostics, out MethodSymbol userDefinedOperator)
1656UnaryOperatorAnalysisResult operatorOverloadResolution(SyntaxNode node, BoundExpression operand, UnaryOperatorKind kind, BindingDiagnosticBag diagnostics)
2031BoundExpression left,
2032BoundExpression right,
2049BoundExpression left,
2050BoundExpression right,
2090BoundExpression left,
2091BoundExpression right,
2150BoundExpression left,
2151BoundExpression right,
2231private bool IsTypelessExpressionAllowedInBinaryOperator(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2255BoundExpression operand,
2297BoundExpression operand,
2326BoundExpression operand,
2403BoundExpression operand,
2631internal static TypeSymbol GetEnumType(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2681BoundExpression left,
2682BoundExpression right,
2699BoundExpression newLeftOperand = CreateConversion(left, underlyingType, diagnostics);
2700BoundExpression newRightOperand = CreateConversion(right, underlyingType, diagnostics);
2756BoundExpression left,
2757BoundExpression right,
2910private static ConstantValue? TryFoldingNullableEquality(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
3240private BoundExpression BindIncrementOperator(ExpressionSyntax node, ExpressionSyntax operandSyntax, SyntaxToken operatorToken, BindingDiagnosticBag diagnostics)
3243BoundExpression result = bindIncrementOperator(node, operandSyntax, operatorToken, ref operatorResolutionForReporting, diagnostics);
3247BoundExpression bindIncrementOperator(ExpressionSyntax node, ExpressionSyntax operandSyntax, SyntaxToken operatorToken, ref OperatorResolutionForReporting operatorResolutionForReporting, BindingDiagnosticBag diagnostics)
3251BoundExpression operand = BindToNaturalType(BindValue(operandSyntax, diagnostics, BindValueKind.IncrementDecrement), diagnostics);
3380BoundExpression? resultConversion = GenerateConversionForAssignment(operandType, resultPlaceholder, diagnostics, ConversionForAssignmentFlags.IncrementAssignment);
3402var operandConversion = CreateConversion(node, operandPlaceholder, best.Conversion, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, best.Signature.OperandType, diagnostics);
3424BoundExpression operand,
3471BoundExpression operand,
3510BoundExpression operand,
3566BoundExpression? operandConversion = null;
3663BoundExpression operand,
3747BoundExpression operand,
4030private BoundExpression BindSuppressNullableWarningExpression(PostfixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4034var expr = BindExpression(node.Operand, diagnostics);
4054private BoundExpression BindPointerIndirectionExpression(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4056BoundExpression operand = BindToNaturalType(BindValue(node.Operand, diagnostics, GetUnaryAssignmentKind(node.Kind())), diagnostics);
4072private static void BindPointerIndirectionExpressionInternal(CSharpSyntaxNode node, BoundExpression operand, BindingDiagnosticBag diagnostics, out TypeSymbol pointedAtType, out bool hasErrors)
4108private BoundExpression BindAddressOfExpression(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4110BoundExpression operand = BindToNaturalType(BindValue(node.Operand, diagnostics, BindValueKind.AddressOf), diagnostics);
4160internal bool IsMoveableVariable(BoundExpression expr, out Symbol accessedLocalOrParameterOpt)
4173BoundExpression receiver;
4286BoundExpression underlyingExpr = ((BoundPointerElementAccess)expr).Expression;
4305private BoundExpression BindUnaryOperator(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4307BoundExpression operand = BindToNaturalType(BindValue(node.Operand, diagnostics, GetUnaryAssignmentKind(node.Kind())), diagnostics);
4312private void ReportSuppressionIfNeeded(BoundExpression expr, BindingDiagnosticBag diagnostics)
4321private BoundExpression BindUnaryOperatorCore(CSharpSyntaxNode node, string operatorText, BoundExpression operand, BindingDiagnosticBag diagnostics)
4391var resultOperand = CreateConversion(operand.Syntax, operand, best.Conversion, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, signature.OperandType, diagnostics);
4413BoundExpression operand,
4418BoundExpression newOperand = CreateConversion(operand, underlyingType, diagnostics);
4448BoundExpression operand,
4669private BoundLiteral BindIntegralMinValConstants(PrefixUnaryExpressionSyntax node, BoundExpression operand, BindingDiagnosticBag diagnostics)
4758private bool IsOperandErrors(CSharpSyntaxNode node, ref BoundExpression operand, BindingDiagnosticBag diagnostics)
4820private BoundExpression BindIsOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4823var operand = BindRValueWithoutTargetType(node.Left, diagnostics);
4859var convertedExpression = BindExpressionForPattern(unionType, inputType, node.Right, ref hasErrors, isPatternDiagnostics, out var constantValueOpt, out var wasExpression, patternExpressionConversion: out _, out BoundExpression originalExpression);
5341private BoundExpression BindAsOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
5343var operand = BindRValueWithoutTargetType(node.Left, diagnostics);
5428BoundExpression operandConversion;
5623private BoundExpression GenerateNullCoalescingBadBinaryOpsError(BinaryExpressionSyntax node, BoundExpression leftOperand, BoundExpression rightOperand, BindingDiagnosticBag diagnostics)
5633private BoundExpression BindNullCoalescingOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
5635var leftOperand = BindValue(node.Left, diagnostics, BindValueKind.RValue);
5637var rightOperand = BindValue(node.Right, diagnostics, BindValueKind.RValue);
5703var leftConversion = CreateConversion(node, leftPlaceholder,
5725var convertedRightOperand = CreateConversion(rightOperand, rightConversion, optLeftType0, diagnostics);
5741var convertedRightOperand = CreateConversion(rightOperand, rightConversion, optLeftType, diagnostics);
5793var leftConversion = CreateConversion(node, leftPlaceholder, leftConversionClassification, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, optRightType, diagnostics);
5807var leftConversion = CreateConversion(node, leftPlaceholder, leftConversionClassification, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, optRightType, diagnostics);
5820private BoundExpression BindNullCoalescingAssignmentOperator(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics)
5824BoundExpression leftOperand = BindValue(node.Left, diagnostics, BindValueKind.CompoundAssignment);
5826BoundExpression rightOperand = BindValue(node.Right, diagnostics, BindValueKind.RValue);
5857var convertedRightOperand = CreateConversion(rightOperand, underlyingRightConversion, underlyingLeftType, diagnostics);
5871var convertedRightOperand = CreateConversion(rightOperand, rightConversion, leftType, diagnostics);
5879private BoundExpression GenerateNullCoalescingAssignmentBadBinaryOpsError(AssignmentExpressionSyntax node, BoundExpression leftOperand, BoundExpression rightOperand, BindingDiagnosticBag diagnostics)
5921private BoundExpression BindConditionalOperator(ConditionalExpressionSyntax node, BindingDiagnosticBag diagnostics)
5948private BoundExpression BindValueConditionalOperator(ConditionalExpressionSyntax node, ExpressionSyntax whenTrue, ExpressionSyntax whenFalse, BindingDiagnosticBag diagnostics)
5950BoundExpression condition = BindBooleanExpression(node.Condition, diagnostics);
5951BoundExpression trueExpr = BindValue(whenTrue, diagnostics, BindValueKind.RValue);
5952BoundExpression falseExpr = BindValue(whenFalse, diagnostics, BindValueKind.RValue);
5989private BoundExpression BindRefConditionalOperator(ConditionalExpressionSyntax node, ExpressionSyntax whenTrue, ExpressionSyntax whenFalse, BindingDiagnosticBag diagnostics)
5991BoundExpression condition = BindBooleanExpression(node.Condition, diagnostics);
5992BoundExpression trueExpr = BindValue(whenTrue, diagnostics, BindValueKind.RValue | BindValueKind.RefersToLocation);
5993BoundExpression falseExpr = BindValue(whenFalse, diagnostics, BindValueKind.RValue | BindValueKind.RefersToLocation);
6026private void ValidateRefConditionalOperator(SyntaxNode node, BoundExpression trueExpr, BoundExpression falseExpr, BindingDiagnosticBag diagnostics)
6050private static ConstantValue FoldConditionalOperator(BoundExpression condition, BoundExpression trueExpr, BoundExpression falseExpr)
Binder\Binder_Patterns.cs (37)
203private BoundExpression BindIsPatternExpression(IsPatternExpressionSyntax node, BindingDiagnosticBag diagnostics)
207BoundExpression expression = BindRValueWithoutTargetType(node.Expression, diagnostics);
231private BoundExpression MakeIsPatternExpression(
233BoundExpression expression,
341private BoundExpression BindSwitchExpression(SwitchExpressionSyntax node, BindingDiagnosticBag diagnostics)
352internal virtual BoundExpression BindSwitchExpressionCore(
419BoundExpression? indexerAccess = null;
517BoundExpression? indexerAccess;
518BoundExpression? lengthAccess;
555out Symbol? variableSymbol, out BoundExpression? variableAccess);
570indexerAccess: out _, out var lengthAccess, receiverPlaceholder: out _, argumentPlaceholder: out _);
576out BoundExpression indexerAccess, out BoundExpression lengthAccess, out BoundListPatternReceiverPlaceholder? receiverPlaceholder, out BoundListPatternIndexPlaceholder argumentPlaceholder)
591lengthAccess = new BoundBadExpression(node, LookupResultKind.Empty, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, CreateErrorType(), hasErrors: true) { WasCompilerGenerated = true };
653var convertedExpression = BindExpressionOrTypeForPattern(unionType, inputType, innerExpression, ref hasErrors, diagnostics, out var constantValueOpt, out bool wasExpression, out Conversion patternConversion, out BoundExpression originalExpression);
748private BoundExpression BindExpressionOrTypeForPattern(
757out BoundExpression originalExpression)
778private BoundExpression BindExpressionForPattern(
787out BoundExpression originalExpression)
797private BoundExpression BindExpressionForPatternContinued(
798BoundExpression expression,
807BoundExpression convertedExpression = ConvertPatternExpression(
843internal BoundExpression ConvertPatternExpression(
847BoundExpression expression,
853BoundExpression convertedExpression;
947BoundExpression operand = conversion.Operand;
1211hasErrors: ref hasErrors, variableSymbol: out Symbol? variableSymbol, variableAccess: out BoundExpression? variableAccess);
1238out BoundExpression? variableAccess)
1274BoundExpression receiver = SynthesizeReceiver(designation, expressionVariableField, diagnostics);
1374BoundExpression deconstruct = MakeDeconstructInvocationExpression(
1411ref hasErrors, out Symbol? variableSymbol, out BoundExpression? variableAccess);
1428BoundExpression deconstruct,
1743variableSymbol: out Symbol? variableSymbol, variableAccess: out BoundExpression? variableAccess);
1795BoundExpression deconstruct = MakeDeconstructInvocationExpression(
1974BoundExpression boundMember = BindInstanceMemberAccess(
2066BoundExpression value = BindExpressionForPattern(unionType, inputType, node.Expression, ref hasErrors, diagnostics, out var constantValueOpt, out _, out Conversion patternConversion, originalExpression: out _);
Binder\Binder_Query.cs (53)
24internal BoundExpression BindQuery(QueryExpressionSyntax node, BindingDiagnosticBag diagnostics)
29var boundFromExpression = BindLeftOfPotentialColorColorMemberAccess(fromClause.Expression, diagnostics);
53BoundExpression? cast = null;
69BoundExpression result = BindQueryInternal1(state, diagnostics);
165private BoundExpression BindQueryInternal1(QueryTranslationState state, BindingDiagnosticBag diagnostics)
184private BoundExpression BindQueryInternal2(QueryTranslationState state, BindingDiagnosticBag diagnostics)
201var result = state.fromExpression;
204BoundExpression? unoptimized = FinalTranslation(state, BindingDiagnosticBag.Discarded);
217private BoundExpression FinalTranslation(QueryTranslationState state, BindingDiagnosticBag diagnostics)
230var e = state.fromExpression;
253var e = state.fromExpression;
262BoundExpression lambdaRight = MakeQueryUnboundLambda(state.RangeVariableMap(), x, v, diagnostics.AccumulatesDependencies);
274BoundExpression? unoptimizedForm = null;
315var arguments = ArrayBuilder<BoundExpression>.GetInstance();
317var lastArgument = arguments[n - 1];
380var inExpression = BindRValueWithoutTargetType(join.InExpression, diagnostics);
390BoundExpression? castInvocation = null;
587BoundExpression collectionSelectorLambda;
626BoundExpression? castInvocation = (from.Type != null) ? ExtractCastInvocation(invocation) : null;
672BoundExpression? castInvocation = (from.Type != null) ? ExtractCastInvocation(invocation) : null;
677private static BoundExpression? ExtractCastInvocation(BoundCall invocation)
700var construction = MakePair(node, x1.Name, x1Expression, x2.Name, x2Expression, state, d);
736var yExpression = lambdaBodyBinder.BindRValueWithoutTargetType(let.Expression, d);
750var construction = MakePair(let, x.Name, xExpression, let.Identifier.ValueText, yExpression, state, d);
773private BoundBlock CreateLambdaBlockForQueryClause(ExpressionSyntax expression, BoundExpression result, BindingDiagnosticBag diagnostics)
786BoundExpression expression,
788BoundExpression? queryInvocation = null,
789BoundExpression? castInvocation = null,
790BoundExpression? unoptimizedForm = null)
802private BoundExpression MakePair(CSharpSyntaxNode node, string field1Name, BoundExpression field1Value, string field2Name, BoundExpression field2Value, QueryTranslationState state, BindingDiagnosticBag diagnostics)
822AnonymousTypeField createField(string fieldName, BoundExpression fieldValue) =>
826private TypeSymbol TypeOrError(BoundExpression e)
842BoundExpression boundExpression = lambdaBodyBinder.BindValue(expression, diagnostics, BindValueKind.RValue);
852BoundExpression boundExpression = lambdaBodyBinder.BindValue(expression, diagnostics, BindValueKind.RValue);
879protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, BoundExpression arg, BindingDiagnosticBag diagnostics
892protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, ImmutableArray<BoundExpression> args, BindingDiagnosticBag diagnostics
905protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, TypeSyntax typeArgSyntax, TypeWithAnnotations typeArg, BindingDiagnosticBag diagnostics
911return MakeQueryInvocation(node, receiver, methodName, new SeparatedSyntaxList<TypeSyntax>(new SyntaxNodeOrTokenList(typeArgSyntax, 0)), ImmutableArray.Create(typeArg), ImmutableArray<BoundExpression>.Empty, diagnostics
918protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, SeparatedSyntaxList<TypeSyntax> typeArgsSyntax, ImmutableArray<TypeWithAnnotations> typeArgs, ImmutableArray<BoundExpression> args, BindingDiagnosticBag diagnostics
928var ultimateReceiver = receiver;
990var checkedUltimateReceiver = CheckValue(ultimateReceiver, BindValueKind.RValue, diagnostics);
1010static BoundExpression updateUltimateReceiver(BoundExpression receiver, BoundExpression originalUltimateReceiver, BoundExpression replacementUltimateReceiver)
1029protected BoundExpression MakeConstruction(CSharpSyntaxNode node, NamedTypeSymbol toCreate, ImmutableArray<BoundExpression> args, BindingDiagnosticBag diagnostics)
1033var result = BindClassCreationExpression(node, toCreate.Name, node, toCreate, analyzedArguments, diagnostics);
Binder\Binder_QueryErrors.cs (4)
27BoundExpression instanceArgument,
164internal static void ReportQueryInferenceFailed(CSharpSyntaxNode queryClause, string methodName, BoundExpression receiver, AnalyzedArguments arguments, ImmutableArray<Symbol> symbols, BindingDiagnosticBag diagnostics)
213private static bool ReportQueryInferenceFailedSelectMany(FromClauseSyntax fromClause, string methodName, BoundExpression receiver, AnalyzedArguments arguments, ImmutableArray<Symbol> symbols, BindingDiagnosticBag diagnostics)
218BoundExpression arg = arguments.Argument(arguments.IncludesReceiverAsArgument ? 1 : 0);
Binder\Binder_Statements.cs (82)
238BoundExpression argument = (node.Expression == null)
393private BoundExpression BindThrownExpression(ExpressionSyntax exprSyntax, BindingDiagnosticBag diagnostics, ref bool hasErrors)
395var boundExpr = BindValue(exprSyntax, diagnostics, BindValueKind.RValue);
436BoundExpression boundExpr = null;
515var expression = BindLabel(node.Expression, diagnostics);
538var value = BindRValueWithoutTargetType(node.Expression, BindingDiagnosticBag.Discarded);
653var expression = BindRValueWithoutTargetType(syntax, diagnostics);
680private void CheckForUnobservedAwaitable(BoundExpression expression, BindingDiagnosticBag diagnostics)
761internal MethodSymbol TryFindDisposePatternMethod(BoundExpression expr, SyntaxNode syntaxNode, bool hasAwait, BindingDiagnosticBag diagnostics, out bool isExpanded)
868internal BoundExpression BindInferredVariableInitializer(BindingDiagnosticBag diagnostics, RefKind refKind, EqualsValueClauseSyntax initializer,
878protected BoundExpression BindInferredVariableInitializer(BindingDiagnosticBag diagnostics, ExpressionSyntax initializer, BindValueKind valueKind, CSharpSyntaxNode errorSyntax)
898BoundExpression value = BindValue(initializer, diagnostics, valueKind);
899BoundExpression expression = value.Kind is BoundKind.UnboundLambda or BoundKind.MethodGroup ?
1019BoundExpression initializerOpt;
1113ImmutableArray<BoundExpression> arguments = BindDeclaratorArguments(declarator, localDiagnostics);
1141var invalidDimensions = ArrayBuilder<BoundExpression>.GetInstance();
1148var size = args.binder.BindArrayDimension(expressionSyntax, args.diagnostics, ref _);
1179internal ImmutableArray<BoundExpression> BindDeclaratorArguments(VariableDeclaratorSyntax declarator, BindingDiagnosticBag diagnostics)
1188var arguments = default(ImmutableArray<BoundExpression>);
1227private bool IsValidFixedVariableInitializer(TypeSymbol declType, ref BoundExpression initializerOpt, BindingDiagnosticBag diagnostics)
1325private MethodSymbol GetFixedPatternMethodOpt(BoundExpression initializer, BindingDiagnosticBag additionalDiagnostics)
1358private BoundExpression GetFixedLocalCollectionInitializer(
1359BoundExpression initializer,
1376BoundExpression elementConversion;
1408private BoundExpression BindAssignment(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics)
1428var op1 = BindValue(node.Left, diagnostics, lhsKind);
1432var op2 = BindValue(rhsExpr, diagnostics, rhsKind);
1444private static BindValueKind GetRequiredRHSValueKindForRefAssignment(BoundExpression boundLeft)
1463private BoundExpression InferTypeForDiscardAssignment(BoundDiscardExpression op1, BoundExpression op2, BindingDiagnosticBag diagnostics)
1481BoundExpression op1,
1482BoundExpression op2,
1506var conversion = GenerateConversionForAssignment(lhsType, op2,
1550BoundExpression op1,
1551BoundExpression op2,
1635static object getName(BoundExpression expr)
1666internal static PropertySymbol GetPropertySymbol(BoundExpression expr, out BoundExpression receiver, out SyntaxNode propertySyntax)
1743internal static Symbol? GetIndexerOrImplicitIndexerSymbol(BoundExpression? e)
1804private static bool AccessingAutoPropertyFromConstructor(BoundExpression? receiver, PropertySymbol propertySymbol, Symbol fromMember, AccessorKind accessorKind)
1846private TypeSymbol GetAccessThroughType(BoundExpression receiver)
1865private BoundExpression BindPossibleArrayInitializer(
1878BoundExpression result;
1883ImmutableArray<BoundExpression>.Empty);
1962internal BoundExpression GenerateConversionForAssignment(TypeSymbol targetType, BoundExpression expression, BindingDiagnosticBag diagnostics, ConversionForAssignmentFlags flags = ConversionForAssignmentFlags.None)
1965internal BoundExpression GenerateConversionForAssignment(TypeSymbol targetType, BoundExpression expression, BindingDiagnosticBag diagnostics, out Conversion conversion, ConversionForAssignmentFlags flags = ConversionForAssignmentFlags.None)
2349BoundExpression operand,
2468void tryConversion(BoundExpression expr, ref bool reportedError, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
2553ImmutableArray<BoundExpression> tupleArguments,
2567var argument = tupleArguments[i];
2585var stack = ArrayBuilder<(Binder, IfStatementSyntax IfStatementSyntax, BoundExpression Condition, BoundStatement Consequence)>.GetInstance();
2590var condition = binder.BindBooleanExpression(node.Condition, diagnostics);
2624BoundExpression condition;
2649internal BoundExpression BindBooleanExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2685var expr = BindValue(node, diagnostics, BindValueKind.RValue);
2766BoundExpression resultOperand = CreateConversion(
3040BoundExpression arg = null;
3175internal BoundExpression CreateReturnConversion(
3178BoundExpression argument,
3306BoundExpression boundFilter = null;
3396BoundExpression exceptionSource = null;
3416private BoundExpression BindCatchFilter(CatchFilterClauseSyntax filter, BindingDiagnosticBag diagnostics)
3420BoundExpression boundFilter = this.BindBooleanExpression(filter.FilterExpression, diagnostics);
3483private static bool IsValidStatementExpression(SyntaxNode syntax, BoundExpression expression)
3513internal BoundBlock CreateBlockFromExpression(CSharpSyntaxNode node, ImmutableArray<LocalSymbol> locals, RefKind refKind, BoundExpression expression, ExpressionSyntax expressionSyntax, BindingDiagnosticBag diagnostics)
3602private static bool IsValidExpressionBody(SyntaxNode expressionSyntax, BoundExpression expression)
3643BoundExpression expression = bodyBinder.BindValue(expressionSyntax, diagnostics, requiredValueKind);
3659BoundExpression expression = bodyBinder.BindValue(expressionSyntax, diagnostics, requiredValueKind);
3663public BoundBlock CreateBlockFromExpression(ExpressionSyntax body, BoundExpression expression, BindingDiagnosticBag diagnostics)
3773BoundExpression initializerInvocation = GetBinder(initializer).BindConstructorInitializer(initializer.ArgumentList, (MethodSymbol)this.ContainingMember(), diagnostics);
3851BoundExpression initializerInvocation = GetBinder(initializer).BindConstructorInitializer(initializer.ArgumentList, (MethodSymbol)this.ContainingMember(), diagnostics);
3862BoundExpression? initializerInvocation;
3883internal static BoundExpression? BindImplicitConstructorInitializer(
4033BoundExpression receiver = new BoundThisReference(syntax, constructor.ContainingType) { WasCompilerGenerated = true };
4039arguments: ImmutableArray<BoundExpression>.Empty,
4079BoundExpression receiver = new BoundThisReference(syntax, constructor.ContainingType) { WasCompilerGenerated = true };
4080BoundExpression argument = new BoundParameter(syntax, constructor.Parameters[0]);
4177internal PatternLookupResult PerformPatternMethodLookup(BoundExpression receiver, string methodName,
4187var boundAccess = BindInstanceMemberAccess(
4212var patternMethodCall = BindMethodGroupInvocation(
Binder\Binder_TupleOperators.cs (32)
26BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
30BoundExpression convertedLeft = ApplyConvertedTypes(left, operators, isRight: false, diagnostics);
31BoundExpression convertedRight = ApplyConvertedTypes(right, operators, isRight: true, diagnostics);
38private BoundExpression ApplyConvertedTypes(BoundExpression expr, TupleBinaryOperatorInfo @operator, bool isRight, BindingDiagnosticBag diagnostics)
54ImmutableArray<BoundExpression> arguments = tuple.Arguments;
58var builder = ArrayBuilder<BoundExpression>.GetInstance(length);
83BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
98BoundExpression comparison = BindSimpleBinaryOperator(node, diagnostics, left, right, leaveUnconvertedIfInterpolatedString: false);
107out BoundExpression conversionIntoBoolOperator, out BoundValuePlaceholder conversionIntoBoolOperatorPlaceholder,
127out BoundExpression conversionForBool, out BoundValuePlaceholder conversionForBoolPlaceholder, out UnaryOperatorSignature boolOperator)
161BoundExpression comparisonResult = new BoundTupleOperandPlaceholder(node, type);
184BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
207BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
236(ImmutableArray<BoundExpression> leftParts, ImmutableArray<string> leftNames) = GetTupleArgumentsOrPlaceholders(left);
237(ImmutableArray<BoundExpression> rightParts, ImmutableArray<string> rightNames) = GetTupleArgumentsOrPlaceholders(right);
272private static void ReportNamesMismatchesIfAny(BoundExpression left, BoundExpression right,
332internal static BoundExpression GiveTupleTypeToDefaultLiteralIfNeeded(BoundExpression expr, TypeSymbol targetType)
343private static bool IsTupleBinaryOperation(BoundExpression left, BoundExpression right)
356private static int GetTupleCardinality(BoundExpression expr)
382private static (ImmutableArray<BoundExpression> Elements, ImmutableArray<string> Names) GetTupleArgumentsOrPlaceholders(BoundExpression expr)
391ImmutableArray<BoundExpression> placeholders = tupleType.TupleElementTypesWithAnnotations
392.SelectAsArray((t, s) => (BoundExpression)new BoundTupleOperandPlaceholder(s, t.Type), expr.Syntax);
403ImmutableArray<BoundExpression> elements, ImmutableArray<string> names,
Binder\ForEachLoopBinder.cs (29)
192BoundExpression collectionExpr = originalBinder.GetBinder(_syntax.Expression).BindRValueWithoutTargetType(_syntax.Expression, diagnostics);
224BoundExpression collectionExpr = originalBinder.GetBinder(_syntax.Expression).BindRValueWithoutTargetType(_syntax.Expression, diagnostics);
277BoundExpression iterationErrorExpression = null;
516BoundExpression elementConversion = CreateConversion(_syntax, elementPlaceholder, elementConversionClassification, isCast: false, conversionGroupOpt: null, InConversionGroupFlags.Unspecified, iterationVariableType.Type, createConversionDiagnostics);
567BoundExpression convertedCollectionExpression = ConvertForEachCollection(collectionExpr, collectionConversionClassification, builder.CollectionType, diagnostics);
631BoundExpression collectionExpr = this.GetBinder(collectionSyntax).BindValue(collectionSyntax, diagnostics, BindValueKind.RValue);
640protected BoundExpression ConvertForEachCollection(
641BoundExpression collectionExpr,
651BoundExpression convertedCollectionExpression = CreateConversion(
685ref BoundExpression collectionExpr,
721private BoundExpression UnwrapCollectionExpressionIfNullable(BoundExpression collectionExpr, BindingDiagnosticBag diagnostics)
781ref BoundExpression collectionExpr,
789BoundExpression originalCollectionExpr = collectionExpr;
835private EnumeratorResult GetEnumeratorInfoCore(SyntaxNode syntax, SyntaxNode collectionSyntax, ref BoundExpression collectionExpr, bool isAsync, BindingDiagnosticBag diagnostics, out ForEachEnumeratorInfo.Builder builder)
876BoundExpression span = new BoundValuePlaceholder(collectionExpr.Syntax, spanType).MakeCompilerGenerated();
878var originalSpan = span;
924var originalCollectionExpr = collectionExpr;
937EnumeratorResult getEnumeratorInfo(SyntaxNode syntax, SyntaxNode collectionSyntax, ref BoundExpression collectionExpr, bool isAsync, BindingDiagnosticBag diagnostics, out ForEachEnumeratorInfo.Builder builder)
981var unwrappedCollectionExpr = UnwrapCollectionExpressionIfNullable(collectionExpr, diagnostics);
1030EnumeratorResult createPatternBasedEnumeratorResult(ref ForEachEnumeratorInfo.Builder builder, BoundExpression collectionExpr, bool isAsync, bool viaExtensionMethod, BindingDiagnosticBag diagnostics)
1070private EnumeratorResult SatisfiesIEnumerableInterfaces(SyntaxNode collectionSyntax, ref ForEachEnumeratorInfo.Builder builder, BoundExpression collectionExpr, bool isAsync, BindingDiagnosticBag diagnostics, TypeSymbol unwrappedCollectionExprType)
1197private void GetDisposalInfoForEnumerator(SyntaxNode syntax, ref ForEachEnumeratorInfo.Builder builder, BoundExpression expr, bool isAsync, BindingDiagnosticBag diagnostics)
1219var argsBuilder = ArrayBuilder<BoundExpression>.GetInstance(patternDisposeMethod.ParameterCount);
1338private bool SatisfiesGetEnumeratorPattern(SyntaxNode syntax, SyntaxNode collectionSyntax, ref ForEachEnumeratorInfo.Builder builder, BoundExpression collectionExpr, bool isAsync, bool viaExtensionMethod, BindingDiagnosticBag diagnostics)
1514private MethodArgumentInfo FindForEachPatternMethodViaExtension(SyntaxNode syntax, SyntaxNode collectionSyntax, BoundExpression collectionExpr, string methodName, BindingDiagnosticBag diagnostics)
1583BoundExpression extensionReceiver = result.IsExtensionBlockMember() ? collectionExpr : null;
1951private MethodArgumentInfo BindDefaultArguments(MethodSymbol method, BoundExpression extensionReceiverOpt, bool expanded, SyntaxNode syntax, BindingDiagnosticBag diagnostics)
1961var argsBuilder = ArrayBuilder<BoundExpression>.GetInstance(method.ParameterCount);
Binder\RefSafetyAnalysis.cs (19)
71private HashSet<BoundExpression>? _visited = new HashSet<BoundExpression>();
341else if (node is BoundExpression expr)
351private void AssertVisited(BoundExpression expr)
742private void VisitArgumentsAndGetArgumentPlaceholders(BoundExpression? receiverOpt, ImmutableArray<BoundExpression> arguments, bool isExtensionBlockMethod)
746var arg = arguments[i];
872BoundExpression? receiver,
874ImmutableArray<BoundExpression> arguments,
920SafeContext getArgumentEscapeScope(int nArgumentsVisited, ImmutableArray<BoundExpression> arguments, int argIndex)
1121private void VisitDeconstructionArguments(ArrayBuilder<DeconstructionVariable> variables, SyntaxNode syntax, Conversion conversion, BoundExpression right)
1200internal readonly BoundExpression Expression;
1204internal DeconstructionVariable(BoundExpression expression, SafeContext valEscape, ArrayBuilder<DeconstructionVariable>? nestedVariables)
1216foreach (var arg in arguments)
1222DeconstructionVariable getDeconstructionAssignmentVariable(BoundExpression expr)
1230private static ImmutableArray<BoundExpression> GetDeconstructionRightParts(BoundExpression expr)
1256ImmutableArray<BoundExpression> arguments;
1261inlineArray: node.Expression is not BoundConversion { Conversion.IsIdentity: true, ExplicitCastInCode: false, Operand: BoundExpression operand } ? node.Expression : operand,
Binder\Semantics\Conversions\ConversionsBase.cs (25)
75protected abstract Conversion GetInterpolatedStringConversion(BoundExpression source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo);
98public Conversion ClassifyImplicitConversionFromExpression(BoundExpression sourceExpression, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
283public Conversion ClassifyConversionFromExpression(BoundExpression sourceExpression, TypeSymbol destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool forCast = false)
375private Conversion ClassifyConversionFromExpressionForCast(BoundExpression source, TypeSymbol destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
541public Conversion ClassifyStandardConversion(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
605private Conversion ClassifyStandardImplicitConversion(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
782private Conversion GetImplicitUserDefinedOrUnionConversion(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
886private Conversion GetExplicitUserDefinedConversion(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1044private Conversion ClassifyImplicitBuiltInConversionFromExpression(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1089var innerExpression = ((BoundExpressionWithNullability)sourceExpression).Expression;
1199private Conversion GetSwitchExpressionConversion(BoundExpression source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1228private Conversion GetConditionalExpressionConversion(BoundExpression source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1246private static Conversion ClassifyNullLiteralConversion(BoundExpression source, TypeSymbol destination)
1285private static Conversion ClassifyImplicitConstantExpressionConversion(BoundExpression source, TypeSymbol destination)
1364internal static bool HasImplicitConstantExpressionConversion(BoundExpression source, TypeSymbol destination)
1416private Conversion ClassifyExplicitOnlyConversionFromExpression(BoundExpression sourceExpression, TypeSymbol destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool forCast)
1456private static bool HasImplicitEnumerationConversion(BoundExpression source, TypeSymbol destination)
1656private static bool HasAnonymousFunctionConversion(BoundExpression source, TypeSymbol destination, CSharpCompilation compilation)
1936public Conversion ClassifyImplicitExtensionMethodThisArgConversion(BoundExpression sourceExpressionOpt, TypeSymbol sourceType, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool isMethodGroupConversion)
1975(ConversionsBase conversions, BoundExpression s, TypeWithAnnotations d, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> u, bool forCast) =>
2295private delegate Conversion ClassifyConversionFromExpressionDelegate(ConversionsBase conversions, BoundExpression sourceExpression, TypeWithAnnotations destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool forCast);
2310(ConversionsBase conversions, BoundExpression s, TypeWithAnnotations d, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> u, bool forCast)
2328(ConversionsBase conversions, BoundExpression s, TypeWithAnnotations d, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> u, bool forCast) =>
2360var argument = arguments[i];
3055internal bool HasImplicitConversionToOrImplementsVarianceCompatibleInterface(BoundExpression expressionToCheck, NamedTypeSymbol targetInterfaceType, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, out bool needSupportForRefStructInterfaces)
Binder\Semantics\Conversions\UserDefinedImplicitConversions.cs (7)
26BoundExpression sourceExpression,
143BoundExpression sourceExpression,
282BoundExpression sourceExpression,
575private bool IsEncompassedBy(BoundExpression aExpr, TypeSymbol a, TypeSymbol b, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
594private Conversion EncompassingImplicitConversion(BoundExpression aExpr, TypeSymbol a, TypeSymbol b, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
985BoundExpression sourceExpression,
1022BoundExpression sourceExpression,
Binder\Semantics\Operators\BinaryOperatorOverloadResolution.cs (39)
26BoundExpression left,
27BoundExpression right,
41internal void BinaryOperatorOverloadResolution_EasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result)
62BoundExpression left,
63BoundExpression right,
224BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo,
336private void GetDelegateOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right,
466BoundExpression nonDelegate = leftDelegate ? right : left;
477private void GetEnumOperation(BinaryOperatorKind kind, TypeSymbol enumType, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> operators)
601private void GetEnumOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> results)
688BoundExpression left,
689BoundExpression right,
719private void GetAllBuiltInOperators(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
776static bool useOnlyReferenceEquality(Conversions conversions, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
785static bool isUtf8ByteRepresentation(BoundExpression value)
790Conversion getOperandConversionForAllowByRefLikeNullCheck(bool isChecked, BoundExpression operand, TypeSymbol objectType, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
805BoundExpression left,
806BoundExpression right,
870BoundExpression left,
871BoundExpression right,
1103BoundExpression left,
1104BoundExpression right,
1170BoundExpression left,
1171BoundExpression right,
1223private BetterResult BetterOperator(BinaryOperatorSignature op1, BinaryOperatorSignature op2, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1437BoundExpression left,
1438BoundExpression right,
1512void inferTypeArgumentsAndRemoveInapplicableToReceiverType(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> operators, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1586bool isApplicableToReceiver(in BinaryOperatorSignature candidate, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1612bool isOperandApplicableToReceiver(in BinaryOperatorSignature candidate, BoundExpression operand, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
Binder\Semantics\Operators\UnaryOperatorOverloadResolution.cs (13)
29BoundExpression operand,
78BoundExpression operand,
153void inferTypeArgumentsAndRemoveInapplicableToReceiverType(UnaryOperatorKind kind, BoundExpression operand, ArrayBuilder<UnaryOperatorSignature> operators, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
218bool isApplicableToReceiver(in UnaryOperatorSignature candidate, BoundExpression operand, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
309BoundExpression operand,
375BoundExpression operand,
427private BetterResult BetterOperator(UnaryOperatorSignature op1, UnaryOperatorSignature op2, BoundExpression operand, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
498private void GetAllBuiltInOperators(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, ArrayBuilder<UnaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
529private bool CandidateOperators(bool isChecked, ArrayBuilder<UnaryOperatorSignature> operators, BoundExpression operand, ArrayBuilder<UnaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
549private void GetEnumOperations(UnaryOperatorKind kind, BoundExpression operand, ArrayBuilder<UnaryOperatorSignature> operators)
580private static UnaryOperatorSignature? GetPointerOperation(UnaryOperatorKind kind, BoundExpression operand)
609BoundExpression operand,
655BoundExpression operand,
Binder\Semantics\OverloadResolution\MethodTypeInference.cs (28)
97internal abstract TypeWithAnnotations GetTypeWithAnnotations(BoundExpression expr);
103internal override TypeWithAnnotations GetTypeWithAnnotations(BoundExpression expr)
140private readonly ImmutableArray<BoundExpression> _arguments;
278ImmutableArray<BoundExpression> arguments,// Required; in scenarios like method group conversions where there are
331ImmutableArray<BoundExpression> arguments,
613BoundExpression argument = _arguments[arg];
622private void MakeExplicitParameterTypeInferences(Binder binder, BoundExpression argument, TypeWithAnnotations target, ExactOrBoundsKind kind, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
695MakeExplicitParameterTypeInferences(binder, (BoundExpression)element, targetElementType, kind, ref useSiteInfo);
752var sourceArgument = sourceArguments[i];
872var argument = _arguments[arg];
877private void MakeOutputTypeInferences(Binder binder, BoundExpression argument, TypeWithAnnotations formalType, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
914if (element is BoundExpression expression)
945var sourceArgument = sourceArguments[i];
1010private static bool DoesInputTypeContain(BoundExpression argument, TypeSymbol formalParameterType, TypeParameterSymbol typeParameter)
1046private bool HasUnfixedParamInInputType(BoundExpression pSource, TypeSymbol pDest)
1065private static bool DoesOutputTypeContain(BoundExpression argument, TypeSymbol formalParameterType,
1106private bool HasUnfixedParamInOutputType(BoundExpression argument, TypeSymbol formalParameterType)
1147var argument = _arguments[iArg];
1369private void OutputTypeInference(Binder binder, BoundExpression expression, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1402private bool InferredReturnTypeInference(BoundExpression source, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1438private bool MethodGroupReturnTypeInference(Binder binder, BoundExpression source, TypeSymbol target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1547private void ExplicitParameterTypeInference(BoundExpression source, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1602private void ExplicitReturnTypeInference(BoundExpression source, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
3060private TypeWithAnnotations InferReturnType(BoundExpression source, NamedTypeSymbol target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
3189BoundExpression receiver,
3244ImmutableArray<BoundExpression> arguments,
3259ImmutableArray<BoundExpression> arguments,
3306var argument = _arguments[0];
Binder\Semantics\OverloadResolution\OverloadResolution.cs (17)
140BoundExpression receiver,
166BoundExpression receiverOpt,
188BoundExpression receiver,
431BoundExpression receiver,
582BoundExpression receiverOpt) where TMember : Symbol
2098ArrayBuilder<BoundExpression> arguments,
2137ArrayBuilder<BoundExpression> arguments,
2615ArrayBuilder<BoundExpression> arguments,
2718private static void GetParameterCounts<TMember>(MemberResolutionResult<TMember> m, ArrayBuilder<BoundExpression> arguments, out int declaredParameterCount, out int parametersUsedIncludingExpansionAndOptional) where TMember : Symbol
2870private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, TypeSymbol t2, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
2885BoundExpression node,
2940private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, Conversion conv1, TypeSymbol t2, Conversion conv2, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, out bool okToDowngradeToNeither)
3145elementBetterResult = BetterConversionFromExpression((BoundExpression)element, elementType1, conversionToE1, elementType2, conversionToE2, ref useSiteInfo, okToDowngradeToNeither: out _);
3265private bool ExpressionMatchExactly(BoundExpression node, TypeSymbol t, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
3423if (!(node is BoundExpression))
4551BoundExpression argument = arguments.Argument(argumentPosition);
4696BoundExpression argument,
Binder\Semantics\OverloadResolution\OverloadResolutionResult.cs (9)
211BoundExpression receiver,
667BoundExpression receiverOpt,
764BoundExpression receiver,
793var instanceArgument = arguments.Arguments[0];
1107foreach (var argument in arguments.Arguments)
1122BoundExpression receiver,
1199BoundExpression argument = arguments.Argument(arg);
1409static bool isStringLiteralToInterpolatedStringHandlerArgumentConversion(BoundExpression argument, ParameterSymbol parameter)
1430private bool HadAmbiguousWorseMethods(CSharpCompilation compilation, BindingDiagnosticBag diagnostics, ImmutableArray<Symbol> symbols, Location location, bool isQuery, BoundExpression receiver, string name, bool isExtension)
BoundTree\BoundObjectCreationExpression.cs (3)
12public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt,
18public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded,
24public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments,
BoundTree\Constructors.cs (66)
16BoundExpression? receiver,
26BoundExpression? receiver,
38BoundExpression? receiver,
50BoundExpression? receiver,
59private static bool NeedsByValueFieldAccess(BoundExpression? receiver, FieldSymbol fieldSymbol)
88BoundExpression? receiverOpt,
91ImmutableArray<BoundExpression> arguments,
106public BoundCall Update(BoundExpression? receiverOpt,
109ImmutableArray<BoundExpression> arguments,
123BoundExpression receiverOpt,
125ImmutableArray<BoundExpression> arguments,
165public BoundCall Update(ImmutableArray<BoundExpression> arguments)
170public BoundCall Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments)
175public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method)
177return Synthesized(syntax, receiverOpt, initialBindingReceiverIsSubjectToCloning: initialBindingReceiverIsSubjectToCloning, method, ImmutableArray<BoundExpression>.Empty);
180public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, BoundExpression arg0)
185public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, BoundExpression arg0, BoundExpression arg1)
190public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt = default)
260public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, params BoundExpression[] arguments)
261: this(syntax, constructor, ImmutableArray.Create<BoundExpression>(arguments), default(ImmutableArray<string?>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), default(BitVector), null, null, constructor.ContainingType)
264public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments)
274BoundExpression receiverOpt,
276ImmutableArray<BoundExpression> arguments,
299BoundExpression? receiverOpt,
302ImmutableArray<BoundExpression> arguments,
314public BoundIndexerAccess Update(BoundExpression? receiverOpt,
317ImmutableArray<BoundExpression> arguments,
335public static BoundConversion SynthesizedNonUserDefined(SyntaxNode syntax, BoundExpression operand, Conversion conversion, TypeSymbol type, ConstantValue? constantValueOpt = null)
358BoundExpression operand,
386BoundExpression operand,
415BoundExpression left,
416BoundExpression right,
442BoundExpression left,
443BoundExpression right,
455BoundExpression left,
456BoundExpression right,
484public BoundTypeExpression(SyntaxNode syntax, AliasSymbol? aliasOpt, BoundTypeExpression? boundContainingTypeOpt, ImmutableArray<BoundExpression> boundDimensionsOpt, TypeWithAnnotations typeWithAnnotations, bool hasErrors = false)
491: this(syntax, aliasOpt, boundContainingTypeOpt, ImmutableArray<BoundExpression>.Empty, typeWithAnnotations, hasErrors)
505public BoundTypeExpression(SyntaxNode syntax, AliasSymbol? aliasOpt, ImmutableArray<BoundExpression> dimensionsOpt, TypeWithAnnotations typeWithAnnotations, bool hasErrors = false)
531public BoundAssignmentOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right,
540public BoundBadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol?> symbols, ImmutableArray<BoundExpression> childBoundNodes, TypeSymbol type)
572public static BoundReturnStatement Synthesized(SyntaxNode syntax, RefKind refKind, BoundExpression expression, bool hasErrors = false)
636public BoundAddressOfOperator(SyntaxNode syntax, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
649public static BoundDagTemp ForOriginalInput(BoundExpression expr) => new BoundDagTemp(expr.Syntax, expr.Type!, source: null);
656BoundExpression left,
657BoundExpression right,
659BoundExpression? leftConversion,
661BoundExpression? finalConversion,
670BoundExpression left,
671BoundExpression right,
673BoundExpression? leftConversion,
675BoundExpression? finalConversion,
686BoundExpression operand,
698BoundExpression operand,
712BoundExpression operand,
716BoundExpression? operandConversion,
718BoundExpression? resultConversion,
726public BoundIncrementOperator Update(UnaryOperatorKind operatorKind, BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, BoundValuePlaceholder? resultPlaceholder, BoundExpression? resultConversion, LookupResultKind resultKind, TypeSymbol type)
BoundTree\UnboundLambda.cs (10)
217var types = ArrayBuilder<(BoundExpression expr, TypeWithAnnotations resultType, bool isChecked)>.GetInstance();
261ArrayBuilder<(BoundExpression expr, TypeWithAnnotations resultType, bool isChecked)> returns,
370if (!(node is BoundExpression))
391var expression = node.ExpressionOpt;
623protected abstract BoundExpression? GetLambdaExpressionBody(BoundBlock body);
628protected abstract BoundBlock CreateBlockFromLambdaExpressionBody(Binder lambdaBodyBinder, BoundExpression expression, BindingDiagnosticBag diagnostics);
847GetLambdaExpressionBody(returnInferenceLambda.Body) is BoundExpression expression &&
1634protected override BoundExpression? GetLambdaExpressionBody(BoundBlock body)
1641statements[0] is BoundReturnStatement { RefKind: Microsoft.CodeAnalysis.RefKind.None, ExpressionOpt: BoundExpression expr })
1649protected override BoundBlock CreateBlockFromLambdaExpressionBody(Binder lambdaBodyBinder, BoundExpression expression, BindingDiagnosticBag diagnostics)
CodeGen\EmitArrayInitializer.cs (29)
68ImmutableArray<BoundExpression> inits,
82ImmutableArray<BoundExpression> inits,
87var init = inits[i];
101private static bool ShouldEmitInitExpression(bool includeConstants, BoundExpression init)
124public IndexDesc(int index, ImmutableArray<BoundExpression> initializers)
131public readonly ImmutableArray<BoundExpression> Initializers;
135ImmutableArray<BoundExpression> inits,
189var init = inits[i];
206var initExpr = inits[i];
216private static ConstantValue AsConstOrDefault(BoundExpression init)
246private ArrayInitializerStyle ShouldEmitBlockInitializer(TypeSymbol elementType, ImmutableArray<BoundExpression> inits)
296private void InitializerCountRecursive(ImmutableArray<BoundExpression> inits, ref int initCount, ref int constInits)
303foreach (var init in inits)
331private ImmutableArray<byte> GetRawData(ImmutableArray<BoundExpression> initializers)
343private void SerializeArrayRecursive(BlobBuilder bw, ImmutableArray<BoundExpression> inits)
349foreach (var init in inits)
356foreach (var init in inits)
367private static bool IsMultidimensionalInitializer(ImmutableArray<BoundExpression> inits)
397private bool TryEmitOptimizedReadonlySpanCreation(NamedTypeSymbol spanType, BoundExpression wrappedExpression, bool used, BoundExpression inPlaceTarget, out bool avoidInPlace, BoundExpression? start = null, BoundExpression? length = null)
480ImmutableArray<BoundExpression> initializers = initializer.Initializers;
630bool tryEmitAsCachedArrayFromBlob(NamedTypeSymbol spanType, BoundExpression wrappedExpression, int elementCount, ImmutableArray<byte> data, ref ArrayTypeSymbol arrayType, TypeSymbol elementType)
680bool tryEmitAsCachedArrayOfConstants(BoundArrayCreation arrayCreation, ArrayTypeSymbol arrayType, TypeSymbol elementType, NamedTypeSymbol spanType, bool used, BoundExpression? inPlaceTarget, out bool avoidInPlace)
754void emitEmptyReadonlySpan(NamedTypeSymbol spanType, BoundExpression wrappedExpression, bool used, BoundExpression? inPlaceTarget)
811private ImmutableArray<byte> GetRawDataForArrayInit(ImmutableArray<BoundExpression> initializers)
818foreach (var init in initializers)
CodeGen\EmitExpression.cs (51)
36private void EmitExpression(BoundExpression expression, bool used)
77private void EmitExpressionCoreWithStackGuard(BoundExpression expression, bool used)
94private void EmitExpressionCore(BoundExpression expression, bool used)
407var receiver = expression.Receiver;
542var whenNull = expression.WhenNullOpt;
709BoundExpression argument = expression.Arguments[i];
715private void EmitArgument(BoundExpression argument, RefKind refKind)
811var receiver = mg != null ? mg.ReceiverOpt : expression.Argument;
950foreach (var se in sideEffects)
957private void EmitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
978internal static RefKind GetArgumentRefKind(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt, int i)
1180var receiver = fieldAccess.ReceiverOpt;
1208private LocalDefinition EmitFieldLoadReceiver(BoundExpression receiver)
1236private bool EmitFieldLoadReceiverAddress(BoundExpression receiver)
1275private bool FieldLoadPrefersRef(BoundExpression receiver)
1328internal static bool FieldLoadMustUseRef(BoundExpression expr)
1517private bool CanUseCallOnRefTypeReceiver(BoundExpression receiver)
1585var seqValue = ((BoundSequence)(receiver)).Value;
1589var rhs = ((BoundAssignmentOperator)receiver).Right;
1607private bool IsThisReceiver(BoundExpression receiver)
1615var seqValue = ((BoundSequence)(receiver)).Value;
1649var receiver = call.ReceiverOpt;
1669var receiver = call.ReceiverOpt;
1853var receiver = call.ReceiverOpt;
1947var receiver = call.ReceiverOpt;
1974var receiver = call.ReceiverOpt;
2053var receiver = call.ReceiverOpt;
2115internal static bool IsPossibleReferenceTypeReceiverOfConstrainedCall(BoundExpression receiver)
2127internal static bool ReceiverIsKnownToReferToTempIfReferenceType(BoundExpression receiver)
2145internal static bool IsSafeToDereferenceReceiverRefAfterEvaluatingArguments(ImmutableArray<BoundExpression> arguments)
2149static bool isSafeToDereferenceReceiverRefAfterEvaluatingArgument(BoundExpression expression)
2151var current = expression;
2241internal static bool IsRef(BoundExpression receiver)
2267private static int GetCallStackBehavior(MethodSymbol method, ImmutableArray<BoundExpression> arguments)
2445foreach (var init in initializer.Initializers)
2466foreach (var arg in expression.Arguments)
2500private bool TryEmitOptimizedReadonlySpan(BoundObjectCreationExpression expression, bool used, BoundExpression inPlaceTarget, out bool avoidInPlace)
2619var left = assignmentOperator.Left;
2634var right = assignmentOperator.Right;
2682private bool SafeToGetWriteableReference(BoundExpression left)
2709private void InPlaceInit(BoundExpression target, bool used)
2724private bool TryInPlaceCtorCall(BoundExpression target, BoundObjectCreationExpression objCreation, bool used)
2770private bool PartialCtorResultCannotEscape(BoundExpression left)
2796private static bool TargetIsNotOnHeap(BoundExpression left)
2814var assignmentTarget = assignmentOperator.Left;
3034BoundExpression lhs = assignmentOperator.Left;
3105BoundExpression expression = assignment.Left;
3140var array = ((BoundArrayAccess)expression).Expression;
3425var operand = isOp.Operand;
3451var operand = asOp.Operand;
3947private TypeSymbol StackMergeType(BoundExpression expr)
CodeGen\EmitStackAllocInitializer.cs (8)
16private void EmitStackAlloc(TypeSymbol type, BoundArrayInitialization? inits, BoundExpression count)
129private ArrayInitializerStyle ShouldEmitBlockInitializerForStackAlloc(TypeSymbol elementType, ImmutableArray<BoundExpression> inits)
162private void StackAllocInitializerCount(ImmutableArray<BoundExpression> inits, ref int initCount, ref int constInits)
169foreach (var init in inits)
181private void EmitElementStackAllocInitializers(TypeSymbol elementType, ImmutableArray<BoundExpression> inits, bool includeConstants)
185foreach (BoundExpression init in inits)
199private void EmitPointerElementAccess(BoundExpression init, TypeSymbol elementType, int elementTypeSizeInBytes, int index)
226private void EmitIntConstantOrSizeOf(BoundExpression init, TypeSymbol elementType, int elementTypeSizeInBytes)
CodeGen\EmitStatement.cs (19)
172private void EmitThrow(BoundExpression thrown)
228private static BoundExpression TryReduce(BoundBinaryOperator condition, ref bool sense)
235BoundExpression nonConstOp;
236BoundExpression constOp = (condition.Left.ConstantValueOpt != null) ? condition.Left : null;
358private void EmitCondBranch(BoundExpression condition, ref object dest, bool sense)
376private void EmitCondBranchCoreWithStackGuard(BoundExpression condition, ref object dest, bool sense)
393private void EmitCondBranchCore(BoundExpression condition, ref object dest, bool sense)
426var stack = ArrayBuilder<(BoundExpression? condition, StrongBox<object?> destBox, bool sense)>.GetInstance();
432(BoundExpression? condition, StrongBox<object?> destBox, bool sense) top = stack.Pop();
500var reduced = TryReduce(binOp, ref sense);
529var receiver = ca.Receiver;
587var operand = isOp.Operand;
874var expressionOpt = boundReturnStatement.ExpressionOpt;
1144var exceptionSourceOpt = catchBlock.ExceptionSourceOpt;
1157BoundExpression exceptionSource = exceptionSourceOpt;
1276BoundExpression expression,
1991BoundExpression caseExpressionOpt = node.CaseExpressionOpt;
2003BoundExpression condition = node.Condition;
2011BoundExpression expression = node.Expression;
CodeGen\Optimizer.cs (119)
397private readonly ArrayBuilder<(BoundExpression, ExprContext)> _evalStack;
418ArrayBuilder<ValueTuple<BoundExpression, ExprContext>> evalStack,
435var evalStack = ArrayBuilder<ValueTuple<BoundExpression, ExprContext>>.GetInstance();
447BoundExpression expr = node as BoundExpression;
461private BoundExpression VisitExpressionCore(BoundExpression node, ExprContext context)
468var result = node.ConstantValueOpt == null ?
469node = (BoundExpression)base.Visit(node) :
498private BoundExpression VisitExpression(BoundExpression node, ExprContext context)
500BoundExpression result;
518private BoundExpression VisitExpressionCoreWithStackGuard(BoundExpression node, ExprContext context)
524var result = VisitExpressionCore(node, context);
539private void PushEvalStack(BoundExpression result, ExprContext context)
720ArrayBuilder<BoundExpression> rewrittenSideeffects = null;
725var sideeffect = sideeffects[i];
726var rewrittenSideeffect = this.VisitExpression(sideeffect, ExprContext.Sideeffects);
730rewrittenSideeffects = ArrayBuilder<BoundExpression>.GetInstance();
741var value = this.VisitExpression(node.Value, origContext);
758var value = node.Value;
764var lastSideeffect = sideeffects.LastOrDefault();
905BoundExpression rewritten = sequence.Update(sequence.Locals,
910rewritten = (BoundExpression)Visit(rewritten);
920var left = VisitExpression(node.Left, isIndirectAssignment ?
948BoundExpression right = node.Right;
1025internal static bool IsFixedBufferAssignmentToRefLocal(BoundExpression left, BoundExpression right, bool isRef)
1037var lhs = node.Left;
1108var lhs = node.Left;
1133BoundExpression rewrittenReceiver = visitReceiver(node);
1159BoundExpression rewrittenReceiver = visitReceiver(node);
1163BoundExpression visitReceiver(BoundCall node)
1165var receiver = node.ReceiverOpt;
1183receiver = typeExpression.Update(aliasOpt: null, boundContainingTypeOpt: null, boundDimensionsOpt: ImmutableArray<BoundExpression>.Empty,
1195BoundCall visitArgumentsAndUpdateCall(BoundCall node, BoundExpression receiver)
1202private BoundExpression VisitCallOrConditionalAccessReceiver(BoundExpression receiver, BoundCall callOpt)
1217private void CheckCallReceiver(BoundExpression receiver, BoundCall call)
1223var unwrappedSequence = receiver;
1237private static ExprContext GetReceiverContext(BoundExpression receiver)
1264private ImmutableArray<BoundExpression> VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
1271ArrayBuilder<BoundExpression> rewrittenArguments = null;
1281private void VisitArgument(ImmutableArray<BoundExpression> arguments, ref ArrayBuilder<BoundExpression> rewrittenArguments, int i, RefKind argRefKind)
1285var arg = arguments[i];
1286BoundExpression rewrittenArg = VisitExpression(arg, context);
1290rewrittenArguments = ArrayBuilder<BoundExpression>.GetInstance();
1303ArrayBuilder<BoundExpression> rewrittenArguments = null;
1304ImmutableArray<BoundExpression> arguments = node.Arguments;
1321var rewrittenOperand = VisitExpression(node.Operand, ExprContext.Address);
1351var receiver = node.ReceiverOpt;
1433BoundExpression boundExpression = node.Expression;
1443boundExpression = (BoundExpression)this.Visit(boundExpression);
1463BoundExpression condition = this.VisitExpression(node.Condition, ExprContext.Value);
1470BoundExpression consequence = this.VisitExpression(node.Consequence, context);
1475BoundExpression alternative = this.VisitExpression(node.Alternative, context);
1484BoundExpression child = node.Left;
1513var left = (BoundExpression)this.Visit(child);
1528var right = (BoundExpression)this.Visit(binary.Right);
1562BoundExpression left = (BoundExpression)this.Visit(node.Left);
1567BoundExpression right = (BoundExpression)this.Visit(node.Right);
1583BoundExpression left = (BoundExpression)this.Visit(node.LeftOperand);
1590BoundExpression right = (BoundExpression)this.Visit(node.RightOperand);
1600BoundExpression receiver = VisitCallOrConditionalAccessReceiver(node.Receiver, callOpt: null);
1607BoundExpression whenNotNull = (BoundExpression)this.Visit(node.WhenNotNull);
1611var whenNull = node.WhenNullOpt;
1615whenNull = (BoundExpression)this.Visit(whenNull);
1638var valueTypeReceiver = (BoundExpression)this.Visit(node.ValueTypeReceiver);
1644var unwrappedSequence = node.ReferenceTypeReceiver;
1656var referenceTypeReceiver = (BoundExpression)this.Visit(node.ReferenceTypeReceiver);
1670BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
1698var exceptionSourceOpt = node.ExceptionSourceOpt;
1735BoundExpression boundFilter;
1738boundFilter = (BoundExpression)this.Visit(node.ExceptionFilterOpt);
1771ArrayBuilder<BoundExpression> rewrittenInitializers = null;
1779var initializer = initializers[i];
1780var rewrittenInitializer = this.VisitExpression(initializer, ExprContext.Value);
1784rewrittenInitializers = ArrayBuilder<BoundExpression>.GetInstance();
1802BoundExpression visitedOperand = this.VisitExpression(node.Operand, ExprContext.Address);
1808BoundExpression expressionOpt = (BoundExpression)this.Visit(node.ExpressionOpt);
2043public static bool Check(BoundExpression expression, int recursionDepth)
2110var asExpression = node as BoundExpression;
2127BoundExpression child = node.Left;
2153var left = (BoundExpression)this.Visit(child);
2158var right = (BoundExpression)this.Visit(binary.Right);
2202ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
2239var right = (BoundExpression)Visit(node.Right);
2285BoundExpression? rewrittenReceiver = visitReceiver(node);
2306BoundExpression? rewrittenReceiver = visitReceiver(node);
2310BoundExpression? visitReceiver(BoundCall node)
2312BoundExpression? receiverOpt = node.ReceiverOpt;
2316receiverOpt = (BoundExpression?)this.Visit(receiverOpt);
2324receiverOpt = typeExpression.Update(aliasOpt: null, boundContainingTypeOpt: null, boundDimensionsOpt: ImmutableArray<BoundExpression>.Empty,
2336BoundExpression visitArgumentsAndUpdateCall(BoundCall node, BoundExpression? receiverOpt)
2338ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
2347var exceptionSource = node.ExceptionSourceOpt;
2350var filter = node.ExceptionFilterOpt;
2372exceptionSource = (BoundExpression)Visit(exceptionSource);
2383filter = (BoundExpression)this.Visit(filter);
2475internal override ReadOnlyBindingDiagnostic<AssemblySymbol> GetConstantValueDiagnostics(BoundExpression boundInitValue)
Compilation\CSharpSemanticModel.cs (25)
169internal abstract BoundExpression GetSpeculativelyBoundExpression(int position, ExpressionSyntax expression, SpeculativeBindingOption bindingOption, out Binder binder, out ImmutableArray<Symbol> crefSymbols);
253private static BoundExpression GetSpeculativelyBoundExpressionHelper(Binder binder, ExpressionSyntax expression, SpeculativeBindingOption bindingOption)
260BoundExpression boundNode;
281protected BoundExpression GetSpeculativelyBoundExpressionWithoutNullability(int position, ExpressionSyntax expression, SpeculativeBindingOption bindingOption, out Binder binder, out ImmutableArray<Symbol> crefSymbols)
322var boundNode = GetSpeculativelyBoundExpressionHelper(binder, expression, bindingOption);
840BoundExpression expression = bnode.Expression;
1900BoundExpression boundExpr;
1915case BoundExpression boundExpr2:
2048var boundExpr = lowestBoundNode as BoundExpression;
2049var highestBoundExpr = highestBoundNode as BoundExpression;
2276static (TypeSymbol, NullabilityInfo) getTypeAndNullability(BoundExpression expr) => (expr.Type, expr.TopLevelNullability);
2289if (lowestBoundNode is BoundExpression boundExpr)
2310var boundExpr = lowestBoundNode as BoundExpression;
2865var bnode = binder.BindExpression(expression, BindingDiagnosticBag.Discarded);
2917var bnode = binder.BindExpression(expression, BindingDiagnosticBag.Discarded);
3353BoundExpression boundNode,
3970private static void GetSymbolsAndResultKind(BoundExpression node, Symbol symbolOpt, ImmutableArray<MethodSymbol> originalCandidates, out OneOrMany<Symbol> symbols, out LookupResultKind resultKind)
3993BoundExpression boundNode,
4112private ImmutableArray<IPropertySymbol> GetIndexerGroupSemanticSymbols(BoundExpression boundNode, Binder binderOpt)
4636var receiver = node.ReceiverOpt;
4815BoundExpression receiver = call.Arguments[0];
4824private OneOrMany<Symbol> CreateReducedExtensionMethodIfPossible(BoundDelegateCreationExpression delegateCreation, BoundExpression receiverOpt)
Compilation\MemberSemanticModel.cs (22)
192internal override BoundExpression GetSpeculativelyBoundExpression(int position, ExpressionSyntax expression, SpeculativeBindingOption bindingOption, out Binder binder, out ImmutableArray<Symbol> crefSymbols)
205var boundRoot = binder.BindExpression(expression, BindingDiagnosticBag.Discarded);
207return (BoundExpression)NullableWalker.AnalyzeAndRewriteSpeculation(position, boundRoot, binder, snapshotManager, newSnapshots: out _, remappedSymbols: ref ignored);
476var boundExpression = this.GetLowerBoundNode(bindableNode) as BoundExpression;
500var boundExpression = this.GetLowerBoundNode(bindableNode) as BoundExpression;
1094var operation = call.IsDelegateCall ? call.ReceiverOpt : call;
1298BoundExpression boundExpr = this.GetLowerBoundNode(bindableNode) as BoundExpression;
1314var boundAdd = boundCollectionInitializer.Initializers[collectionInitializer.Expressions.IndexOf(node)];
1806BoundExpression node = queryClause;
1824BoundExpression receiver = call.ReceiverOpt;
1870private static BoundExpression GetContainingArgument(ImmutableArray<BoundExpression> arguments, int position)
1872BoundExpression result = null;
1874foreach (var arg in arguments)
1876var expr = GetContainingExprOrQueryClause(arg, position);
1893private static BoundExpression GetContainingExprOrQueryClause(BoundExpression expr, int position)
1897var value = GetQueryClauseValue((BoundQueryClause)expr);
1910private static BoundExpression GetQueryClauseValue(BoundQueryClause queryClause)
Compiler\MethodBodySynthesizer.cs (12)
40BoundExpression receiver = new BoundThisReference(syntax, constructor.ContainingType) { WasCompilerGenerated = true };
48arguments: ImmutableArray<BoundExpression>.Empty,
106ImmutableArray.Create<BoundExpression>(new BoundLiteral(syntax, ConstantValue.Create(slotIndex), intType) { WasCompilerGenerated = true }),
126ImmutableArray.Create<BoundExpression>(new BoundLiteral(syntax, ConstantValue.Create(0), intType) { WasCompilerGenerated = true }),
155ImmutableArray.Create<BoundExpression>(new BoundLiteral(syntax, ConstantValue.Create(targetSubmissionIndex), intType) { WasCompilerGenerated = true }),
182BoundExpression thisReference = null;
392BoundExpression delegateUpdate;
404arguments: ImmutableArray.Create<BoundExpression>(boundBackingField, boundParameter)),
469arguments: ImmutableArray.Create<BoundExpression>(boundTmps[1], boundParameter)),
483BoundExpression compareExchange = BoundCall.Synthesized(syntax,
487arguments: ImmutableArray.Create<BoundExpression>(boundBackingField, boundTmps[2], boundTmps[1]));
499BoundExpression loopExitCondition = new BoundBinaryOperator(syntax,
FlowAnalysis\AbstractFlowPass.cs (58)
363if (node is BoundExpression or BoundPattern)
550protected void VisitLvalue(BoundExpression node)
626protected void VisitCondition(BoundExpression node)
632protected void AdjustConditionalState(BoundExpression node)
660protected virtual void VisitRvalue(BoundExpression node, bool isKnownToBeAnLvalue = false)
676protected static bool IsConstantTrue(BoundExpression node)
681protected static bool IsConstantFalse(BoundExpression node)
686protected static bool IsConstantNull(BoundExpression node)
1223(BoundExpression? construction, bool useBoolReturns, bool firstPartIsConditional) = data switch
1244protected virtual void VisitInterpolatedStringHandlerConstructor(BoundExpression? constructor)
1468private void VisitReceiverBeforeCall(BoundExpression receiverOpt, MethodSymbol method)
1476private void VisitReceiverAfterCall(BoundExpression receiverOpt, MethodSymbol method)
1565protected virtual void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1572private void VisitArgumentsBeforeCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt)
1593private void VisitArgumentsAfterCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol? method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1627protected virtual void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
1633foreach (var child in node.ChildBoundNodes)
1635VisitRvalue(child as BoundExpression);
1651VisitRvalue(child as BoundExpression);
1660foreach (var child in node.Initializers)
1720protected void SplitIfBooleanConstant(BoundExpression node)
1794BoundExpression receiver = ((BoundMethodGroup)node.Operand).ReceiverOpt;
2140if (element is BoundExpression expression)
2170protected virtual void PropertySetter(BoundExpression node, BoundExpression receiver, MethodSymbol setter, BoundExpression value = null)
2178private bool RegularPropertyAccess(BoundExpression expr)
2287private void VisitFieldAccessInternal(BoundExpression receiverOpt, FieldSymbol fieldSymbol)
2413foreach (var i in node.Indices)
2465private void VisitBinaryLogicalOperatorChildren(BoundExpression node)
2468var stack = ArrayBuilder<BoundExpression>.GetInstance();
2470BoundExpression binary;
2471BoundExpression child = node;
2507protected virtual void VisitBinaryLogicalOperatorChildren(ArrayBuilder<BoundExpression> stack)
2509BoundExpression binary;
2514BoundExpression child;
2534BoundExpression right;
2574protected virtual void AfterLeftChildOfBinaryLogicalOperatorHasBeenVisited(BoundExpression binary, BoundExpression right, bool isAnd, bool isBool, ref TLocalState leftTrue, ref TLocalState leftFalse)
2580protected void AfterRightChildOfBinaryLogicalOperatorHasBeenVisited(BoundExpression right, bool isAnd, bool isBool, ref TLocalState leftTrue, ref TLocalState leftFalse)
2709static bool isKnownNullOrNotNull(BoundExpression expr)
2808ReadOnlySpan<BoundExpression> parts;
2821foreach (var part in parts)
2905foreach (var expr in node.Bounds)
3053private bool TryVisitConditionalAccess(BoundExpression node, [NotNullWhen(true)] out TLocalState? stateWhenNotNull)
3104private bool VisitPossibleConditionalAccess(BoundExpression node, [NotNullWhen(true)] out TLocalState? stateWhenNotNull)
3163BoundExpression expr = node.AccessExpression;
3177Debug.Assert(expr is BoundExpression);
3237foreach (var se in sideEffects)
3333BoundExpression node,
3335BoundExpression condition,
3336BoundExpression consequence,
3337BoundExpression alternative)
3381private void VisitConditionalOperand(TLocalState state, BoundExpression operand, bool isByRef)
3506BoundExpression expr = node.ExpressionOpt;
3563protected void VisitAddressOfOperand(BoundExpression operand, bool shouldReadOperand)
3654private BoundNode VisitObjectOrCollectionInitializerExpression(ImmutableArray<BoundExpression> initializers)
3656foreach (var initializer in initializers)
FlowAnalysis\DefiniteAssignment.cs (21)
313protected override void VisitRvalue(BoundExpression node, bool isKnownToBeAnLvalue = false)
801protected virtual void NoteWrite(Symbol variable, BoundExpression value, bool read, bool isRef)
852internal static bool WriteConsideredUse(TypeSymbol type, BoundExpression value)
910private void NoteWrite(BoundExpression n, BoundExpression value, bool read, bool isRef)
1018protected override bool TryGetReceiverAndMember(BoundExpression expr, out BoundExpression receiver, out Symbol member)
1087protected bool MayRequireTracking(BoundExpression receiverOpt, FieldSymbol fieldSymbol)
1321protected virtual void CheckAssigned(BoundExpression expr, FieldSymbol fieldSymbol, SyntaxNode node)
1331private bool IsAssigned(BoundExpression node, out int unassignedSlot)
1434private Symbol UseNonFieldSymbolUnsafely(BoundExpression expression)
1469protected void Assign(BoundNode node, BoundExpression value, bool isRef = false, bool read = true)
1486protected virtual void AssignImpl(BoundNode node, BoundExpression value, bool isRef, bool written, bool read)
1603var expression = (BoundExpression)node;
1886foreach (var attributeArgument in boundAttribute.ConstructorArguments)
2478var initializer = node.Expression;
2496BoundExpression operand = node.Operand;
2524protected override void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2547protected void CheckAssigned(BoundExpression expr, SyntaxNode node)
2640var exceptionSource = catchBlock.ExceptionSourceOpt;
FlowAnalysis\NullableWalker.cs (304)
241private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)>.Builder? _analyzedNullabilityMapOpt;
256private PooledDictionary<BoundExpression, TypeWithState>? _methodGroupReceiverMapOpt;
258private PooledDictionary<BoundValuePlaceholderBase, (BoundExpression? Replacement, VisitResult Result)>? _resultForPlaceholdersOpt;
267private PooledDictionary<BoundExpression, Func<TypeWithAnnotations, TypeWithState>>? _targetTypedAnalysisCompletionOpt;
272/// The delegate is invoked by <see cref="VisitConversion(BoundConversion, BoundExpression, Conversion, TypeWithAnnotations, TypeWithState, bool, bool, bool, AssignmentKind, ParameterSymbol, bool, bool, bool, bool, Optional<LocalState>,bool, int, Location, ArrayBuilder<VisitResult>)"/>.
274private PooledDictionary<BoundExpression, Func<TypeWithAnnotations, TypeWithState>> TargetTypedAnalysisCompletion
275=> _targetTypedAnalysisCompletionOpt ??= PooledDictionary<BoundExpression, Func<TypeWithAnnotations, TypeWithState>>.GetInstance();
321private void SetResultType(BoundExpression? expression, TypeWithState type, bool updateAnalyzedNullability = true)
326private void SetAnalyzedNullability(BoundExpression? expression, TypeWithState type)
334private void UseRvalueOnly(BoundExpression? expression)
345private void SetLvalueResultType(BoundExpression? expression, TypeWithAnnotations type)
353private void UseLvalueOnly(BoundExpression? expression)
360private void SetResult(BoundExpression? expression, TypeWithState resultType, TypeWithAnnotations lvalueType, bool updateAnalyzedNullability = true, bool? isLvalue = null)
365private void SetResult(BoundExpression? expression, VisitResult visitResult, bool updateAnalyzedNullability, bool? isLvalue)
380private void SetAnalyzedNullability(BoundExpression? expression, TypeWithState resultType, TypeWithAnnotations lvalueType, bool? isLvalue = null)
388private void SetAnalyzedNullability(BoundExpression? expr, VisitResult result, bool? isLvalue = null)
457/// Used to allow <see cref="MakeSlot(BoundExpression)"/> to substitute the correct slot for a <see cref="BoundConditionalReceiver"/> when
492ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)>.Builder? analyzedNullabilityMapOpt,
571private void AddPlaceholderReplacement(BoundValuePlaceholderBase placeholder, BoundExpression? expression, VisitResult result)
578_resultForPlaceholdersOpt ??= PooledDictionary<BoundValuePlaceholderBase, (BoundExpression? Replacement, VisitResult Result)>.GetInstance();
1610ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)> analyzedNullabilitiesMap;
1615private static (SnapshotManager?, ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)>) AnalyzeWithSemanticInfo(
1625var analyzedNullabilities = ImmutableDictionary.CreateBuilder<BoundExpression, (NullabilityInfo, TypeSymbol?)>(EqualityComparer<BoundExpression>.Default, NullabilityInfoTypeComparer.Instance);
1683var analyzedNullabilities = ImmutableDictionary.CreateBuilder<BoundExpression, (NullabilityInfo, TypeSymbol?)>(EqualityComparer<BoundExpression>.Default, NullabilityInfoTypeComparer.Instance);
1723private static BoundNode Rewrite(ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)> updatedNullabilities, SnapshotManager? snapshotManager, BoundNode node, ref ImmutableDictionary<Symbol, Symbol>? remappedSymbols)
1850ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)>.Builder? analyzedNullabilityMapOpt,
2062protected override bool TryGetReceiverAndMember(BoundExpression expr, out BoundExpression? receiver, [NotNullWhen(true)] out Symbol? member)
2120protected override int MakeSlot(BoundExpression node)
2140int makeSlot(BoundExpression node)
2163var operand = conv.Operand;
2217int getPlaceholderSlot(BoundExpression expr)
2318protected override void VisitRvalue(BoundExpression? node, bool isKnownToBeAnLvalue = false)
2332private void VisitRvalueEpilogue(BoundExpression? node)
2338private TypeWithState VisitRvalueWithState(BoundExpression? node)
2344private TypeWithAnnotations VisitLvalueWithAnnotations(BoundExpression node)
2420BoundExpression? value,
2442var unwrappedValue = SkipReferenceConversions(value);
2609private static bool IsDefaultValue(BoundExpression expr)
2642BoundExpression? valueOpt,
3065var expr = node.ExpressionOpt;
3135private TypeWithState VisitRefExpression(BoundExpression expr, TypeWithAnnotations destinationType)
3570var receiver = withExpr.Receiver;
3694var initializer = node.InitializerOpt;
3736Debug.Assert(node is BoundExpression or BoundPattern);
3740if (node is BoundExpression expr)
3748private void VisitExpressionWithoutStackGuardEpilogue(BoundExpression node)
3765bool shouldMakeNotNullRvalue(BoundExpression node) => node.IsSuppressed || node.HasAnyErrors || !IsReachable();
3943var collectionCreation = node.GetUnconvertedCollectionCreation();
4063var addArgument = initializer.Arguments[argIndex];
4107var iteratorBody = ((BoundExpressionStatement)spread.IteratorBody).Expression;
4123var elementExpr = (BoundExpression)element;
4169var collectionCreation = node.CollectionCreation;
4348BoundExpression node, TypeSymbol type, MethodSymbol? constructor,
4349ImmutableArray<BoundExpression> arguments, ImmutableArray<VisitResult> argumentResults,
4401var operand = arguments[0];
4440BoundExpression node,
4441ImmutableArray<BoundExpression> arguments,
4455private void SetUnionValueStateFromConstructorArgument(BoundExpression argument, TypeWithState argumentTypeWithState, int containingSlot, PropertySymbol valueProperty)
4491foreach (var initializer in objectInitializer.Initializers)
4506foreach (var initializer in collectionInitializer.Initializers)
4537var left = node.Left;
4564ImmutableArray<BoundExpression> arguments = objectInitializer.Arguments;
4912private void SetNotNullResult(BoundExpression node)
4917private void SetNotNullResultForLambda(BoundExpression node, LocalState stateForLambda)
4964private int GetOrCreatePlaceholderSlot(BoundExpression node)
5007var argument = arguments[i];
5051foreach (var expr in node.Bounds)
5071var expressions = ArrayBuilder<BoundExpression>.GetInstance(initialization.Initializers.Length);
5088foreach (var expr in expressions)
5096var expressionsNoConversions = ArrayBuilder<BoundExpression>.GetInstance(n);
5099var placeholderBuilder = ArrayBuilder<BoundExpression>.GetInstance(n);
5100foreach (var expression in expressions)
5103(BoundExpression expressionNoConversion, Conversion conversion) = RemoveConversion(expression, includeExplicitConversions: false);
5132var expressionNoConversion = expressionsNoConversions[i];
5188internal static bool IsTargetTypedExpression(BoundExpression node)
5203ArrayBuilder<(BoundExpression expr, TypeWithAnnotations resultType, bool isChecked)> returns,
5227var placeholdersBuilder = ArrayBuilder<BoundExpression>.GetInstance(n);
5247BoundExpression placeholder = placeholders[i];
5268private static void GetArrayElements(BoundArrayInitialization node, ArrayBuilder<BoundExpression> builder)
5270foreach (var child in node.Initializers)
5297foreach (var i in node.Indices)
5470static bool isKnownNullOrNotNull(BoundExpression expr, TypeWithState resultType)
5476LocalState getUnconditionalStateWhenNotNull(BoundExpression otherOperand, PossiblyConditionalState conditionalStateWhenNotNull)
5564BoundExpression leftOperand,
5567BoundExpression rightOperand,
5577BoundExpression binary,
5581BoundExpression left,
5582BoundExpression leftOperand,
5585BoundExpression right,
5586BoundExpression rightOperand,
5618BoundExpression expr,
5619BoundExpression operand,
5662BoundExpression leftOperand,
5663BoundExpression rightOperand,
5713TypeSymbol? getTypeIfContainingType(TypeSymbol baseType, TypeSymbol? derivedType, BoundExpression operand)
5731BoundExpression expr, BoundExpression operand, Conversion conversion, ParameterSymbol parameter, TypeWithState operandType, bool isLifted,
5755private void VisitBinaryOperatorOperandConversionAndPostConditions(BoundExpression expr, BoundExpression operand, Conversion conversion, ParameterSymbol parameter, TypeWithState operandType, bool isLifted)
5769BoundExpression leftOperand,
5787BoundExpression? operandComparedToNull = null;
5810BoundExpression? operandComparedToNonNull = null;
5840private void SplitAndLearnFromNonNullTest(BoundExpression operandComparedToNonNull, bool whenTrue)
5872private void GetSlotsToMarkAsNotNullable(BoundExpression operand, ArrayBuilder<int> slotBuilder)
5966private void LearnFromNonNullTest(BoundExpression expression, ref LocalState state)
5994private void LearnFromNullTest(BoundExpression expression, ref LocalState state)
6001var expressionWithoutConversion = RemoveConversion(expression, includeExplicitConversions: true).expression;
6087private static BoundExpression SkipReferenceConversions(BoundExpression possiblyConversion)
6108BoundExpression leftOperand = node.LeftOperand;
6109BoundExpression rightOperand = node.RightOperand;
6147BoundExpression leftOperand = node.LeftOperand;
6148BoundExpression rightOperand = node.RightOperand;
6245private bool TryVisitConditionalAccess(BoundExpression node, out PossiblyConditionalState stateWhenNotNull)
6281private bool VisitPossibleConditionalAccess(BoundExpression node, out PossiblyConditionalState stateWhenNotNull)
6314var receiver = node.Receiver;
6353BoundExpression expr = node.AccessExpression;
6370Debug.Assert(expr is BoundExpression);
6380Debug.Assert(expr is BoundExpression);
6414void makeAndAdjustReceiverSlot(BoundExpression receiver)
6436BoundExpression node,
6438BoundExpression condition,
6439BoundExpression originalConsequence,
6440BoundExpression originalAlternative)
6471BoundExpression consequencePlaceholder = CreatePlaceholderIfNecessary(originalConsequence, consequenceLValue);
6472BoundExpression alternativePlaceholder = CreatePlaceholderIfNecessary(originalAlternative, alternativeLValue);
6490(var consequence, var consequenceConversion, consequenceRValue) = visitConditionalOperand(consequenceState, originalConsequence);
6495(var alternative, var alternativeConversion, alternativeRValue) = visitConditionalOperand(alternativeState, originalAlternative);
6527BoundExpression consequencePlaceholder = CreatePlaceholderIfNecessary(consequence, consequenceRValue.ToTypeWithAnnotations(compilation));
6528BoundExpression alternativePlaceholder = CreatePlaceholderIfNecessary(alternative, alternativeRValue.ToTypeWithAnnotations(compilation));
6569BoundExpression node, BoundExpression originalConsequence, BoundExpression originalAlternative, LocalState consequenceState, LocalState alternativeState,
6570TypeWithState consequenceRValue, TypeWithState alternativeRValue, BoundExpression consequence, Conversion consequenceConversion, bool consequenceEndReachable,
6571BoundExpression alternative, Conversion alternativeConversion, bool alternativeEndReachable, TypeWithAnnotations resultTypeWithAnnotations, bool wasTargetTyped)
6613BoundExpression node,
6614BoundExpression originalConsequence,
6615BoundExpression originalAlternative,
6620BoundExpression consequence,
6623BoundExpression alternative,
6637(BoundExpression, Conversion, TypeWithState) visitConditionalOperand(LocalState state, BoundExpression operand)
6643BoundExpression operandNoConversion;
6650(TypeWithAnnotations LValueType, TypeWithState RValueType) visitConditionalRefOperand(LocalState state, BoundExpression operand)
6658void reportMismatchIfNecessary(BoundExpression node, TypeWithAnnotations source, TypeWithAnnotations destination)
6668BoundExpression node,
6669BoundExpression operand,
6719private static BoundExpression CreatePlaceholderIfNecessary(BoundExpression expr, TypeWithAnnotations type)
6882BoundExpression? child = node.Arguments[i];
6923private TypeWithState VisitAndCheckReceiver(BoundExpression? receiverOpt, MethodSymbol method)
6939BoundExpression? receiverOpt,
6942ImmutableArray<BoundExpression> arguments,
6976private static ImmutableArray<BoundExpression> AdjustArgumentsIfNeeded(ImmutableArray<BoundExpression> arguments, bool isExtensionBlockMethod, BoundExpression? receiver)
7087if (node.ReceiverOpt is BoundExpression receiver &&
7194void learnFromEqualsMethodArguments(BoundExpression left, TypeWithState leftType, BoundExpression right, TypeWithState rightType)
7236public readonly ImmutableArray<BoundExpression> Arguments;
7240public CompareExchangeInfo(ImmutableArray<BoundExpression> arguments, ImmutableArray<VisitResult> results, ImmutableArray<int> argsToParamsOpt)
7279var comparand = compareExchangeInfo.Arguments[comparandIndex];
7295private void CheckCallReceiver(BoundExpression? receiverOpt, TypeWithState receiverType, MethodSymbol method)
7466protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7473BoundExpression node,
7474ImmutableArray<BoundExpression> arguments,
7487BoundExpression node,
7488ImmutableArray<BoundExpression> arguments,
7516ImmutableArray<BoundExpression> arguments,
7542(ImmutableArray<BoundExpression> argumentsNoConversions, ImmutableArray<Conversion> conversions) = RemoveArgumentConversions(arguments, refKindsOpt);
7554ImmutableArray<BoundExpression> arguments,
7555ImmutableArray<BoundExpression> argumentsNoConversions,
7623var argumentNoConversion = argumentsNoConversions[i];
7624var argument = i < arguments.Length ? arguments[i] : argumentNoConversion;
7726var argument = arguments[i];
7728var argumentNoConversion = argumentsNoConversions[i];
7744ImmutableArray<BoundExpression> arguments,
7745ImmutableArray<BoundExpression> argumentsNoConversions,
7765static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7775BoundExpression argument = arguments[a];
7779ImmutableArray<BoundExpression> elements;
7787elements = ((BoundCollectionExpression)((BoundConversion)argument).Operand).UnconvertedCollectionExpression.Elements.CastArray<BoundExpression>();
7808var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(arguments.Length + elements.Length - 1);
7840bool tryShortCircuitTargetTypedExpression(BoundExpression argument, BoundExpression argumentNoConversion)
7860private void ApplyMemberPostConditions(BoundExpression? receiverOpt, MethodSymbol? method)
8024ImmutableArray<BoundExpression> arguments,
8058private ImmutableArray<FlowAnalysisAnnotations> GetParametersAnnotations(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parametersOpt, ImmutableArray<int> argsToParamsOpt, bool expanded)
8086private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8092private bool VisitArgumentEvaluateNeedsCloningState(BoundExpression argument)
8098private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8151BoundExpression argumentNoConversion,
8238private bool CheckDisallowedNullAssignment(TypeWithState state, FlowAnalysisAnnotations annotations, SyntaxNode node, BoundExpression? boundValueOpt = null)
8289BoundExpression argument,
8405void trackNullableStateForAssignment(BoundExpression parameterValue, TypeWithAnnotations lValueType, int targetSlot, TypeWithState parameterWithState, bool isSuppressed, FlowAnalysisAnnotations parameterAnnotations, RefKind refKind, ParameterSymbol parameter)
8520private void LearnFromPostConditions(BoundExpression argument, FlowAnalysisAnnotations parameterAnnotations)
8566private (ImmutableArray<BoundExpression> arguments, ImmutableArray<Conversion> conversions) RemoveArgumentConversions(
8567ImmutableArray<BoundExpression> arguments,
8574var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(n);
8580var argument = arguments[i];
8584var before = argument;
8649ImmutableArray<BoundExpression> arguments,
8763internal override TypeWithAnnotations GetTypeWithAnnotations(BoundExpression expr)
8774private static NullableAnnotation GetNullableAnnotation(BoundExpression expr)
8809private ImmutableArray<BoundExpression> GetArgumentsForMethodTypeInference(ImmutableArray<VisitResult> argumentResults, ImmutableArray<BoundExpression> arguments)
8817var builder = ArrayBuilder<BoundExpression>.GetInstance(n);
8825BoundExpression getArgumentForMethodTypeInference(BoundExpression argument, VisitResult visitResult)
8849if (collection.Elements[i] is BoundExpression elementExpression)
8968private static (BoundExpression expression, Conversion conversion) RemoveConversion(BoundExpression expr, bool includeExplicitConversions)
9006private Conversion GenerateConversionForConditionalOperator(BoundExpression sourceExpression, TypeSymbol? sourceType, TypeSymbol destinationType, bool reportMismatch, bool isChecked)
9017private Conversion GenerateConversion(Conversions conversions, BoundExpression? sourceExpression, TypeSymbol? sourceType, TypeSymbol destinationType, bool fromExplicitCast, bool extensionMethodThisArgument, bool isChecked)
9046private bool UseExpressionForConversion([NotNullWhen(true)] BoundExpression? value)
9201(BoundExpression operand, Conversion conversion) = RemoveConversion(node, includeExplicitConversions: true);
9236private TypeWithState VisitOptionalImplicitConversion(BoundExpression expr, TypeWithAnnotations targetTypeOpt, bool useLegacyWarnings, bool trackMembers, AssignmentKind assignmentKind)
9249BoundExpression expr,
9256(BoundExpression operand, Conversion conversion) = RemoveConversion(expr, includeExplicitConversions: false);
9263BoundExpression expr,
9266BoundExpression operand,
9299Func<TypeWithAnnotations, TypeWithState> visitConversionAsContinuation(BoundExpression expr, bool useLegacyWarnings, bool trackMembers, AssignmentKind assignmentKind, BoundExpression operand, Conversion conversion, TypeWithState operandType)
9391ImmutableArray<BoundExpression> values,
9422void trackState(BoundExpression value, FieldSymbol field, TypeWithState valueType)
9436private void TrackNullableStateOfNullableValue(int containingSlot, TypeSymbol containingType, BoundExpression? value, TypeWithState valueType, int valueSlot)
9451BoundExpression convertedNode,
9733private static BoundConversion? GetConversionIfApplicable(BoundExpression? conversionOpt, BoundExpression convertedNode)
9764BoundExpression conversionOperand,
10385BoundExpression conversionOperand,
10530BoundExpression conversionOperand,
10678private void SnapshotWalkerThroughConversionGroup(BoundExpression conversionExpression, BoundExpression convertedNode)
10697private void TrackAnalyzedNullabilityThroughConversionGroup(TypeWithState resultType, BoundConversion? conversionOpt, BoundExpression convertedNode)
10759BoundExpression node,
10825case BoundExpression arg when arg.Type is { TypeKind: TypeKind.Delegate }:
10937Action<NamedTypeSymbol>? visitDelegateArgument(NamedTypeSymbol delegateType, BoundExpression arg, bool isTargetTyped)
10951Action<NamedTypeSymbol>? analyzeDelegateConversion(NamedTypeSymbol delegateType, BoundExpression arg, bool isTargetTyped)
10971Action<NamedTypeSymbol> analyzeDelegateConversionAsContinuation(BoundExpression arg)
10981var receiverOpt = node.ReceiverOpt;
10995private bool TryGetMethodGroupReceiverNullability([NotNullWhen(true)] BoundExpression? receiverOpt, out TypeWithState type)
11010private void SetMethodGroupReceiverNullability(BoundExpression receiver, TypeWithState type)
11012_methodGroupReceiverMapOpt ??= PooledDictionary<BoundExpression, TypeWithState>.GetInstance();
11018var receiverOpt = group.ReceiverOpt;
11031var arguments = ArrayBuilder<BoundExpression>.GetInstance();
11137private void VisitThisOrBaseReference(BoundExpression node)
11158var left = node.Left;
11159var right = node.Right;
11244private void AdjustSetValue(BoundExpression left, ref TypeWithState rightState)
11259private FlowAnalysisAnnotations GetLValueAnnotations(BoundExpression expr)
11320private static bool UseLegacyWarnings(BoundExpression expr)
11368private void VisitDeconstructionArguments(ArrayBuilder<DeconstructionVariable> variables, Conversion conversion, BoundExpression right, TypeWithState? rightResultOpt = null)
11382private void VisitDeconstructMethodArguments(ArrayBuilder<DeconstructionVariable> variables, Conversion conversion, BoundExpression right, TypeWithState? rightResultOpt)
11414ArrayBuilder<BoundExpression> placeholderArgs = ArrayBuilder<BoundExpression>.GetInstance(n + 1);
11454var nestedRight = CreatePlaceholderIfNecessary(invocation.Arguments[i + offset], parameter.TypeWithAnnotations);
11481private void VisitTupleDeconstructionArguments(ArrayBuilder<DeconstructionVariable> variables, ImmutableArray<(BoundValuePlaceholder? placeholder, BoundExpression? conversion)> deconstructConversionInfo, BoundExpression right, TypeWithState? rightResultOpt)
11492var rightPart = rightParts[i];
11567internal readonly BoundExpression Expression;
11571internal DeconstructionVariable(BoundExpression expression, TypeWithAnnotations type)
11578internal DeconstructionVariable(BoundExpression expression, ArrayBuilder<DeconstructionVariable> nestedVariables)
11590foreach (var argument in arguments)
11596DeconstructionVariable getDeconstructionAssignmentVariable(BoundExpression expr)
11614private ImmutableArray<BoundExpression> GetDeconstructionRightParts(BoundExpression expr, TypeWithState? rightResultOpt)
11644return fields.SelectAsArray((f, e) => (BoundExpression)new BoundFieldAccess(e.Syntax, e, f, constantValueOpt: null), expr);
11976var initializer = node.Expression;
11998private void ReportNullabilityMismatchInRefArgument(BoundExpression argument, TypeSymbol argumentType, ParameterSymbol parameter, TypeSymbol parameterType)
12053private ReinferenceResult<PropertySymbol> ReInferAndVisitExtensionPropertyAccess(BoundNode node, PropertySymbol property, BoundExpression receiver)
12056ImmutableArray<BoundExpression> arguments = [receiver];
12113var receiverOpt = node.ReceiverOpt;
12188private Symbol VisitMemberAccess(BoundExpression node, BoundExpression? receiverOpt, Symbol member)
12310BoundExpression collectionExpression,
12312BoundExpression expr,
12627foreach (var child in node.ChildBoundNodes)
12637private TypeWithState VisitBadExpressionChild(BoundExpression? child)
12648VisitRvalue(child as BoundExpression);
12751private MethodSymbol ReInferUnaryOperator(SyntaxNode syntax, MethodSymbol method, BoundExpression operand, TypeWithState operandType)
12824protected override void VisitBinaryLogicalOperatorChildren(ArrayBuilder<BoundExpression> stack)
12826BoundExpression binary;
12831BoundExpression? leftOperand = null;
12900void afterLeftChildOfBoundUserDefinedConditionalLogicalOperatorHasBeenVisited(BoundUserDefinedConditionalLogicalOperator binary, BoundExpression leftOperand, Conversion leftConversion)
12974protected override void AfterLeftChildOfBinaryLogicalOperatorHasBeenVisited(BoundExpression node, BoundExpression right, bool isAnd, bool isBool, ref LocalState leftTrue, ref LocalState leftFalse)
13061var operand = node.Operand;
13205var receiver = node.Receiver;
13217var expr = node.Expression;
13221var receiverOpt = (expr as BoundMethodGroup)?.ReceiverOpt;
13237var receiverOpt = node.ReceiverOpt;
13322private void SetUnknownResultNullability(BoundExpression expression)
13329var receiver = node.Receiver;
13341private bool CheckPossibleNullReceiver(BoundExpression? receiverOpt, bool checkNullableValueType = false)
13346private bool CheckPossibleNullReceiver(BoundExpression? receiverOpt, TypeWithState resultType, bool checkNullableValueType)
13390private void CheckExtensionMethodThisNullability(BoundExpression expr, Conversion conversion, ParameterSymbol parameter, TypeWithState result)
13457protected override void VisitInterpolatedStringHandlerConstructor(BoundExpression? constructor)
13526private void VisitThrow(BoundExpression? expr)
13545BoundExpression expr = node.Expression;
FlowAnalysis\NullableWalker.DebugVerifier.cs (12)
21private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> _analyzedNullabilityMap;
23private readonly HashSet<BoundExpression> _visitedExpressions = new HashSet<BoundExpression>();
26private DebugVerifier(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> analyzedNullabilityMap, SnapshotManager? snapshotManager)
37public static void Verify(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> analyzedNullabilityMap, SnapshotManager? snapshotManagerOpt, BoundNode node)
46foreach (var analyzedNode in verifier._analyzedNullabilityMap.Keys)
56foreach (var verifiedNode in verifier._visitedExpressions)
66private void VerifyExpression(BoundExpression expression, bool overrideSkippedExpression = false)
82if (node is BoundExpression expr)
98if (node is BoundExpression or BoundPattern)
174foreach (var child in node.ChildBoundNodes)
248foreach (var arg in enumeratorInfo.GetEnumeratorInfo.Arguments)
FlowAnalysis\ReadWriteWalker.cs (5)
137protected override void NoteWrite(Symbol variable, BoundExpression value, bool read, bool isRef)
144protected override void CheckAssigned(BoundExpression expr, FieldSymbol fieldSymbol, SyntaxNode node)
179var receiver = expr.ReceiverOpt;
183private void NoteExpressionReadOrWritten(BoundExpression receiver, HashSet<Symbol> readOrWritten)
236protected override void AssignImpl(BoundNode node, BoundExpression value, bool isRef, bool written, bool read)
Generated\BoundNodes.xml.Generated.cs (1055)
278protected BoundEqualsValue(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
290public BoundExpression Value { get; }
295public BoundFieldEqualsValue(SyntaxNode syntax, FieldSymbol field, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
311public BoundFieldEqualsValue Update(FieldSymbol field, ImmutableArray<LocalSymbol> locals, BoundExpression value)
325public BoundPropertyEqualsValue(SyntaxNode syntax, PropertySymbol property, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
341public BoundPropertyEqualsValue Update(PropertySymbol property, ImmutableArray<LocalSymbol> locals, BoundExpression value)
355public BoundParameterEqualsValue(SyntaxNode syntax, ParameterSymbol parameter, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
371public BoundParameterEqualsValue Update(ParameterSymbol parameter, ImmutableArray<LocalSymbol> locals, BoundExpression value)
486public BoundCapturedReceiverPlaceholder(SyntaxNode syntax, BoundExpression receiver, TypeSymbol? type, bool hasErrors = false)
495public BoundExpression Receiver { get; }
500public BoundCapturedReceiverPlaceholder Update(BoundExpression receiver, TypeSymbol? type)
964public BoundPassByCopy(SyntaxNode syntax, BoundExpression expression, TypeSymbol? type, bool hasErrors = false)
973public BoundExpression Expression { get; }
978public BoundPassByCopy Update(BoundExpression expression, TypeSymbol? type)
992public BoundBadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol?> symbols, ImmutableArray<BoundExpression> childBoundNodes, TypeSymbol? type, bool hasErrors = false)
1010public ImmutableArray<BoundExpression> ChildBoundNodes { get; }
1015public BoundBadExpression Update(LookupResultKind resultKind, ImmutableArray<Symbol?> symbols, ImmutableArray<BoundExpression> childBoundNodes, TypeSymbol? type)
1085public BoundTypeExpression(SyntaxNode syntax, AliasSymbol? aliasOpt, BoundTypeExpression? boundContainingTypeOpt, ImmutableArray<BoundExpression> boundDimensionsOpt, TypeWithAnnotations typeWithAnnotations, TypeSymbol type, bool hasErrors = false)
1099public ImmutableArray<BoundExpression> BoundDimensionsOpt { get; }
1106public BoundTypeExpression Update(AliasSymbol? aliasOpt, BoundTypeExpression? boundContainingTypeOpt, ImmutableArray<BoundExpression> boundDimensionsOpt, TypeWithAnnotations typeWithAnnotations, TypeSymbol type)
1210public BoundUnaryOperator(SyntaxNode syntax, UnaryOperatorKind operatorKind, BoundExpression operand, ConstantValue? constantValueOpt, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type, bool hasErrors = false)
1228public BoundExpression Operand { get; }
1238public BoundUnaryOperator Update(UnaryOperatorKind operatorKind, BoundExpression operand, ConstantValue? constantValueOpt, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type)
1252public BoundIncrementOperator(SyntaxNode syntax, UnaryOperatorKind operatorKind, BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, BoundValuePlaceholder? resultPlaceholder, BoundExpression? resultConversion, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type, bool hasErrors = false)
1273public BoundExpression Operand { get; }
1277public BoundExpression? OperandConversion { get; }
1279public BoundExpression? ResultConversion { get; }
1286public BoundIncrementOperator Update(UnaryOperatorKind operatorKind, BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, BoundValuePlaceholder? resultPlaceholder, BoundExpression? resultConversion, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type)
1300public BoundAddressOfOperator(SyntaxNode syntax, BoundExpression operand, bool isManaged, TypeSymbol type, bool hasErrors = false)
1312public BoundExpression Operand { get; }
1318public BoundAddressOfOperator Update(BoundExpression operand, bool isManaged, TypeSymbol type)
1404public BoundPointerIndirectionOperator(SyntaxNode syntax, BoundExpression operand, bool refersToLocation, TypeSymbol type, bool hasErrors = false)
1416public BoundExpression Operand { get; }
1422public BoundPointerIndirectionOperator Update(BoundExpression operand, bool refersToLocation, TypeSymbol type)
1436public BoundPointerElementAccess(SyntaxNode syntax, BoundExpression expression, BoundExpression index, bool @checked, bool refersToLocation, TypeSymbol type, bool hasErrors = false)
1451public BoundExpression Expression { get; }
1452public BoundExpression Index { get; }
1459public BoundPointerElementAccess Update(BoundExpression expression, BoundExpression index, bool @checked, bool refersToLocation, TypeSymbol type)
1473public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1488public BoundExpression InvokedExpression { get; }
1489public ImmutableArray<BoundExpression> Arguments { get; }
1496public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
1510public BoundRefTypeOperator(SyntaxNode syntax, BoundExpression operand, MethodSymbol? getTypeFromHandle, TypeSymbol type, bool hasErrors = false)
1522public BoundExpression Operand { get; }
1528public BoundRefTypeOperator Update(BoundExpression operand, MethodSymbol? getTypeFromHandle, TypeSymbol type)
1542public BoundMakeRefOperator(SyntaxNode syntax, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
1553public BoundExpression Operand { get; }
1558public BoundMakeRefOperator Update(BoundExpression operand, TypeSymbol type)
1572public BoundRefValueOperator(SyntaxNode syntax, NullableAnnotation nullableAnnotation, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
1585public BoundExpression Operand { get; }
1590public BoundRefValueOperator Update(NullableAnnotation nullableAnnotation, BoundExpression operand, TypeSymbol type)
1604public BoundFromEndIndexExpression(SyntaxNode syntax, BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol type, bool hasErrors = false)
1616public BoundExpression Operand { get; }
1622public BoundFromEndIndexExpression Update(BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol type)
1636public BoundRangeExpression(SyntaxNode syntax, BoundExpression? leftOperandOpt, BoundExpression? rightOperandOpt, MethodSymbol? methodOpt, TypeSymbol type, bool hasErrors = false)
1648public BoundExpression? LeftOperandOpt { get; }
1649public BoundExpression? RightOperandOpt { get; }
1655public BoundRangeExpression Update(BoundExpression? leftOperandOpt, BoundExpression? rightOperandOpt, MethodSymbol? methodOpt, TypeSymbol type)
1669protected BoundBinaryOperatorBase(BoundKind kind, SyntaxNode syntax, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1682public BoundExpression Left { get; }
1683public BoundExpression Right { get; }
1688public BoundBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1712public BoundBinaryOperator Update(BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type)
1726public BoundTupleBinaryOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type, bool hasErrors = false)
1742public BoundExpression Left { get; }
1743public BoundExpression Right { get; }
1750public BoundTupleBinaryOperator Update(BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type)
1764public BoundUserDefinedConditionalLogicalOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, MethodSymbol logicalOperator, MethodSymbol trueOperator, MethodSymbol falseOperator, BoundValuePlaceholder? trueFalseOperandPlaceholder, BoundExpression? trueFalseOperandConversion, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1795public BoundExpression? TrueFalseOperandConversion { get; }
1803public BoundUserDefinedConditionalLogicalOperator Update(BinaryOperatorKind operatorKind, MethodSymbol logicalOperator, MethodSymbol trueOperator, MethodSymbol falseOperator, BoundValuePlaceholder? trueFalseOperandPlaceholder, BoundExpression? trueFalseOperandConversion, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, BoundExpression left, BoundExpression right, TypeSymbol type)
1817public BoundCompoundAssignmentOperator(SyntaxNode syntax, BinaryOperatorSignature @operator, BoundExpression left, BoundExpression right, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundValuePlaceholder? finalPlaceholder, BoundExpression? finalConversion, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type, bool hasErrors = false)
1838public BoundExpression Left { get; }
1839public BoundExpression Right { get; }
1841public BoundExpression? LeftConversion { get; }
1843public BoundExpression? FinalConversion { get; }
1850public BoundCompoundAssignmentOperator Update(BinaryOperatorSignature @operator, BoundExpression left, BoundExpression right, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundValuePlaceholder? finalPlaceholder, BoundExpression? finalConversion, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type)
1864public BoundAssignmentOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right, bool isRef, TypeSymbol type, bool hasErrors = false)
1877public BoundExpression Left { get; }
1878public BoundExpression Right { get; }
1884public BoundAssignmentOperator Update(BoundExpression left, BoundExpression right, bool isRef, TypeSymbol type)
1933public BoundNullCoalescingOperator(SyntaxNode syntax, BoundExpression leftOperand, BoundExpression rightOperand, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundNullCoalescingOperatorResultKind operatorResultKind, bool @checked, TypeSymbol type, bool hasErrors = false)
1950public BoundExpression LeftOperand { get; }
1951public BoundExpression RightOperand { get; }
1953public BoundExpression? LeftConversion { get; }
1960public BoundNullCoalescingOperator Update(BoundExpression leftOperand, BoundExpression rightOperand, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundNullCoalescingOperatorResultKind operatorResultKind, bool @checked, TypeSymbol type)
1974public BoundNullCoalescingAssignmentOperator(SyntaxNode syntax, BoundExpression leftOperand, BoundExpression rightOperand, TypeSymbol? type, bool hasErrors = false)
1985public BoundExpression LeftOperand { get; }
1986public BoundExpression RightOperand { get; }
1991public BoundNullCoalescingAssignmentOperator Update(BoundExpression leftOperand, BoundExpression rightOperand, TypeSymbol? type)
2005public BoundUnconvertedConditionalOperator(SyntaxNode syntax, BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, ErrorCode noCommonTypeError, bool hasErrors = false)
2021public BoundExpression Condition { get; }
2022public BoundExpression Consequence { get; }
2023public BoundExpression Alternative { get; }
2030public BoundUnconvertedConditionalOperator Update(BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, ErrorCode noCommonTypeError)
2044public BoundConditionalOperator(SyntaxNode syntax, bool isRef, BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
2064public BoundExpression Condition { get; }
2065public BoundExpression Consequence { get; }
2066public BoundExpression Alternative { get; }
2074public BoundConditionalOperator Update(bool isRef, BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, TypeSymbol type)
2088public BoundArrayAccess(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundExpression> indices, TypeSymbol type, bool hasErrors = false)
2101public BoundExpression Expression { get; }
2102public ImmutableArray<BoundExpression> Indices { get; }
2107public BoundArrayAccess Update(BoundExpression expression, ImmutableArray<BoundExpression> indices, TypeSymbol type)
2150public BoundArrayLength(SyntaxNode syntax, BoundExpression expression, TypeSymbol type, bool hasErrors = false)
2161public BoundExpression Expression { get; }
2166public BoundArrayLength Update(BoundExpression expression, TypeSymbol type)
2180public BoundAwaitableInfo(SyntaxNode syntax, BoundAwaitableValuePlaceholder? awaitableInstancePlaceholder, bool isDynamic, BoundExpression? getAwaiter, PropertySymbol? isCompleted, MethodSymbol? getResult, BoundCall? runtimeAsyncAwaitCall, BoundAwaitableValuePlaceholder? runtimeAsyncAwaitCallPlaceholder, bool hasErrors = false)
2198public BoundExpression? GetAwaiter { get; }
2207public BoundAwaitableInfo Update(BoundAwaitableValuePlaceholder? awaitableInstancePlaceholder, bool isDynamic, BoundExpression? getAwaiter, PropertySymbol? isCompleted, MethodSymbol? getResult, BoundCall? runtimeAsyncAwaitCall, BoundAwaitableValuePlaceholder? runtimeAsyncAwaitCallPlaceholder)
2221public BoundAwaitExpression(SyntaxNode syntax, BoundExpression expression, BoundAwaitableInfo awaitableInfo, BoundAwaitExpressionDebugInfo debugInfo, TypeSymbol type, bool hasErrors = false)
2235public BoundExpression Expression { get; }
2242public BoundAwaitExpression Update(BoundExpression expression, BoundAwaitableInfo awaitableInfo, BoundAwaitExpressionDebugInfo debugInfo, TypeSymbol type)
2899public BoundIsOperator(SyntaxNode syntax, BoundExpression operand, BoundTypeExpression targetType, ConversionKind conversionKind, TypeSymbol type, bool hasErrors = false)
2913public BoundExpression Operand { get; }
2920public BoundIsOperator Update(BoundExpression operand, BoundTypeExpression targetType, ConversionKind conversionKind, TypeSymbol type)
2934public BoundAsOperator(SyntaxNode syntax, BoundExpression operand, BoundTypeExpression targetType, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, TypeSymbol type, bool hasErrors = false)
2949public BoundExpression Operand { get; }
2952public BoundExpression? OperandConversion { get; }
2957public BoundAsOperator Update(BoundExpression operand, BoundTypeExpression targetType, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, TypeSymbol type)
3003public BoundConversion(SyntaxNode syntax, BoundExpression operand, Conversion conversion, bool isBaseConversion, bool @checked, bool explicitCastInCode, ConstantValue? constantValueOpt, ConversionGroup? conversionGroupOpt, InConversionGroupFlags inConversionGroupFlags, TypeSymbol type, bool hasErrors = false)
3025public BoundExpression Operand { get; }
3037public BoundConversion Update(BoundExpression operand, Conversion conversion, bool isBaseConversion, bool @checked, bool explicitCastInCode, ConstantValue? constantValueOpt, ConversionGroup? conversionGroupOpt, InConversionGroupFlags inConversionGroupFlags, TypeSymbol type)
3051public BoundReadOnlySpanFromArray(SyntaxNode syntax, BoundExpression operand, MethodSymbol conversionMethod, TypeSymbol type, bool hasErrors = false)
3064public BoundExpression Operand { get; }
3070public BoundReadOnlySpanFromArray Update(BoundExpression operand, MethodSymbol conversionMethod, TypeSymbol type)
3119public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3130public ImmutableArray<BoundExpression> Arguments { get; }
3136public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3150public BoundFixedLocalCollectionInitializer(SyntaxNode syntax, TypeSymbol elementPointerType, BoundValuePlaceholder? elementPointerPlaceholder, BoundExpression? elementPointerConversion, BoundExpression expression, MethodSymbol? getPinnableOpt, TypeSymbol type, bool hasErrors = false)
3168public BoundExpression? ElementPointerConversion { get; }
3169public BoundExpression Expression { get; }
3175public BoundFixedLocalCollectionInitializer Update(TypeSymbol elementPointerType, BoundValuePlaceholder? elementPointerPlaceholder, BoundExpression? elementPointerConversion, BoundExpression expression, MethodSymbol? getPinnableOpt, TypeSymbol type)
3456public BoundLocalDeclaration(SyntaxNode syntax, LocalSymbol localSymbol, BoundTypeExpression? declaredTypeOpt, BoundExpression? initializerOpt, ImmutableArray<BoundExpression> argumentsOpt, bool inferredType, bool hasErrors = false)
3471public BoundExpression? InitializerOpt { get; }
3472public ImmutableArray<BoundExpression> ArgumentsOpt { get; }
3478public BoundLocalDeclaration Update(LocalSymbol localSymbol, BoundTypeExpression? declaredTypeOpt, BoundExpression? initializerOpt, ImmutableArray<BoundExpression> argumentsOpt, bool inferredType)
3625public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3638public BoundExpression? ExpressionOpt { get; }
3644public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
3658public BoundYieldReturnStatement(SyntaxNode syntax, BoundExpression expression, bool hasErrors = false)
3667public BoundExpression Expression { get; }
3672public BoundYieldReturnStatement Update(BoundExpression expression)
3703public BoundThrowStatement(SyntaxNode syntax, BoundExpression? expressionOpt, bool hasErrors = false)
3709public BoundExpression? ExpressionOpt { get; }
3714public BoundThrowStatement Update(BoundExpression? expressionOpt)
3728public BoundExpressionStatement(SyntaxNode syntax, BoundExpression expression, bool hasErrors = false)
3737public BoundExpression Expression { get; }
3742public BoundExpressionStatement Update(BoundExpression expression)
3830public BoundSwitchStatement(SyntaxNode syntax, BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel, bool hasErrors = false)
3850public BoundExpression Expression { get; }
3861public BoundSwitchStatement Update(BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel)
3875public BoundSwitchDispatch(SyntaxNode syntax, BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt, bool hasErrors = false)
3889public BoundExpression Expression { get; }
3897public BoundSwitchDispatch Update(BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt)
3911public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, BoundStatement consequence, BoundStatement? alternativeOpt, bool hasErrors = false)
3923public BoundExpression Condition { get; }
3930public BoundIfStatement Update(BoundExpression condition, BoundStatement consequence, BoundStatement? alternativeOpt)
3972protected BoundConditionalLoopStatement(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3988public BoundExpression Condition { get; }
3994public BoundDoStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4010public BoundDoStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4024public BoundWhileStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4040public BoundWhileStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4054public BoundForStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4075public BoundExpression? Condition { get; }
4082public BoundForStatement Update(ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4096public BoundForEachStatement(SyntaxNode syntax, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4120public BoundExpression? ElementConversion { get; }
4123public BoundExpression? IterationErrorExpressionOpt { get; }
4124public BoundExpression Expression { get; }
4131public BoundForEachStatement Update(ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4176public BoundUsingStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations? declarationsOpt, BoundExpression? expressionOpt, BoundStatement body, BoundAwaitableInfo? awaitOpt, MethodArgumentInfo? patternDisposeInfoOpt, bool hasErrors = false)
4193public BoundExpression? ExpressionOpt { get; }
4201public BoundUsingStatement Update(ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations? declarationsOpt, BoundExpression? expressionOpt, BoundStatement body, BoundAwaitableInfo? awaitOpt, MethodArgumentInfo? patternDisposeInfoOpt)
4249public BoundLockStatement(SyntaxNode syntax, BoundExpression argument, BoundStatement body, bool hasErrors = false)
4260public BoundExpression Argument { get; }
4266public BoundLockStatement Update(BoundExpression argument, BoundStatement body)
4317public BoundCatchBlock(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression? exceptionSourceOpt, TypeSymbol? exceptionTypeOpt, BoundStatementList? exceptionFilterPrologueOpt, BoundExpression? exceptionFilterOpt, BoundBlock body, bool isSynthesizedAsyncCatchAll, bool hasErrors = false)
4334public BoundExpression? ExceptionSourceOpt { get; }
4337public BoundExpression? ExceptionFilterOpt { get; }
4344public BoundCatchBlock Update(ImmutableArray<LocalSymbol> locals, BoundExpression? exceptionSourceOpt, TypeSymbol? exceptionTypeOpt, BoundStatementList? exceptionFilterPrologueOpt, BoundExpression? exceptionFilterOpt, BoundBlock body, bool isSynthesizedAsyncCatchAll)
4657public BoundRangeVariable(SyntaxNode syntax, RangeVariableSymbol rangeVariableSymbol, BoundExpression value, TypeSymbol type, bool hasErrors = false)
4671public BoundExpression Value { get; }
4676public BoundRangeVariable Update(RangeVariableSymbol rangeVariableSymbol, BoundExpression value, TypeSymbol type)
4767public BoundGotoStatement(SyntaxNode syntax, LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt, bool hasErrors = false)
4779public BoundExpression? CaseExpressionOpt { get; }
4785public BoundGotoStatement Update(LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt)
4904public BoundConditionalGoto(SyntaxNode syntax, BoundExpression condition, bool jumpIfTrue, LabelSymbol label, bool hasErrors = false)
4916public BoundExpression Condition { get; }
4923public BoundConditionalGoto Update(BoundExpression condition, bool jumpIfTrue, LabelSymbol label)
4937protected BoundSwitchExpression(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4952public BoundExpression Expression { get; }
4961public BoundSwitchExpressionArm(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause, BoundExpression value, LabelSymbol label, bool hasErrors = false)
4981public BoundExpression? WhenClause { get; }
4982public BoundExpression Value { get; }
4988public BoundSwitchExpressionArm Update(ImmutableArray<LocalSymbol> locals, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause, BoundExpression value, LabelSymbol label)
5002public BoundUnconvertedSwitchExpression(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
5016public BoundUnconvertedSwitchExpression Update(BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type)
5030public BoundConvertedSwitchExpression(SyntaxNode syntax, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type, bool hasErrors = false)
5050public BoundConvertedSwitchExpression Update(TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type)
5173public BoundWhenDecisionDagNode(SyntaxNode syntax, ImmutableArray<BoundPatternBinding> bindings, BoundExpression? whenExpression, BoundDecisionDagNode whenTrue, BoundDecisionDagNode? whenFalse, bool hasErrors = false)
5187public BoundExpression? WhenExpression { get; }
5194public BoundWhenDecisionDagNode Update(ImmutableArray<BoundPatternBinding> bindings, BoundExpression? whenExpression, BoundDecisionDagNode whenTrue, BoundDecisionDagNode? whenFalse)
5595public BoundDagIndexerEvaluation(SyntaxNode syntax, TypeSymbol indexerType, BoundDagTemp lengthTemp, int index, BoundExpression indexerAccess, BoundListPatternReceiverPlaceholder receiverPlaceholder, BoundListPatternIndexPlaceholder argumentPlaceholder, BoundDagTemp input, bool hasErrors = false)
5621public BoundExpression IndexerAccess { get; }
5628public BoundDagIndexerEvaluation Update(TypeSymbol indexerType, BoundDagTemp lengthTemp, int index, BoundExpression indexerAccess, BoundListPatternReceiverPlaceholder receiverPlaceholder, BoundListPatternIndexPlaceholder argumentPlaceholder, BoundDagTemp input)
5642public BoundDagSliceEvaluation(SyntaxNode syntax, TypeSymbol sliceType, BoundDagTemp lengthTemp, int startIndex, int endIndex, BoundExpression indexerAccess, BoundSlicePatternReceiverPlaceholder receiverPlaceholder, BoundSlicePatternRangePlaceholder argumentPlaceholder, BoundDagTemp input, bool hasErrors = false)
5670public BoundExpression IndexerAccess { get; }
5677public BoundDagSliceEvaluation Update(TypeSymbol sliceType, BoundDagTemp lengthTemp, int startIndex, int endIndex, BoundExpression indexerAccess, BoundSlicePatternReceiverPlaceholder receiverPlaceholder, BoundSlicePatternRangePlaceholder argumentPlaceholder, BoundDagTemp input)
5778public BoundSwitchLabel(SyntaxNode syntax, LabelSymbol label, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause, bool hasErrors = false)
5794public BoundExpression? WhenClause { get; }
5799public BoundSwitchLabel Update(LabelSymbol label, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause)
5813protected BoundMethodOrPropertyGroup(BoundKind kind, SyntaxNode syntax, BoundExpression? receiverOpt, LookupResultKind resultKind, bool hasErrors = false)
5821public BoundExpression? ReceiverOpt { get; }
5827public BoundSequencePointExpression(SyntaxNode syntax, BoundExpression expression, TypeSymbol? type, bool hasErrors = false)
5836public BoundExpression Expression { get; }
5841public BoundSequencePointExpression Update(BoundExpression expression, TypeSymbol? type)
5855public BoundSequence(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression value, TypeSymbol type, bool hasErrors = false)
5871public ImmutableArray<BoundExpression> SideEffects { get; }
5872public BoundExpression Value { get; }
5877public BoundSequence Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression value, TypeSymbol type)
5891public BoundSpillSequence(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression value, TypeSymbol type, bool hasErrors = false)
5908public BoundExpression Value { get; }
5913public BoundSpillSequence Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression value, TypeSymbol type)
5927public BoundDynamicMemberAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, bool invoked, bool indexed, TypeSymbol type, bool hasErrors = false)
5943public BoundExpression Receiver { get; }
5952public BoundDynamicMemberAccess Update(BoundExpression receiver, ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, bool invoked, bool indexed, TypeSymbol type)
5966protected BoundDynamicInvocableBase(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol? type, bool hasErrors = false)
5977public BoundExpression Expression { get; }
5978public ImmutableArray<BoundExpression> Arguments { get; }
5983public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
6005public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6019public BoundConditionalAccess(SyntaxNode syntax, BoundExpression receiver, BoundExpression accessExpression, TypeSymbol type, bool hasErrors = false)
6032public BoundExpression Receiver { get; }
6033public BoundExpression AccessExpression { get; }
6038public BoundConditionalAccess Update(BoundExpression receiver, BoundExpression accessExpression, TypeSymbol type)
6052public BoundLoweredConditionalAccess(SyntaxNode syntax, BoundExpression receiver, MethodSymbol? hasValueMethodOpt, BoundExpression whenNotNull, BoundExpression? whenNullOpt, int id, bool forceCopyOfNullableValueType, TypeSymbol type, bool hasErrors = false)
6069public BoundExpression Receiver { get; }
6071public BoundExpression WhenNotNull { get; }
6072public BoundExpression? WhenNullOpt { get; }
6079public BoundLoweredConditionalAccess Update(BoundExpression receiver, MethodSymbol? hasValueMethodOpt, BoundExpression whenNotNull, BoundExpression? whenNullOpt, int id, bool forceCopyOfNullableValueType, TypeSymbol type)
6131public BoundComplexConditionalReceiver(SyntaxNode syntax, BoundExpression valueTypeReceiver, BoundExpression referenceTypeReceiver, TypeSymbol type, bool hasErrors = false)
6144public BoundExpression ValueTypeReceiver { get; }
6145public BoundExpression ReferenceTypeReceiver { get; }
6150public BoundComplexConditionalReceiver Update(BoundExpression valueTypeReceiver, BoundExpression referenceTypeReceiver, TypeSymbol type)
6164public BoundMethodGroup(SyntaxNode syntax, ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, ImmutableArray<MethodSymbol> methods, Symbol? lookupSymbolOpt, DiagnosticInfo? lookupError, BoundMethodGroupFlags? flags, FunctionTypeSymbol? functionType, BoundExpression? receiverOpt, LookupResultKind resultKind, bool hasErrors = false)
6191public BoundMethodGroup Update(ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, ImmutableArray<MethodSymbol> methods, Symbol? lookupSymbolOpt, DiagnosticInfo? lookupError, BoundMethodGroupFlags? flags, FunctionTypeSymbol? functionType, BoundExpression? receiverOpt, LookupResultKind resultKind)
6205public BoundPropertyGroup(SyntaxNode syntax, ImmutableArray<PropertySymbol> properties, BoundExpression? receiverOpt, LookupResultKind resultKind, bool hasErrors = false)
6219public BoundPropertyGroup Update(ImmutableArray<PropertySymbol> properties, BoundExpression? receiverOpt, LookupResultKind resultKind)
6233public BoundCall(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool isDelegateCall, bool expanded, bool invokedAsExtensionMethod, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalMethodsOpt, TypeSymbol type, bool hasErrors = false)
6261public BoundExpression? ReceiverOpt { get; }
6264public ImmutableArray<BoundExpression> Arguments { get; }
6278public BoundCall Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool isDelegateCall, bool expanded, bool invokedAsExtensionMethod, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalMethodsOpt, TypeSymbol type)
6292public BoundEventAssignmentOperator(SyntaxNode syntax, EventSymbol @event, bool isAddition, bool isDynamic, BoundExpression? receiverOpt, BoundExpression argument, TypeSymbol type, bool hasErrors = false)
6311public BoundExpression? ReceiverOpt { get; }
6312public BoundExpression Argument { get; }
6317public BoundEventAssignmentOperator Update(EventSymbol @event, bool isAddition, bool isDynamic, BoundExpression? receiverOpt, BoundExpression argument, TypeSymbol type)
6331public BoundAttribute(SyntaxNode syntax, MethodSymbol? constructor, ImmutableArray<BoundExpression> constructorArguments, ImmutableArray<string?> constructorArgumentNamesOpt, ImmutableArray<int> constructorArgumentsToParamsOpt, bool constructorExpanded, BitVector constructorDefaultArguments, ImmutableArray<BoundAssignmentOperator> namedArguments, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
6351public ImmutableArray<BoundExpression> ConstructorArguments { get; }
6362public BoundAttribute Update(MethodSymbol? constructor, ImmutableArray<BoundExpression> constructorArguments, ImmutableArray<string?> constructorArgumentNamesOpt, ImmutableArray<int> constructorArgumentsToParamsOpt, bool constructorExpanded, BitVector constructorDefaultArguments, ImmutableArray<BoundAssignmentOperator> namedArguments, LookupResultKind resultKind, TypeSymbol type)
6376public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6391public ImmutableArray<BoundExpression> Arguments { get; }
6400public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6435public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
6459public override ImmutableArray<BoundExpression> Arguments { get; }
6472public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, bool wasTargetTyped, TypeSymbol type)
6533public BoundUnconvertedWithElement(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool hasErrors = false)
6544public ImmutableArray<BoundExpression> Arguments { get; }
6551public BoundUnconvertedWithElement Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt)
6565public BoundCollectionExpression(SyntaxNode syntax, CollectionExpressionTypeKind collectionTypeKind, BoundObjectOrCollectionValuePlaceholder? placeholder, BoundExpression? collectionCreation, MethodSymbol? collectionBuilderMethod, BoundCollectionBuilderElementsPlaceholder? collectionBuilderElementsPlaceholder, bool wasTargetTyped, bool hasWithElement, BoundUnconvertedCollectionExpression unconvertedCollectionExpression, ImmutableArray<BoundNode> elements, TypeSymbol type, bool hasErrors = false)
6590public BoundExpression? CollectionCreation { get; }
6600public BoundCollectionExpression Update(CollectionExpressionTypeKind collectionTypeKind, BoundObjectOrCollectionValuePlaceholder? placeholder, BoundExpression? collectionCreation, MethodSymbol? collectionBuilderMethod, BoundCollectionBuilderElementsPlaceholder? collectionBuilderElementsPlaceholder, bool wasTargetTyped, bool hasWithElement, BoundUnconvertedCollectionExpression unconvertedCollectionExpression, ImmutableArray<BoundNode> elements, TypeSymbol type)
6642public BoundCollectionExpressionSpreadElement(SyntaxNode syntax, BoundExpression expression, BoundCollectionExpressionSpreadExpressionPlaceholder? expressionPlaceholder, BoundExpression? conversion, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundExpression? lengthOrCount, BoundValuePlaceholder? elementPlaceholder, BoundStatement? iteratorBody, bool hasErrors = false)
6657public BoundExpression Expression { get; }
6659public BoundExpression? Conversion { get; }
6661public BoundExpression? LengthOrCount { get; }
6668public BoundCollectionExpressionSpreadElement Update(BoundExpression expression, BoundCollectionExpressionSpreadExpressionPlaceholder? expressionPlaceholder, BoundExpression? conversion, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundExpression? lengthOrCount, BoundValuePlaceholder? elementPlaceholder, BoundStatement? iteratorBody)
6682protected BoundTupleExpression(BoundKind kind, SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type, bool hasErrors = false)
6693public ImmutableArray<BoundExpression> Arguments { get; }
6700public BoundTupleLiteral(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type, bool hasErrors = false)
6713public BoundTupleLiteral Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type)
6727public BoundConvertedTupleLiteral(SyntaxNode syntax, BoundTupleLiteral? sourceTuple, bool wasTargetTyped, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type, bool hasErrors = false)
6743public BoundConvertedTupleLiteral Update(BoundTupleLiteral? sourceTuple, bool wasTargetTyped, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type)
6757public BoundDynamicObjectCreationExpression(SyntaxNode syntax, string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
6776public override ImmutableArray<BoundExpression> Arguments { get; }
6786public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6832protected BoundObjectInitializerExpressionBase(BoundKind kind, SyntaxNode syntax, BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type, bool hasErrors = false)
6846public ImmutableArray<BoundExpression> Initializers { get; }
6851public BoundObjectInitializerExpression(SyntaxNode syntax, BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type, bool hasErrors = false)
6865public BoundObjectInitializerExpression Update(BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type)
6879public BoundObjectInitializerMember(SyntaxNode syntax, Symbol? memberSymbol, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, AccessorKind accessorKind, TypeSymbol receiverType, TypeSymbol type, bool hasErrors = false)
6901public ImmutableArray<BoundExpression> Arguments { get; }
6914public BoundObjectInitializerMember Update(Symbol? memberSymbol, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, AccessorKind accessorKind, TypeSymbol receiverType, TypeSymbol type)
6973public BoundCollectionInitializerExpression(SyntaxNode syntax, BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type, bool hasErrors = false)
6987public BoundCollectionInitializerExpression Update(BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type)
7001public BoundCollectionElementInitializer(SyntaxNode syntax, MethodSymbol addMethod, ImmutableArray<BoundExpression> arguments, BoundExpression? implicitReceiverOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, bool invokedAsExtensionMethod, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
7021public ImmutableArray<BoundExpression> Arguments { get; }
7022public BoundExpression? ImplicitReceiverOpt { get; }
7032public BoundCollectionElementInitializer Update(MethodSymbol addMethod, ImmutableArray<BoundExpression> arguments, BoundExpression? implicitReceiverOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, bool invokedAsExtensionMethod, LookupResultKind resultKind, TypeSymbol type)
7046public BoundDynamicCollectionElementInitializer(SyntaxNode syntax, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
7064public BoundDynamicCollectionElementInitializer Update(ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
7113public BoundAnonymousObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<BoundAnonymousPropertyDeclaration> declarations, TypeSymbol type, bool hasErrors = false)
7129public ImmutableArray<BoundExpression> Arguments { get; }
7135public BoundAnonymousObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<BoundAnonymousPropertyDeclaration> declarations, TypeSymbol type)
7219public BoundDelegateCreationExpression(SyntaxNode syntax, BoundExpression argument, MethodSymbol? methodOpt, bool isExtensionMethod, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
7233public BoundExpression Argument { get; }
7241public BoundDelegateCreationExpression Update(BoundExpression argument, MethodSymbol? methodOpt, bool isExtensionMethod, bool wasTargetTyped, TypeSymbol type)
7255public BoundArrayCreation(SyntaxNode syntax, ImmutableArray<BoundExpression> bounds, BoundArrayInitialization? initializerOpt, TypeSymbol type, bool hasErrors = false)
7267public ImmutableArray<BoundExpression> Bounds { get; }
7273public BoundArrayCreation Update(ImmutableArray<BoundExpression> bounds, BoundArrayInitialization? initializerOpt, TypeSymbol type)
7287public BoundArrayInitialization(SyntaxNode syntax, bool isInferred, ImmutableArray<BoundExpression> initializers, bool hasErrors = false)
7299public ImmutableArray<BoundExpression> Initializers { get; }
7304public BoundArrayInitialization Update(bool isInferred, ImmutableArray<BoundExpression> initializers)
7318protected BoundStackAllocArrayCreationBase(BoundKind kind, SyntaxNode syntax, TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol? type, bool hasErrors = false)
7331public BoundExpression Count { get; }
7337public BoundStackAllocArrayCreation(SyntaxNode syntax, TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol? type, bool hasErrors = false)
7350public BoundStackAllocArrayCreation Update(TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol? type)
7364public BoundConvertedStackAllocExpression(SyntaxNode syntax, TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol type, bool hasErrors = false)
7379public BoundConvertedStackAllocExpression Update(TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol type)
7393public BoundFieldAccess(SyntaxNode syntax, BoundExpression? receiverOpt, FieldSymbol fieldSymbol, ConstantValue? constantValueOpt, LookupResultKind resultKind, bool isByValue, bool isDeclaration, TypeSymbol type, bool hasErrors = false)
7409public BoundExpression? ReceiverOpt { get; }
7419public BoundFieldAccess Update(BoundExpression? receiverOpt, FieldSymbol fieldSymbol, ConstantValue? constantValueOpt, LookupResultKind resultKind, bool isByValue, bool isDeclaration, TypeSymbol type)
7473public BoundPropertyAccess(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol propertySymbol, AccessorKind autoPropertyAccessorKind, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
7488public BoundExpression? ReceiverOpt { get; }
7497public BoundPropertyAccess Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol propertySymbol, AccessorKind autoPropertyAccessorKind, LookupResultKind resultKind, TypeSymbol type)
7511public BoundEventAccess(SyntaxNode syntax, BoundExpression? receiverOpt, EventSymbol eventSymbol, bool isUsableAsField, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
7525public BoundExpression? ReceiverOpt { get; }
7533public BoundEventAccess Update(BoundExpression? receiverOpt, EventSymbol eventSymbol, bool isUsableAsField, LookupResultKind resultKind, TypeSymbol type)
7547public BoundIndexerAccess(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol indexer, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, AccessorKind accessorKind, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ImmutableArray<PropertySymbol> originalIndexersOpt, TypeSymbol type, bool hasErrors = false)
7569public BoundExpression? ReceiverOpt { get; }
7572public ImmutableArray<BoundExpression> Arguments { get; }
7584public BoundIndexerAccess Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol indexer, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, AccessorKind accessorKind, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ImmutableArray<PropertySymbol> originalIndexersOpt, TypeSymbol type)
7598public BoundImplicitIndexerAccess(SyntaxNode syntax, BoundExpression receiver, BoundExpression argument, BoundExpression lengthOrCountAccess, BoundImplicitIndexerReceiverPlaceholder receiverPlaceholder, BoundExpression indexerOrSliceAccess, ImmutableArray<BoundImplicitIndexerValuePlaceholder> argumentPlaceholders, TypeSymbol type, bool hasErrors = false)
7623public BoundExpression Receiver { get; }
7624public BoundExpression Argument { get; }
7625public BoundExpression LengthOrCountAccess { get; }
7627public BoundExpression IndexerOrSliceAccess { get; }
7633public BoundImplicitIndexerAccess Update(BoundExpression receiver, BoundExpression argument, BoundExpression lengthOrCountAccess, BoundImplicitIndexerReceiverPlaceholder receiverPlaceholder, BoundExpression indexerOrSliceAccess, ImmutableArray<BoundImplicitIndexerValuePlaceholder> argumentPlaceholders, TypeSymbol type)
7647public BoundInlineArrayAccess(SyntaxNode syntax, BoundExpression expression, BoundExpression argument, bool isValue, WellKnownMember getItemOrSliceHelper, TypeSymbol type, bool hasErrors = false)
7666public BoundExpression Expression { get; }
7667public BoundExpression Argument { get; }
7674public BoundInlineArrayAccess Update(BoundExpression expression, BoundExpression argument, bool isValue, WellKnownMember getItemOrSliceHelper, TypeSymbol type)
7688public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7705public BoundExpression Receiver { get; }
7706public ImmutableArray<BoundExpression> Arguments { get; }
7714public BoundDynamicIndexerAccess Update(BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type)
7812public BoundQueryClause(SyntaxNode syntax, BoundExpression value, RangeVariableSymbol? definedSymbol, BoundExpression? operation, BoundExpression? cast, Binder binder, BoundExpression? unoptimizedForm, TypeSymbol type, bool hasErrors = false)
7829public BoundExpression Value { get; }
7831public BoundExpression? Operation { get; }
7832public BoundExpression? Cast { get; }
7834public BoundExpression? UnoptimizedForm { get; }
7839public BoundQueryClause Update(BoundExpression value, RangeVariableSymbol? definedSymbol, BoundExpression? operation, BoundExpression? cast, Binder binder, BoundExpression? unoptimizedForm, TypeSymbol type)
7879public BoundNameOfOperator(SyntaxNode syntax, BoundExpression argument, ConstantValue constantValueOpt, TypeSymbol type, bool hasErrors = false)
7896public BoundExpression Argument { get; }
7902public BoundNameOfOperator Update(BoundExpression argument, ConstantValue constantValueOpt, TypeSymbol type)
7916protected BoundInterpolatedStringBase(BoundKind kind, SyntaxNode syntax, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type, bool hasErrors = false)
7926public ImmutableArray<BoundExpression> Parts { get; }
7932public BoundUnconvertedInterpolatedString(SyntaxNode syntax, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type, bool hasErrors = false)
7944public BoundUnconvertedInterpolatedString Update(ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type)
7958public BoundInterpolatedString(SyntaxNode syntax, InterpolatedStringHandlerData? interpolationData, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type, bool hasErrors = false)
7972public BoundInterpolatedString Update(InterpolatedStringHandlerData? interpolationData, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type)
8052public BoundStringInsert(SyntaxNode syntax, BoundExpression value, BoundExpression? alignment, BoundLiteral? format, bool isInterpolatedStringHandlerAppendCall, bool hasErrors = false)
8065public BoundExpression Value { get; }
8066public BoundExpression? Alignment { get; }
8073public BoundStringInsert Update(BoundExpression value, BoundExpression? alignment, BoundLiteral? format, bool isInterpolatedStringHandlerAppendCall)
8087public BoundIsPatternExpression(SyntaxNode syntax, BoundExpression expression, BoundPattern pattern, bool hasUnionMatching, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type, bool hasErrors = false)
8106public BoundExpression Expression { get; }
8117public BoundIsPatternExpression Update(BoundExpression expression, BoundPattern pattern, bool hasUnionMatching, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type)
8163public BoundConstantPattern(SyntaxNode syntax, BoundExpression value, ConstantValue constantValue, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8181public BoundExpression Value { get; }
8188public BoundConstantPattern Update(BoundExpression value, ConstantValue constantValue, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType)
8284protected BoundObjectPattern(BoundKind kind, SyntaxNode syntax, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8297public BoundExpression? VariableAccess { get; }
8303public BoundDeclarationPattern(SyntaxNode syntax, BoundTypeExpression declaredType, bool isVar, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8325public BoundDeclarationPattern Update(BoundTypeExpression declaredType, bool isVar, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType)
8339public BoundRecursivePattern(SyntaxNode syntax, BoundTypeExpression? declaredType, MethodSymbol? deconstructMethod, ImmutableArray<BoundPositionalSubpattern> deconstruction, ImmutableArray<BoundPropertySubpattern> properties, bool isExplicitNotNullTest, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8366public BoundRecursivePattern Update(BoundTypeExpression? declaredType, MethodSymbol? deconstructMethod, ImmutableArray<BoundPositionalSubpattern> deconstruction, ImmutableArray<BoundPropertySubpattern> properties, bool isExplicitNotNullTest, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType)
8380public BoundListPattern(SyntaxNode syntax, ImmutableArray<BoundPattern> subpatterns, bool hasSlice, BoundExpression? lengthAccess, BoundExpression? indexerAccess, BoundListPatternReceiverPlaceholder? receiverPlaceholder, BoundListPatternIndexPlaceholder? argumentPlaceholder, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8402public BoundExpression? LengthAccess { get; }
8403public BoundExpression? IndexerAccess { get; }
8410public BoundListPattern Update(ImmutableArray<BoundPattern> subpatterns, bool hasSlice, BoundExpression? lengthAccess, BoundExpression? indexerAccess, BoundListPatternReceiverPlaceholder? receiverPlaceholder, BoundListPatternIndexPlaceholder? argumentPlaceholder, Symbol? variable, BoundExpression? variableAccess, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType)
8424public BoundSlicePattern(SyntaxNode syntax, BoundPattern? pattern, BoundExpression? indexerAccess, BoundSlicePatternReceiverPlaceholder? receiverPlaceholder, BoundSlicePatternRangePlaceholder? argumentPlaceholder, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8442public BoundExpression? IndexerAccess { get; }
8449public BoundSlicePattern Update(BoundPattern? pattern, BoundExpression? indexerAccess, BoundSlicePatternReceiverPlaceholder? receiverPlaceholder, BoundSlicePatternRangePlaceholder? argumentPlaceholder, TypeSymbol inputType, TypeSymbol narrowedType)
8726public BoundRelationalPattern(SyntaxNode syntax, BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8746public BoundExpression Value { get; }
8753public BoundRelationalPattern Update(BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, bool isUnionMatching, TypeSymbol inputType, TypeSymbol narrowedType)
8802public BoundThrowExpression(SyntaxNode syntax, BoundExpression expression, TypeSymbol? type, bool hasErrors = false)
8811public BoundExpression Expression { get; }
8816public BoundThrowExpression Update(BoundExpression expression, TypeSymbol? type)
8830protected VariablePendingInference(BoundKind kind, SyntaxNode syntax, Symbol variableSymbol, BoundExpression? receiverOpt, bool hasErrors = false)
8842public BoundExpression? ReceiverOpt { get; }
8847public OutVariablePendingInference(SyntaxNode syntax, Symbol variableSymbol, BoundExpression? receiverOpt, bool hasErrors = false)
8859public OutVariablePendingInference Update(Symbol variableSymbol, BoundExpression? receiverOpt)
8873public DeconstructionVariablePendingInference(SyntaxNode syntax, Symbol variableSymbol, BoundExpression? receiverOpt, bool hasErrors = false)
8885public DeconstructionVariablePendingInference Update(Symbol variableSymbol, BoundExpression? receiverOpt)
9000public BoundExpressionWithNullability(SyntaxNode syntax, BoundExpression expression, NullableAnnotation nullableAnnotation, TypeSymbol? type, bool hasErrors = false)
9010public BoundExpression Expression { get; }
9017public BoundExpressionWithNullability Update(BoundExpression expression, NullableAnnotation nullableAnnotation, TypeSymbol? type)
9031public BoundValueForNullableAnalysis(SyntaxNode syntax, BoundExpression? originalExpression, TypeSymbol? type, bool hasErrors = false)
9037public BoundExpression? OriginalExpression { get; }
9042public BoundValueForNullableAnalysis Update(BoundExpression? originalExpression, TypeSymbol? type)
9056public BoundWithExpression(SyntaxNode syntax, BoundExpression receiver, MethodSymbol? cloneMethod, BoundObjectInitializerExpressionBase initializerExpression, TypeSymbol type, bool hasErrors = false)
9070public BoundExpression Receiver { get; }
9077public BoundWithExpression Update(BoundExpression receiver, MethodSymbol? cloneMethod, BoundObjectInitializerExpressionBase initializerExpression, TypeSymbol type)
11114BoundExpression value = (BoundExpression)this.Visit(node.Value);
11121BoundExpression value = (BoundExpression)this.Visit(node.Value);
11128BoundExpression value = (BoundExpression)this.Visit(node.Value);
11143BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
11215BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11222ImmutableArray<BoundExpression> childBoundNodes = this.VisitList(node.ChildBoundNodes);
11240ImmutableArray<BoundExpression> boundDimensionsOpt = this.VisitList(node.BoundDimensionsOpt);
11261BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11270BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11272BoundExpression? operandConversion = node.OperandConversion;
11274BoundExpression? resultConversion = node.ResultConversion;
11281BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11300BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11306BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11307BoundExpression index = (BoundExpression)this.Visit(node.Index);
11313BoundExpression invokedExpression = (BoundExpression)this.Visit(node.InvokedExpression);
11314ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11321BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11327BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11333BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11340BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11347BoundExpression? leftOperandOpt = (BoundExpression?)this.Visit(node.LeftOperandOpt);
11348BoundExpression? rightOperandOpt = (BoundExpression?)this.Visit(node.RightOperandOpt);
11354BoundExpression left = (BoundExpression)this.Visit(node.Left);
11355BoundExpression right = (BoundExpression)this.Visit(node.Right);
11361BoundExpression left = (BoundExpression)this.Visit(node.Left);
11362BoundExpression right = (BoundExpression)this.Visit(node.Right);
11373BoundExpression? trueFalseOperandConversion = node.TrueFalseOperandConversion;
11374BoundExpression left = (BoundExpression)this.Visit(node.Left);
11375BoundExpression right = (BoundExpression)this.Visit(node.Right);
11383BoundExpression left = (BoundExpression)this.Visit(node.Left);
11384BoundExpression right = (BoundExpression)this.Visit(node.Right);
11386BoundExpression? leftConversion = node.LeftConversion;
11388BoundExpression? finalConversion = node.FinalConversion;
11394BoundExpression left = (BoundExpression)this.Visit(node.Left);
11395BoundExpression right = (BoundExpression)this.Visit(node.Right);
11408BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
11409BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
11411BoundExpression? leftConversion = node.LeftConversion;
11417BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
11418BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
11424BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11425BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
11426BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
11432BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11433BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
11434BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
11441BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11442ImmutableArray<BoundExpression> indices = this.VisitList(node.Indices);
11454BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11463BoundExpression? getAwaiter = (BoundExpression?)this.Visit(node.GetAwaiter);
11470BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11576BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11583BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11586BoundExpression? operandConversion = node.OperandConversion;
11598BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11605BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11616ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11624BoundExpression? elementPointerConversion = node.ElementPointerConversion;
11625BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11667BoundExpression? initializerOpt = (BoundExpression?)this.Visit(node.InitializerOpt);
11668ImmutableArray<BoundExpression> argumentsOpt = this.VisitList(node.ArgumentsOpt);
11692BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
11697BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11703BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
11708BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11726BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11735BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11740BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11750BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11759BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11770BoundExpression? condition = (BoundExpression?)this.Visit(node.Condition);
11781BoundExpression? elementConversion = node.ElementConversion;
11783BoundExpression? iterationErrorExpressionOpt = (BoundExpression?)this.Visit(node.IterationErrorExpressionOpt);
11784BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11799BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
11813BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
11828BoundExpression? exceptionSourceOpt = (BoundExpression?)this.Visit(node.ExceptionSourceOpt);
11830BoundExpression? exceptionFilterOpt = (BoundExpression?)this.Visit(node.ExceptionFilterOpt);
11880BoundExpression value = (BoundExpression)this.Visit(node.Value);
11898BoundExpression? caseExpressionOpt = (BoundExpression?)this.Visit(node.CaseExpressionOpt);
11922BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11930BoundExpression? whenClause = (BoundExpression?)this.Visit(node.WhenClause);
11931BoundExpression value = (BoundExpression)this.Visit(node.Value);
11937BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11946BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11973BoundExpression? whenExpression = (BoundExpression?)this.Visit(node.WhenExpression);
12048BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
12058BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
12087BoundExpression? whenClause = (BoundExpression?)this.Visit(node.WhenClause);
12092BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12099ImmutableArray<BoundExpression> sideEffects = this.VisitList(node.SideEffects);
12100BoundExpression value = (BoundExpression)this.Visit(node.Value);
12108BoundExpression value = (BoundExpression)this.Visit(node.Value);
12114BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12121BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12122ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12128BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12129BoundExpression accessExpression = (BoundExpression)this.Visit(node.AccessExpression);
12136BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12137BoundExpression whenNotNull = (BoundExpression)this.Visit(node.WhenNotNull);
12138BoundExpression? whenNullOpt = (BoundExpression?)this.Visit(node.WhenNullOpt);
12149BoundExpression valueTypeReceiver = (BoundExpression)this.Visit(node.ValueTypeReceiver);
12150BoundExpression referenceTypeReceiver = (BoundExpression)this.Visit(node.ReferenceTypeReceiver);
12159BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12166BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12174BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12175ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12182BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12183BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12190ImmutableArray<BoundExpression> constructorArguments = this.VisitList(node.ConstructorArguments);
12197ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12205ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12219ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12226BoundExpression? collectionCreation = (BoundExpression?)this.Visit(node.CollectionCreation);
12240BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12242BoundExpression? conversion = node.Conversion;
12243BoundExpression? lengthOrCount = node.LengthOrCount;
12250ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12257ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12264ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12278ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
12285ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12299ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
12306ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12307BoundExpression? implicitReceiverOpt = (BoundExpression?)this.Visit(node.ImplicitReceiverOpt);
12314BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12315ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12327ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12347BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12353ImmutableArray<BoundExpression> bounds = this.VisitList(node.Bounds);
12360ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
12366BoundExpression count = (BoundExpression)this.Visit(node.Count);
12374BoundExpression count = (BoundExpression)this.Visit(node.Count);
12383BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12396BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12403BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12411BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12412ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12418BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12419BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12420BoundExpression lengthOrCountAccess = node.LengthOrCountAccess;
12422BoundExpression indexerOrSliceAccess = node.IndexerOrSliceAccess;
12429BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12430BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12437BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12438ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12459BoundExpression value = (BoundExpression)this.Visit(node.Value);
12460BoundExpression? operation = node.Operation;
12461BoundExpression? cast = node.Cast;
12462BoundExpression? unoptimizedForm = node.UnoptimizedForm;
12473BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12479ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
12485ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
12501BoundExpression value = (BoundExpression)this.Visit(node.Value);
12502BoundExpression? alignment = (BoundExpression?)this.Visit(node.Alignment);
12511BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12519BoundExpression value = (BoundExpression)this.Visit(node.Value);
12544BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
12556BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
12565BoundExpression? lengthAccess = node.LengthAccess;
12566BoundExpression? indexerAccess = node.IndexerAccess;
12569BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
12577BoundExpression? indexerAccess = node.IndexerAccess;
12636BoundExpression value = (BoundExpression)this.Visit(node.Value);
12648BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12655BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12662BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12688BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12694BoundExpression? originalExpression = (BoundExpression?)this.Visit(node.OriginalExpression);
12701BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12710private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> _updatedNullabilities;
12714public NullabilityRewriter(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> updatedNullabilities, NullableWalker.SnapshotManager? snapshotManager, ImmutableDictionary<Symbol, Symbol>.Builder remappedSymbols)
12725BoundExpression value = (BoundExpression)this.Visit(node.Value);
12733BoundExpression value = (BoundExpression)this.Visit(node.Value);
12741BoundExpression value = (BoundExpression)this.Visit(node.Value);
12759BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12937BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12955ImmutableArray<BoundExpression> childBoundNodes = this.VisitList(node.ChildBoundNodes);
12973ImmutableArray<BoundExpression> boundDimensionsOpt = this.VisitList(node.BoundDimensionsOpt);
13022BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13042BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13044BoundExpression? operandConversion = node.OperandConversion;
13046BoundExpression? resultConversion = node.ResultConversion;
13063BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13115BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13132BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13133BoundExpression index = (BoundExpression)this.Visit(node.Index);
13150BoundExpression invokedExpression = (BoundExpression)this.Visit(node.InvokedExpression);
13151ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
13169BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13186BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13203BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13221BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13239BoundExpression? leftOperandOpt = (BoundExpression?)this.Visit(node.LeftOperandOpt);
13240BoundExpression? rightOperandOpt = (BoundExpression?)this.Visit(node.RightOperandOpt);
13257BoundExpression left = (BoundExpression)this.Visit(node.Left);
13258BoundExpression right = (BoundExpression)this.Visit(node.Right);
13275BoundExpression left = (BoundExpression)this.Visit(node.Left);
13276BoundExpression right = (BoundExpression)this.Visit(node.Right);
13311BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
13312BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
13314BoundExpression? leftConversion = node.LeftConversion;
13331BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
13332BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
13349BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13350BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
13351BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
13369BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13370BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
13371BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
13388BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13389ImmutableArray<BoundExpression> indices = this.VisitList(node.Indices);
13423BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13443BoundExpression? getAwaiter = (BoundExpression?)this.Visit(node.GetAwaiter);
13451BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13709BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13727BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13730BoundExpression? operandConversion = node.OperandConversion;
13764BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13782BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13811ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
13831BoundExpression? elementPointerConversion = node.ElementPointerConversion;
13832BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13874BoundExpression? initializerOpt = (BoundExpression?)this.Visit(node.InitializerOpt);
13875ImmutableArray<BoundExpression> argumentsOpt = this.VisitList(node.ArgumentsOpt);
13891BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13901BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13909BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13919BoundExpression? condition = (BoundExpression?)this.Visit(node.Condition);
13929BoundExpression? elementConversion = node.ElementConversion;
13931BoundExpression? iterationErrorExpressionOpt = (BoundExpression?)this.Visit(node.IterationErrorExpressionOpt);
13932BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13942BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
13960BoundExpression? exceptionSourceOpt = (BoundExpression?)this.Visit(node.ExceptionSourceOpt);
13962BoundExpression? exceptionFilterOpt = (BoundExpression?)this.Visit(node.ExceptionFilterOpt);
14076BoundExpression value = (BoundExpression)this.Visit(node.Value);
14124BoundExpression? whenClause = (BoundExpression?)this.Visit(node.WhenClause);
14125BoundExpression value = (BoundExpression)this.Visit(node.Value);
14131BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14151BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14200BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
14211BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
14228BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14246ImmutableArray<BoundExpression> sideEffects = this.VisitList(node.SideEffects);
14247BoundExpression value = (BoundExpression)this.Visit(node.Value);
14266BoundExpression value = (BoundExpression)this.Visit(node.Value);
14283BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
14301BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14302ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14319BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
14320BoundExpression accessExpression = (BoundExpression)this.Visit(node.AccessExpression);
14338BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
14339BoundExpression whenNotNull = (BoundExpression)this.Visit(node.WhenNotNull);
14340BoundExpression? whenNullOpt = (BoundExpression?)this.Visit(node.WhenNullOpt);
14369BoundExpression valueTypeReceiver = (BoundExpression)this.Visit(node.ValueTypeReceiver);
14370BoundExpression referenceTypeReceiver = (BoundExpression)this.Visit(node.ReferenceTypeReceiver);
14390BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14408BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14427BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14428ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14446BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14447BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
14465ImmutableArray<BoundExpression> constructorArguments = this.VisitList(node.ConstructorArguments);
14483ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14502ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14540BoundExpression? collectionCreation = (BoundExpression?)this.Visit(node.CollectionCreation);
14572ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14590ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14608ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14644ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
14663ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14698ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
14716ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14717BoundExpression? implicitReceiverOpt = (BoundExpression?)this.Visit(node.ImplicitReceiverOpt);
14735BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14736ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14766ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14819BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
14836ImmutableArray<BoundExpression> bounds = this.VisitList(node.Bounds);
14854ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
14872BoundExpression count = (BoundExpression)this.Visit(node.Count);
14891BoundExpression count = (BoundExpression)this.Visit(node.Count);
14910BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14945BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14963BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14982BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14983ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
15000BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
15001BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
15019BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
15020ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
15074BoundExpression value = (BoundExpression)this.Visit(node.Value);
15075BoundExpression? operation = node.Operation;
15076BoundExpression? cast = node.Cast;
15077BoundExpression? unoptimizedForm = node.UnoptimizedForm;
15094BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
15111ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
15128ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
15169BoundExpression value = (BoundExpression)this.Visit(node.Value);
15170BoundExpression? alignment = (BoundExpression?)this.Visit(node.Alignment);
15188BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
15209BoundExpression value = (BoundExpression)this.Visit(node.Value);
15237BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
15250BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
15260BoundExpression? lengthAccess = node.LengthAccess;
15261BoundExpression? indexerAccess = node.IndexerAccess;
15264BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
15273BoundExpression? indexerAccess = node.IndexerAccess;
15323BoundExpression value = (BoundExpression)this.Visit(node.Value);
15341BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
15359BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
15377BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
15420BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
15437BoundExpression? originalExpression = (BoundExpression?)this.Visit(node.OriginalExpression);
15455BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
Lowering\AsyncRewriter\AsyncMethodToStateMachineRewriter.cs (22)
64private readonly Dictionary<BoundValuePlaceholderBase, BoundExpression> _placeholderMap;
103_placeholderMap = new Dictionary<BoundValuePlaceholderBase, BoundExpression>();
265? ImmutableArray.Create<BoundExpression>(F.Local(_exprRetValue))
266: ImmutableArray<BoundExpression>.Empty));
328BoundExpression expr = (BoundExpression)this.Visit(node.Expression);
348private BoundBlock VisitAwaitExpression(BoundAwaitExpression node, BoundExpression resultPlace)
353var expression = (BoundExpression)Visit(node.Expression);
361var getAwaiter = node.AwaitableInfo.IsDynamic ?
363(BoundExpression)Visit(node.AwaitableInfo.GetAwaiter);
365resultPlace = (BoundExpression)Visit(resultPlace);
393BoundExpression getResultCall = MakeCallMaybeDynamic(
420private BoundExpression MakeCallMaybeDynamic(
421BoundExpression receiver,
442loweredArguments: ImmutableArray<BoundExpression>.Empty,
449private BoundExpression GenerateGetIsCompleted(LocalSymbol awaiterTemp, MethodSymbol getIsCompletedMethod)
490BoundExpression awaiterTempRef = F.Local(awaiterTemp);
532BoundExpression awaiterFieldRef = F.Field(F.This(), awaiterField);
659BoundExpression result =
669ImmutableArray.Create<BoundExpression>(F.AssignmentExpression(F.Local(thisTemp), F.This())),
687F.Assignment(F.Local(_exprRetValue), (BoundExpression)Visit(node.ExpressionOpt)),
Lowering\ClosureConversion\ClosureConversion.cs (50)
122private BoundExpression _thisProxyInitDeferred;
582private BoundExpression FrameOfType(SyntaxNode syntax, NamedTypeSymbol frameType)
584BoundExpression result = FramePointer(syntax, frameType.OriginalDefinition);
597protected override BoundExpression FramePointer(SyntaxNode syntax, NamedTypeSymbol frameClass)
650result.Add(new BoundExpressionStatement(node.Syntax, (BoundExpression)(BoundNode)node));
664private BoundNode IntroduceFrame(BoundNode node, Analysis.ClosureEnvironment env, Func<ArrayBuilder<BoundExpression>, ArrayBuilder<LocalSymbol>, BoundNode> F)
677var prologue = ArrayBuilder<BoundExpression>.GetInstance();
698BoundExpression left = new BoundFieldAccess(syntax, new BoundLocal(syntax, framePointer, null, frameType), frameParent, null);
699BoundExpression right = FrameOfType(syntax, frameParent.Type as NamedTypeSymbol);
700BoundExpression assignment = new BoundAssignmentOperator(syntax, left, right, left.Type);
749private void InitVariableProxy(SyntaxNode syntax, Symbol symbol, LocalSymbol framePointer, ArrayBuilder<BoundExpression> prologue)
754BoundExpression value;
788var left = proxy.Replacement(
876out BoundExpression receiver,
878ref ImmutableArray<BoundExpression> arguments,
895var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(loweredSymbol.ParameterCount);
914var frame = FrameOfType(syntax, frameType);
1021out BoundExpression receiver,
1087out var receiver,
1129sideEffects: ImmutableArray.Create<BoundExpression>(rewritten),
1139private BoundSequence RewriteSequence(BoundSequence node, ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals)
1143foreach (var effect in node.SideEffects)
1145var replacement = (BoundExpression)this.Visit(effect);
1149var newValue = (BoundExpression)this.Visit(node.Value);
1160return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1165return RewriteBlock(node, ArrayBuilder<BoundExpression>.GetInstance(), ArrayBuilder<LocalSymbol>.GetInstance());
1169private BoundBlock RewriteBlock(BoundBlock node, ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals)
1222return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1229return RewriteCatch(node, ArrayBuilder<BoundExpression>.GetInstance(), ArrayBuilder<LocalSymbol>.GetInstance());
1233private BoundNode RewriteCatch(BoundCatchBlock node, ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals)
1241BoundExpression rewrittenExceptionSource = null;
1243var rewrittenFilter = (BoundExpression)this.Visit(node.ExceptionFilterOpt);
1246rewrittenExceptionSource = (BoundExpression)Visit(node.ExceptionSourceOpt);
1261foreach (var p in prologue)
1296return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1303return RewriteSequence(node, ArrayBuilder<BoundExpression>.GetInstance(), ArrayBuilder<LocalSymbol>.GetInstance());
1313return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1343var arguments = default(ImmutableArray<BoundExpression>);
1349out var receiver,
1370ImmutableArray<BoundExpression> arguments = default;
1376out BoundExpression receiver,
1400var result = (BoundExpression)RewriteLambdaConversion((BoundLambda)conversion.Operand);
1653BoundExpression receiver;
1665BoundExpression result = new BoundDelegateCreationExpression(
1692BoundExpression cache;
1735return new BoundBadExpression(F.Syntax, LookupResultKind.Empty, ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
Lowering\ClosureConversion\ExpressionLambdaRewriter.cs (143)
21private readonly Dictionary<ParameterSymbol, BoundExpression> _parameterMap = new Dictionary<ParameterSymbol, BoundExpression>();
22private Dictionary<BoundValuePlaceholder, BoundExpression> _placeholderReplacementMap;
118var result = r.VisitLambdaInternal(node);
132private BoundExpression TranslateLambdaBody(BoundBlock block)
142var result = Visit(((BoundReturnStatement)stmt).ExpressionOpt);
166private BoundExpression Visit(BoundExpression node)
175var result = VisitInternal(node);
183private BoundExpression VisitExpressionWithoutStackGuard(BoundExpression node)
260private BoundExpression VisitInternal(BoundExpression node)
262BoundExpression result;
286private BoundExpression VisitExpressionWithStackGuard(BoundExpression node)
298private BoundExpression VisitArrayAccess(BoundArrayAccess node)
300var array = Visit(node.Expression);
303var arg = node.Indices[0];
304var index = Visit(arg);
317private BoundExpression Indices(ImmutableArray<BoundExpression> expressions)
319var builder = ArrayBuilder<BoundExpression>.GetInstance();
320foreach (var arg in expressions)
322var index = Visit(arg);
333private BoundExpression Expressions(ImmutableArray<BoundExpression> expressions)
335var builder = ArrayBuilder<BoundExpression>.GetInstance();
336foreach (var arg in expressions)
344private BoundExpression VisitArrayCreation(BoundArrayCreation node)
347var boundType = _bound.Typeof(arrayType.ElementType, _bound.WellKnownType(WellKnownType.System_Type));
358return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), ExpressionType);
367private BoundExpression VisitArrayLength(BoundArrayLength node)
372private BoundExpression VisitAsOperator(BoundAsOperator node)
376var operand = _bound.Null(_bound.SpecialType(SpecialType.System_Object));
385private BoundExpression VisitBaseReference(BoundBaseReference node)
389return new BoundBadExpression(node.Syntax, 0, ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), ExpressionType);
494private BoundExpression VisitBinaryOperator(BinaryOperatorKind opKind, MethodSymbol methodOpt, TypeSymbol type, BoundExpression left, BoundExpression right)
516var enumOperand = (opKind.OperandTypes() == BinaryOperatorKind.UnderlyingAndEnum) ? right : left;
523var loweredLeft = VisitAndPromoteEnumOperand(left, promotedType, isChecked);
524var loweredRight = VisitAndPromoteEnumOperand(right, promotedType, isChecked);
526var result = MakeBinary(methodOpt, type, isLifted, requiresLifted, opFactory, loweredLeft, loweredRight);
531var loweredLeft = Visit(left);
532var loweredRight = Visit(right);
538private static BoundExpression DemoteEnumOperand(BoundExpression operand)
555private BoundExpression VisitAndPromoteEnumOperand(BoundExpression operand, TypeSymbol promotedType, bool isChecked)
568var demotedOperand = DemoteEnumOperand(operand);
569var loweredOperand = Visit(demotedOperand);
574private BoundExpression MakeBinary(MethodSymbol methodOpt, TypeSymbol type, bool isLifted, bool requiresLifted, WellKnownMember opFactory, BoundExpression loweredLeft, BoundExpression loweredRight)
605private BoundExpression Demote(BoundExpression node, TypeSymbol type, bool isChecked)
625private BoundExpression ConvertIndex(BoundExpression expr, TypeSymbol oldType, TypeSymbol newType)
643private BoundExpression VisitCall(BoundCall node)
662private BoundExpression VisitConditionalOperator(BoundConditionalOperator node)
664var condition = Visit(node.Condition);
665var consequence = VisitExactType(node.Consequence);
666var alternative = VisitExactType(node.Alternative);
674private BoundExpression VisitExactType(BoundExpression e)
694private BoundExpression VisitConversion(BoundConversion node)
718var e1 = requireAdditionalCast
721var e2 = _bound.StaticCall(node.Checked && SyntaxFacts.IsCheckedOperator(method.Name) ?
731var operand = Visit(node.Operand);
744var e1 = Convert(Visit(node.Operand), node.Operand.Type, intermediate, node.Checked, false);
754private BoundExpression Convert(BoundExpression operand, TypeSymbol oldType, TypeSymbol newType, bool isChecked, bool isExplicit)
759private BoundExpression Convert(BoundExpression expr, TypeSymbol type, bool isChecked)
767private BoundExpression DelegateCreation(BoundExpression receiver, MethodSymbol method, TypeSymbol delegateType, bool requiresInstanceReceiver)
769var nullObject = _bound.Null(_objectType);
783BoundExpression unquoted;
805private BoundExpression VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
828private BoundExpression VisitFieldAccess(BoundFieldAccess node)
830var receiver = node.FieldSymbol.IsStatic ? _bound.Null(ExpressionType) : Visit(node.ReceiverOpt);
836private BoundExpression VisitIsOperator(BoundIsOperator node)
838var operand = node.Operand;
847private BoundExpression VisitLambda(BoundLambda node)
849var result = VisitLambdaInternal(node);
853private BoundExpression VisitLambdaInternal(BoundLambda node)
857var initializers = ArrayBuilder<BoundExpression>.GetInstance();
858var parameters = ArrayBuilder<BoundExpression>.GetInstance();
865var parameter = _bound.StaticCall(
873var result = _bound.Sequence(locals.ToImmutableAndFree(), initializers.ToImmutableAndFree(),
888private BoundExpression VisitNewT(BoundNewT node)
893private BoundExpression VisitNullCoalescingOperator(BoundNullCoalescingOperator node)
895var left = Visit(node.LeftOperand);
896var right = Visit(node.RightOperand);
907BoundExpression makeConversionLambda(BoundExpression leftConversion, BoundValuePlaceholder leftPlaceholder)
914var parameter = _bound.StaticCall(WellKnownMember.System_Linq_Expressions_Expression__Parameter, _bound.Typeof(fromType, _bound.WellKnownType(WellKnownType.System_Type)), _bound.Literal(parameterName));
916_placeholderReplacementMap ??= new Dictionary<BoundValuePlaceholder, BoundExpression>();
918var convertedValue = Visit(leftConversion);
920var result = _bound.Sequence(
922ImmutableArray.Create<BoundExpression>(_bound.AssignmentExpression(parameterReference, parameter)),
926_bound.ArrayOrEmpty(ParameterExpressionType, ImmutableArray.Create<BoundExpression>(parameterReference))));
931private BoundExpression InitializerMemberSetter(Symbol symbol)
937BoundExpression fieldInfo = _bound.FieldInfo((FieldSymbol)symbol);
947BoundExpression fieldInfo = _bound.FieldInfo(((EventSymbol)symbol).AssociatedField);
958private BoundExpression InitializerMemberGetter(Symbol symbol)
964BoundExpression fieldInfo = _bound.FieldInfo((FieldSymbol)symbol);
974BoundExpression fieldInfo = _bound.FieldInfo(((EventSymbol)symbol).AssociatedField);
987private BoundExpression VisitInitializer(BoundExpression node, out InitializerKind kind)
994var builder = ArrayBuilder<BoundExpression>.GetInstance();
1003var value = VisitInitializer(a.Right, out elementKind);
1008var left = InitializerMemberGetter(sym);
1017var left = InitializerMemberSetter(sym);
1026var left = InitializerMemberGetter(sym);
1048var builder = ArrayBuilder<BoundExpression>.GetInstance();
1054BoundExpression elementInit = _bound.StaticCall(WellKnownMember.System_Linq_Expressions_Expression__ElementInit,
1071private BoundExpression VisitObjectCreationExpression(BoundObjectCreationExpression node)
1076private BoundExpression VisitObjectCreationContinued(BoundExpression creation, BoundExpression initializerExpressionOpt)
1078var result = creation;
1081var init = VisitInitializer(initializerExpressionOpt, out initializerKind);
1093private BoundExpression VisitObjectCreationExpressionInternal(BoundObjectCreationExpression node)
1108var ctor = _bound.ConstructorInfo(node.Constructor);
1110BoundExpression args = Expressions(node.Arguments);
1119var membersBuilder = ArrayBuilder<BoundExpression>.GetInstance();
1134private BoundExpression VisitParameter(BoundParameter node)
1139private static BoundExpression VisitPointerIndirectionOperator(BoundPointerIndirectionOperator node)
1143return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
1146private static BoundExpression VisitPointerElementAccess(BoundPointerElementAccess node)
1150return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
1153private BoundExpression VisitPropertyAccess(BoundPropertyAccess node)
1155var receiver = node.PropertySymbol.IsStatic ? _bound.Null(ExpressionType) : Visit(node.ReceiverOpt);
1178private static BoundExpression VisitSizeOfOperator(BoundSizeOfOperator node)
1182return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
1185private BoundExpression VisitUnaryOperator(BoundUnaryOperator node)
1187var arg = node.Operand;
1188var loweredArg = Visit(arg);
1243var result = _bound.StaticCall(opFactory, loweredArg);
1254private BoundExpression Constant(BoundExpression node)
Lowering\Instrumentation\CompoundInstrumenter.cs (25)
94public override BoundExpression InstrumentDoStatementCondition(BoundDoStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
129public override BoundExpression InstrumentForStatementCondition(BoundForStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
139public override BoundExpression InstrumentIfStatementCondition(BoundIfStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
154public override BoundExpression InstrumentUserDefinedLocalAssignment(BoundAssignmentOperator original)
159public override BoundExpression InstrumentCall(BoundCall original, BoundExpression rewritten)
166ref BoundExpression? receiver,
167ref ImmutableArray<BoundExpression> arguments,
173public override BoundExpression InstrumentObjectCreationExpression(BoundObjectCreationExpression original, BoundExpression rewritten)
178public override BoundExpression InstrumentFunctionPointerInvocation(BoundFunctionPointerInvocation original, BoundExpression rewritten)
198public override BoundStatement InstrumentSwitchWhenClauseConditionalGotoBody(BoundExpression original, BoundStatement ifConditionGotoBody)
208public override BoundExpression InstrumentWhileStatementCondition(BoundWhileStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
220ref BoundExpression? rewrittenSource,
222ref BoundExpression? rewrittenFilter,
237public override BoundExpression InstrumentSwitchStatementExpression(BoundStatement original, BoundExpression rewrittenExpression, SyntheticBoundNodeFactory factory)
242public override BoundExpression InstrumentSwitchExpressionArmExpression(BoundExpression original, BoundExpression rewrittenExpression, SyntheticBoundNodeFactory factory)
Lowering\Instrumentation\DebugInfoInjector.cs (16)
227public override BoundExpression InstrumentDoStatementCondition(BoundDoStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
234public override BoundExpression InstrumentWhileStatementCondition(BoundWhileStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
351public override BoundExpression InstrumentForStatementCondition(BoundForStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
370public override BoundExpression InstrumentIfStatementCondition(BoundIfStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
437public override BoundStatement InstrumentSwitchWhenClauseConditionalGotoBody(BoundExpression original, BoundStatement ifConditionGotoBody)
456ref BoundExpression? rewrittenSource,
458ref BoundExpression? rewrittenFilter,
486public override BoundExpression InstrumentSwitchStatementExpression(BoundStatement original, BoundExpression rewrittenExpression, SyntheticBoundNodeFactory factory)
493public override BoundExpression InstrumentSwitchExpressionArmExpression(BoundExpression original, BoundExpression rewrittenExpression, SyntheticBoundNodeFactory factory)
Lowering\Instrumentation\Instrumenter.cs (25)
112public virtual BoundExpression InstrumentDoStatementCondition(BoundDoStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
120public virtual BoundExpression InstrumentWhileStatementCondition(BoundWhileStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
184public virtual BoundExpression InstrumentForStatementCondition(BoundForStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
198public virtual BoundExpression InstrumentIfStatementCondition(BoundIfStatement original, BoundExpression rewrittenCondition, SyntheticBoundNodeFactory factory)
220public virtual BoundExpression InstrumentUserDefinedLocalAssignment(BoundAssignmentOperator original)
227public virtual BoundExpression InstrumentCall(BoundCall original, BoundExpression rewritten)
240ref BoundExpression? receiver,
241ref ImmutableArray<BoundExpression> arguments,
246public virtual BoundExpression InstrumentObjectCreationExpression(BoundObjectCreationExpression original, BoundExpression rewritten)
251public virtual BoundExpression InstrumentFunctionPointerInvocation(BoundFunctionPointerInvocation original, BoundExpression rewritten)
279public virtual BoundStatement InstrumentSwitchWhenClauseConditionalGotoBody(BoundExpression original, BoundStatement ifConditionGotoBody)
295ref BoundExpression? rewrittenSource,
297ref BoundExpression? rewrittenFilter,
305public virtual BoundExpression InstrumentSwitchStatementExpression(BoundStatement original, BoundExpression rewrittenExpression, SyntheticBoundNodeFactory factory)
317public virtual BoundExpression InstrumentSwitchExpressionArmExpression(BoundExpression original, BoundExpression rewrittenExpression, SyntheticBoundNodeFactory factory)
Lowering\Instrumentation\LocalStateTracingInstrumenter.cs (29)
362public override BoundExpression InstrumentUserDefinedLocalAssignment(BoundAssignmentOperator original)
366var assignment = base.InstrumentUserDefinedLocalAssignment(original);
369BoundExpression? refAssignmentSourceIndex;
394if (!TryGetLocalOrParameterInfo(original.Left, out var targetSymbol, out var targetType, out var targetIndex))
415private bool TryGetLocalOrParameterInfo(BoundNode node, [NotNullWhen(true)] out Symbol? symbol, [NotNullWhen(true)] out TypeSymbol? type, [NotNullWhen(true)] out BoundExpression? indexExpression)
441private ImmutableArray<BoundExpression> MakeStoreLoggerArguments(
445BoundExpression value,
446BoundExpression? refAssignmentSourceIndex,
447BoundExpression index)
462var addressOf = value is BoundLocal or BoundParameter ?
463(BoundExpression)new BoundAddressOfOperator(_factory.Syntax, value, isManaged: false, parameter.Type) :
473BoundExpression toString;
494private BoundExpression VariableRead(Symbol localOrParameterSymbol)
504ref BoundExpression? rewrittenSource,
506ref BoundExpression? rewrittenFilter,
532var targetIndex = _factory.LocalId(targetSymbol);
552public override BoundExpression InstrumentCall(BoundCall original, BoundExpression rewritten)
554ImmutableArray<BoundExpression> arguments = original.Arguments;
568public override BoundExpression InstrumentObjectCreationExpression(BoundObjectCreationExpression original, BoundExpression rewritten)
571public override BoundExpression InstrumentFunctionPointerInvocation(BoundFunctionPointerInvocation original, BoundExpression rewritten)
574private BoundExpression InstrumentCall(BoundExpression invocation, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds)
584var builder = ArrayBuilder<BoundExpression>.GetInstance();
606if (!TryGetLocalOrParameterInfo(arguments[i], out var targetSymbol, out var targetType, out var targetIndex))
630var lastExpression = builder.Last();
Lowering\LocalRewriter\LocalRewriter.cs (34)
53private Dictionary<BoundValuePlaceholderBase, BoundExpression>? _placeholderReplacementMapDoNotUseDirectly;
215BoundExpression? expr = node as BoundExpression;
225private BoundExpression? VisitExpression(BoundExpression? node)
248private BoundExpression? VisitExpressionImpl(BoundExpression node)
266var result = MakeLiteral(node.Syntax, constantValue, type);
277var visited = (BoundExpression)VisitExpressionOrPatternWithStackGuard(node);
301private static BoundExpression RefAccessMustMakeCopy(BoundExpression visited)
311private static bool IsUnusedDeconstruction(BoundExpression node)
510private BoundExpression PlaceholderReplacement(BoundValuePlaceholderBase placeholder)
513var value = _placeholderReplacementMapDoNotUseDirectly[placeholder];
519private static void AssertPlaceholderReplacement(BoundValuePlaceholderBase placeholder, BoundExpression value)
540private void AddPlaceholderReplacement(BoundValuePlaceholderBase placeholder, BoundExpression value)
546_placeholderReplacementMapDoNotUseDirectly = new Dictionary<BoundValuePlaceholderBase, BoundExpression>();
584private static BoundExpression BadExpression(BoundExpression node)
590private static BoundExpression BadExpression(SyntaxNode syntax, TypeSymbol resultType, BoundExpression child)
595private static BoundExpression BadExpression(SyntaxNode syntax, TypeSymbol resultType, BoundExpression child1, BoundExpression child2)
600private static BoundExpression BadExpression(SyntaxNode syntax, TypeSymbol resultType, ImmutableArray<BoundExpression> children)
692var operand = this.VisitExpression(node.Operand);
939BoundExpression rhs = assignment.Right;
1020internal static bool CanBePassedByReference(BoundExpression expr)
1153private BoundExpression ConvertReceiverForExtensionMemberIfNeeded(Symbol member, BoundExpression receiver, bool markAsChecked)
1166private BoundExpression ConvertReceiverForExtensionIfNeeded(BoundExpression receiver, bool markAsChecked, ParameterSymbol extensionParameter)
Lowering\LocalRewriter\LocalRewriter.DecisionDagRewriter.cs (23)
131public bool MightAssignSomething(BoundExpression expr)
144if (node is BoundExpression { ConstantValueOpt: { } })
167private static bool MethodMayMutateReceiver(BoundExpression receiver, MethodSymbol method)
339BoundExpression loweredSwitchGoverningExpression,
341out BoundExpression savedInputExpression)
360BoundExpression inputTemp = _tempAllocator.GetTemp(BoundDagTemp.ForOriginalInput(loweredSwitchGoverningExpression));
447TryLowerTypeTestAndCast(testNode.Test, evaluationNode.Evaluation, out BoundExpression sideEffect, out BoundExpression test)
471private void GenerateTest(BoundExpression test, BoundDecisionDagNode whenTrue, BoundDecisionDagNode whenFalse, BoundDecisionDagNode nextNode)
658private void LowerValueDispatchNode(ValueDispatchNode n, BoundExpression input)
676private void LowerRelationalDispatchNode(ValueDispatchNode.RelationalDispatch rel, BoundExpression input)
678var test = MakeRelationalTest(rel.Syntax, input, rel.Operator, rel.Value);
742private void LowerSwitchDispatchNode(ValueDispatchNode.SwitchDispatch node, BoundExpression input)
1010var whenExpressionMap = PooledDictionary<BoundExpression, (LabelSymbol LabelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> WhenNodes)>.GetInstance();
1016var whenExpression = whenNode.WhenExpression;
1064var whenExpression = whenNode.WhenExpression;
1087void lowerWhenExpressionIfShared(BoundExpression whenExpression, LabelSymbol labelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> whenNodes)
1131void addConditionalGoto(BoundExpression whenExpression, SyntaxNode whenClauseSyntax, LabelSymbol whenTrueLabel, ArrayBuilder<BoundStatement> sectionBuilder)
1145bool isSharedWhenExpression(BoundExpression? whenExpression)
1189BoundExpression left = _localRewriter.VisitExpression(binding.VariableAccess);
1193BoundExpression right = _tempAllocator.GetTemp(binding.TempContainingValue);
1213BoundExpression sideEffect = LowerEvaluation(evaluationNode.Evaluation);
1234BoundExpression test = base.LowerTest(testNode.Test);
Lowering\LocalRewriter\LocalRewriter.PatternLocalRewriter.cs (59)
56private readonly PooledDictionary<BoundDagTemp, BoundExpression> _map = PooledDictionary<BoundDagTemp, BoundExpression>.GetInstance();
94public BoundExpression GetTemp(BoundDagTemp dagTemp)
96if (!_map.TryGetValue(dagTemp, out BoundExpression result))
115public bool TrySetTemp(BoundDagTemp dagTemp, BoundExpression translation)
135protected BoundExpression LowerEvaluation(BoundDagEvaluation evaluation)
137BoundExpression input = _tempAllocator.GetTemp(evaluation.Input);
144BoundExpression output = _tempAllocator.GetTemp(outputTemp);
145BoundExpression access = _localRewriter.MakeFieldAccess(f.Syntax, input, field, null, LookupResultKind.Viable, field.Type);
154BoundExpression output = _tempAllocator.GetTemp(outputTemp);
164var argBuilder = ArrayBuilder<BoundExpression>.GetInstance();
165BoundExpression receiver;
166void addArg(RefKind refKind, BoundExpression expression)
192BoundExpression returnValue = null;
202BoundExpression result = _factory.Call(receiver, method, refKindBuilder.ToImmutableAndFree(), argBuilder.ToImmutableAndFree());
226BoundExpression output = _tempAllocator.GetTemp(outputTemp);
233BoundExpression evaluated;
265BoundExpression output = _tempAllocator.GetTemp(outputTemp);
275var indexerAccess = e.IndexerAccess;
281var placeholderValues = PooledDictionary<BoundEarlyValuePlaceholderBase, BoundExpression>.GetInstance();
287var access = (BoundExpression)_localRewriter.Visit(indexerAccess);
290BoundExpression output = _tempAllocator.GetTemp(outputTemp);
301var indexerAccess = e.IndexerAccess;
307var placeholderValues = PooledDictionary<BoundEarlyValuePlaceholderBase, BoundExpression>.GetInstance();
313var access = (BoundExpression)_localRewriter.Visit(indexerAccess);
316BoundExpression output = _tempAllocator.GetTemp(outputTemp);
323BoundExpression left = _tempAllocator.GetTemp(e.Target);
324BoundExpression right = _tempAllocator.GetTemp(e.Input);
335BoundExpression makeUnloweredIndexArgument(int index)
349BoundExpression makeUnloweredRangeArgument(BoundDagSliceEvaluation e)
365protected BoundExpression LowerTest(BoundDagTest test)
368BoundExpression input = _tempAllocator.GetTemp(test.Input);
396private BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
416protected BoundExpression MakeValueTest(SyntaxNode syntax, BoundExpression input, ConstantValue value)
430protected BoundExpression MakeRelationalTest(SyntaxNode syntax, BoundExpression input, BinaryOperatorKind operatorKind, ConstantValue value)
439BoundExpression literal = _localRewriter.MakeLiteral(syntax, value, input.Type);
466private BoundExpression MakeSpanStringTest(BoundExpression input, ConstantValue value)
496[NotNullWhen(true)] out BoundExpression sideEffect,
497[NotNullWhen(true)] out BoundExpression testExpression)
508BoundExpression input = _tempAllocator.GetTemp(test.Input);
509BoundExpression output = _tempAllocator.GetTemp(evaluation.MakeResultTemp());
523BoundExpression input = _tempAllocator.GetTemp(test.Input);
525BoundExpression output = _tempAllocator.GetTemp(evaluation.MakeResultTemp());
541BoundExpression loweredInput,
543Action<BoundExpression> addCode,
544out BoundExpression savedInputExpression)
602BoundExpression inputTemp = _tempAllocator.GetTemp(inputDagTemp);
647Action<BoundExpression> addCode,
649out BoundExpression savedInputExpression)
655var newArguments = ArrayBuilder<BoundExpression>.GetInstance(loweredInput.Arguments.Length);
660var expr = loweredInput.Arguments[i];
675void storeToTemp(BoundDagTemp temp, BoundExpression expr)
685var tempToHoldInput = _tempAllocator.GetTemp(temp);
Lowering\LocalRewriter\LocalRewriter_AssignmentOperator.cs (31)
21private BoundExpression VisitAssignmentOperator(BoundAssignmentOperator node, bool used)
23var loweredRight = VisitExpression(node.Right);
25BoundExpression left = node.Left;
26BoundExpression loweredLeft;
58var loweredReceiver = VisitExpression(memberAccess.Receiver);
66var loweredReceiver = VisitExpression(indexerAccess.Receiver);
100private BoundExpression MakeAssignmentOperator(SyntaxNode syntax, BoundExpression rewrittenLeft, BoundExpression rewrittenRight,
148private BoundExpression MakeDynamicSetIndex(
150BoundExpression loweredReceiver,
151ImmutableArray<BoundExpression> loweredArguments,
154BoundExpression loweredRight,
175private BoundExpression MakeStaticAssignmentOperator(
177BoundExpression rewrittenLeft,
178BoundExpression rewrittenRight,
193BoundExpression? rewrittenReceiver = propertyAccess.ReceiverOpt;
200ImmutableArray<BoundExpression>.Empty,
213BoundExpression? rewrittenReceiver = indexerAccess.ReceiverOpt;
214ImmutableArray<BoundExpression> arguments = indexerAccess.Arguments;
280private bool IsExtensionPropertyWithByValPossiblyStructReceiverWhichHasHomeAndCanChangeValueBetweenReads(BoundExpression rewrittenReceiver, PropertySymbol property)
291private BoundExpression MakePropertyAssignment(
293BoundExpression? rewrittenReceiver,
295ImmutableArray<BoundExpression> arguments,
299BoundExpression rewrittenRight,
323ArrayBuilder<BoundExpression>? storesOpt = null;
338storesOpt = ArrayBuilder<BoundExpression>.GetInstance();
342BoundExpression? rewrittenReceiverBeforePossibleCapture = rewrittenReceiver;
400BoundExpression boundRhs = new BoundLocal(syntax, rhsTemp, null, exprType);
402BoundExpression rhsAssignment = new BoundAssignmentOperator(
408BoundExpression setterCall = BoundCall.Synthesized(
Lowering\LocalRewriter\LocalRewriter_BinaryOperator.cs (211)
75BoundExpression loweredLeft = VisitExpression(node.Left);
76BoundExpression loweredRight = VisitExpression(node.Right);
93var andOperatorCall = LowerUserDefinedBinaryOperator(syntax, operatorKind & ~BinaryOperatorKind.Logical, boundTemp, loweredRight, type, node.LogicalOperator, node.ConstrainedToTypeOpt);
96BoundExpression conditionalExpression = RewriteConditionalOperator(
109sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
114public BoundExpression VisitBinaryOperator(BoundBinaryOperator node, BoundUnaryOperator? applyParentUnaryOperator)
119ImmutableArray<BoundExpression> parts = CollectBinaryOperatorInterpolatedStringParts(node);
154BoundExpression loweredLeft = VisitExpression(stack.Peek().Left);
158BoundExpression loweredRight = VisitExpression(original.Right);
167private static ImmutableArray<BoundExpression> CollectBinaryOperatorInterpolatedStringParts(BoundBinaryOperator node)
171var partsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
173static (BoundInterpolatedString interpolatedString, ArrayBuilder<BoundExpression> partsBuilder) =>
181private BoundExpression MakeBinaryOperator(
184BoundExpression loweredLeft,
185BoundExpression loweredRight,
196private BoundExpression MakeBinaryOperator(
200BoundExpression loweredLeft,
201BoundExpression loweredRight,
545private BoundExpression RewriteLiftedBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, MethodSymbol? method, TypeSymbol? constrainedToTypeOpt)
562var result = operatorKind.IsComparison() ?
570BoundExpression? whenNullOpt = null;
598private BoundExpression UnconvertArrayLength(BoundArrayLength arrLength)
603private BoundExpression MakeDynamicLogicalBinaryOperator(
606BoundExpression loweredLeft,
607BoundExpression loweredRight,
653BoundExpression result;
674var op = _dynamicFactory.MakeDynamicBinaryOperator(operatorKind, loweredLeft, loweredRight, isCompoundAssignment, type).ToExpression();
688BoundExpression leftTest = MakeTruthTestForDynamicLogicalOperator(syntax, operatorKind, loweredLeft, boolean, leftTruthOperator, constrainedToTypeOpt, negative: isAnd);
704BoundExpression leftTest = MakeTruthTestForDynamicLogicalOperator(syntax, operatorKind, loweredLeft, boolean, leftTruthOperator, constrainedToTypeOpt, negative: isAnd);
705var convertedLeft = MakeConversionNode(loweredLeft, type, @checked: false);
713return _factory.Sequence(ImmutableArray.Create(temp.LocalSymbol), ImmutableArray.Create<BoundExpression>(tempAssignment), result);
719private static ConstantValue? UnboxConstant(BoundExpression expression)
733private BoundExpression MakeTruthTestForDynamicLogicalOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, TypeSymbol boolean, MethodSymbol? leftTruthOperator, TypeSymbol? constrainedToTypeOpt, bool negative)
754var converted = MakeConversionNode(loweredLeft, boolean, @checked: false, markAsChecked: true); // The conversion was checked in binding
786private BoundExpression LowerUserDefinedBinaryOperator(
789BoundExpression loweredLeft,
790BoundExpression loweredRight,
814private BoundExpression? TrivialLiftedComparisonOperatorOptimizations(
817BoundExpression left,
818BoundExpression right,
840BoundExpression? leftNonNull = NullableAlwaysHasValue(left);
841BoundExpression? rightNonNull = NullableAlwaysHasValue(right);
862BoundExpression result = MakeLiteral(syntax, ConstantValue.Create(operatorKind == BinaryOperatorKind.NotEqual), boolType);
864BoundExpression? nonNull = leftAlwaysNull ? rightNonNull : leftNonNull;
872sideEffects: ImmutableArray.Create<BoundExpression>(nonNull),
887BoundExpression maybeNull = leftAlwaysNull ? right : left;
891BoundExpression callHasValue = _factory.MakeNullableHasValue(syntax, maybeNull);
892BoundExpression result = operatorKind == BinaryOperatorKind.Equal ?
899BoundExpression falseExpr = MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NotEqual);
907private BoundExpression MakeOptimizedGetValueOrDefault(SyntaxNode syntax, BoundExpression expression)
925private BoundExpression MakeBooleanConstant(SyntaxNode syntax, bool value)
930private BoundExpression MakeOptimizedHasValue(SyntaxNode syntax, BoundExpression expression)
944private BoundExpression MakeNullableHasValue(SyntaxNode syntax, BoundExpression expression)
954private BoundExpression LowerLiftedBuiltInComparisonOperator(
957BoundExpression loweredLeft,
958BoundExpression loweredRight)
974BoundExpression? optimized = TrivialLiftedComparisonOperatorOptimizations(syntax, kind, loweredLeft, loweredRight, method: null, constrainedToTypeOpt: null);
1013BoundExpression? xNonNull = NullableAlwaysHasValue(loweredLeft);
1014BoundExpression? yNonNull = NullableAlwaysHasValue(loweredRight);
1051BoundExpression callX_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempX);
1052BoundExpression callY_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempY);
1053BoundExpression callX_HasValue = MakeOptimizedHasValue(syntax, boundTempX);
1054BoundExpression callY_HasValue = MakeOptimizedHasValue(syntax, boundTempY);
1074BoundExpression leftExpression = MakeBinaryOperator(
1084BoundExpression rightExpression = MakeBinaryOperator(
1095BoundExpression binaryExpression = MakeBinaryOperator(
1118sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1144private BoundExpression LowerLiftedUserDefinedComparisonOperator(
1147BoundExpression loweredLeft,
1148BoundExpression loweredRight,
1154BoundExpression? optimized = TrivialLiftedComparisonOperatorOptimizations(syntax, kind, loweredLeft, loweredRight, method, constrainedToTypeOpt);
1209BoundExpression? xNonNull = NullableAlwaysHasValue(loweredLeft);
1210BoundExpression? yNonNull = NullableAlwaysHasValue(loweredRight);
1224BoundExpression callX_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempX);
1225BoundExpression callY_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempY);
1226BoundExpression callX_HasValue = MakeOptimizedHasValue(syntax, boundTempX);
1227BoundExpression callY_HasValue = MakeOptimizedHasValue(syntax, boundTempY);
1245BoundExpression condition = MakeBinaryOperator(
1255BoundExpression unliftedOp = MakeBinaryOperator(
1264BoundExpression consequence;
1293BoundExpression alternative = MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NotEqual);
1295BoundExpression conditionalExpression = RewriteConditionalOperator(
1307sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1312private BoundExpression? TrivialLiftedBinaryArithmeticOptimizations(
1315BoundExpression left,
1316BoundExpression right,
1341BoundExpression? leftNonNull = NullableAlwaysHasValue(left);
1342BoundExpression? rightNonNull = NullableAlwaysHasValue(right);
1352private BoundExpression MakeLiftedBinaryOperatorConsequence(
1355BoundExpression left,
1356BoundExpression right,
1362BoundExpression unliftedOp = MakeBinaryOperator(
1378private static BoundExpression? OptimizeLiftedArithmeticOperatorOneNull(
1380BoundExpression left,
1381BoundExpression right,
1399BoundExpression notAlwaysNull = leftAlwaysNull ? right : left;
1400BoundExpression? neverNull = NullableAlwaysHasValue(notAlwaysNull);
1401BoundExpression sideEffect = neverNull ?? notAlwaysNull;
1416sideEffects: ImmutableArray.Create<BoundExpression>(sideEffect),
1421private BoundExpression LowerLiftedBinaryArithmeticOperator(
1424BoundExpression loweredLeft,
1425BoundExpression loweredRight,
1434BoundExpression? optimized = OptimizeLiftedBinaryArithmetic(syntax, kind, loweredLeft, loweredRight, type, method, constrainedToTypeOpt);
1458var sideeffects = ArrayBuilder<BoundExpression>.GetInstance();
1461BoundExpression? leftNeverNull = NullableAlwaysHasValue(loweredLeft);
1462BoundExpression? rightNeverNull = NullableAlwaysHasValue(loweredRight);
1464BoundExpression boundTempX = leftNeverNull ?? loweredLeft;
1467BoundExpression boundTempY = rightNeverNull ?? loweredRight;
1470BoundExpression callX_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempX);
1471BoundExpression callY_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempY);
1472BoundExpression callX_HasValue = MakeOptimizedHasValue(syntax, boundTempX);
1473BoundExpression callY_HasValue = MakeOptimizedHasValue(syntax, boundTempY);
1477BoundExpression condition = MakeBinaryOperator(syntax, BinaryOperatorKind.BoolAnd, callX_HasValue, callY_HasValue, boolType, method: null, constrainedToTypeOpt: null);
1480BoundExpression consequence = MakeLiftedBinaryOperatorConsequence(syntax, kind, callX_GetValueOrDefault, callY_GetValueOrDefault, type, method, constrainedToTypeOpt);
1483BoundExpression alternative = new BoundDefaultExpression(syntax, type);
1488BoundExpression conditionalExpression = RewriteConditionalOperator(
1505private BoundExpression CaptureExpressionInTempIfNeeded(
1506BoundExpression operand,
1507ArrayBuilder<BoundExpression> sideeffects,
1523private BoundExpression? OptimizeLiftedBinaryArithmetic(
1526BoundExpression left,
1527BoundExpression right,
1532BoundExpression? optimized = TrivialLiftedBinaryArithmeticOptimizations(syntax, kind, left, right, type, method, constrainedToTypeOpt);
1626BoundExpression? nonNullRight = NullableAlwaysHasValue(right);
1659private BoundExpression MakeNewNullableBoolean(SyntaxNode syntax, bool? value)
1674private BoundExpression? OptimizeLiftedBooleanOperatorOneNull(
1677BoundExpression left,
1678BoundExpression right)
1705BoundExpression alwaysNull = leftAlwaysNull ? left : right;
1706BoundExpression notAlwaysNull = leftAlwaysNull ? right : left;
1707BoundExpression? neverNull = NullableAlwaysHasValue(notAlwaysNull);
1709BoundExpression nullBool = new BoundDefaultExpression(syntax, alwaysNull.Type);
1713BoundExpression newNullBool = MakeNewNullableBoolean(syntax, kind == BinaryOperatorKind.LiftedBoolOr);
1739BoundExpression condition = MakeOptimizedGetValueOrDefault(syntax, boundTemp);
1740BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolAnd ? nullBool : boundTemp;
1741BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTemp : nullBool;
1742BoundExpression conditionalExpression = RewriteConditionalOperator(
1754sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
1759private BoundExpression? OptimizeLiftedBooleanOperatorOneNonNull(
1762BoundExpression left,
1763BoundExpression right)
1781BoundExpression? leftNonNull = NullableAlwaysHasValue(left);
1782BoundExpression? rightNonNull = NullableAlwaysHasValue(right);
1798BoundExpression nonNullTemp = leftNonNull == null ? boundTempY : boundTempX;
1799BoundExpression maybeNullTemp = leftNonNull == null ? boundTempX : boundTempY;
1800BoundExpression condition = nonNullTemp;
1801BoundExpression newNullBool = MakeNewNullableBoolean(syntax, kind == BinaryOperatorKind.LiftedBoolOr);
1802BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolOr ? newNullBool : maybeNullTemp;
1803BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolOr ? maybeNullTemp : newNullBool;
1804BoundExpression conditionalExpression = RewriteConditionalOperator(
1815sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1820private BoundExpression LowerLiftedBooleanOperator(
1823BoundExpression loweredLeft,
1824BoundExpression loweredRight)
1830BoundExpression? optimized = OptimizeLiftedBooleanOperatorOneNull(syntax, kind, loweredLeft, loweredRight);
1859BoundExpression callX_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTempX, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefaultX);
1861BoundExpression callY_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTempY, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefaultY);
1863BoundExpression callX_HasValue = _factory.MakeNullableHasValue(syntax, boundTempX);
1866BoundExpression innerOr = MakeBinaryOperator(
1876BoundExpression invert = MakeUnaryOperator(UnaryOperatorKind.BoolLogicalNegation, syntax, method: null, constrainedToTypeOpt: null, innerOr, boolType);
1879BoundExpression condition = MakeBinaryOperator(
1888BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTempY : boundTempX;
1889BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTempX : boundTempY;
1891BoundExpression conditionalExpression = RewriteConditionalOperator(
1903sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1942private BoundExpression RewriteNullableNullEquality(
1945BoundExpression loweredLeft,
1946BoundExpression loweredRight,
1964BoundExpression nullable = loweredRight.IsLiteralNull() ? loweredLeft : loweredRight;
1973BoundExpression? nonNullValue = NullableAlwaysHasValue(nullable);
1984sideEffects: ImmutableArray.Create<BoundExpression>(nonNullValue),
1994BoundExpression whenNotNull = RewriteNullableNullEquality(
2001var whenNull = kind == BinaryOperatorKind.NullableNullEqual ? MakeBooleanConstant(syntax, true) : null;
2006BoundExpression call = MakeNullableHasValue(syntax, nullable);
2007BoundExpression result = kind == BinaryOperatorKind.NullableNullNotEqual ?
2014private BoundExpression RewriteStringEquality(BoundBinaryOperator? oldNode, SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2027private BoundExpression RewriteDelegateOperation(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2048BoundExpression call = _inExpressionLambda
2050: (BoundExpression)BoundCall.Synthesized(syntax, receiverOpt: null, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, method, loweredLeft, loweredRight);
2051BoundExpression result = method.ReturnType.SpecialType == SpecialType.System_Delegate ?
2057private BoundExpression RewriteDecimalBinaryOperation(SyntaxNode syntax, BoundExpression loweredLeft, BoundExpression loweredRight, BinaryOperatorKind operatorKind)
2088private BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
2145private BoundExpression RewriteBuiltInShiftOperation(
2149BoundExpression loweredLeft,
2150BoundExpression loweredRight,
2207private BoundExpression RewriteBuiltInNativeShiftOperation(
2211BoundExpression loweredLeft,
2212BoundExpression loweredRight,
2268private BoundExpression RewritePointerNumericOperator(
2271BoundExpression loweredLeft,
2272BoundExpression loweredRight,
2321private BoundExpression MakeSizeOfMultiplication(BoundExpression numericOperand, PointerTypeSymbol pointerType, bool isChecked)
2323var sizeOfExpression = _factory.Sizeof(pointerType.PointedAtType);
2465private BoundExpression RewritePointerSubtraction(
2467BoundExpression loweredLeft,
2468BoundExpression loweredRight,
2476var sizeOfExpression = _factory.Sizeof(pointerType.PointedAtType);
Lowering\LocalRewriter\LocalRewriter_Call.cs (84)
23public BoundExpression VisitDynamicInvocation(BoundDynamicInvocation node, bool resultDiscarded)
30BoundExpression loweredReceiver;
82var loweredExpression = VisitExpression(node.Expression);
98private void EmbedIfNeedTo(BoundExpression receiver, ImmutableArray<MethodSymbol> methods, SyntaxNode syntaxNode)
117private void EmbedIfNeedTo(BoundExpression receiver, ImmutableArray<PropertySymbol> properties, SyntaxNode syntaxNode)
138ref BoundExpression? receiverOpt,
139ref ImmutableArray<BoundExpression> arguments,
340BoundExpression rewrittenCall;
357BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
371BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
377BoundExpression visitArgumentsAndFinishRewrite(BoundCall node, BoundExpression? rewrittenReceiver)
382ImmutableArray<BoundExpression> arguments = node.Arguments;
386BoundExpression? firstRewrittenArgument = null;
422var rewrittenCall = MakeCall(node, node.Syntax, rewrittenReceiver, method, rewrittenArguments, argRefKindsOpt, node.ResultKind, temps.ToImmutableAndFree());
455private BoundExpression MakeCall(
458BoundExpression? rewrittenReceiver,
460ImmutableArray<BoundExpression> rewrittenArguments,
465BoundExpression rewrittenBoundCall;
532sideEffects: ImmutableArray<BoundExpression>.Empty,
540private BoundExpression MakeCall(SyntaxNode syntax, BoundExpression? rewrittenReceiver, MethodSymbol method, ImmutableArray<BoundExpression> rewrittenArguments)
553private static bool IsSafeForReordering(BoundExpression expression, RefKind kind)
560var current = expression;
640internal static bool IsCapturedPrimaryConstructorParameter(BoundExpression expression)
662private ImmutableArray<BoundExpression> VisitArgumentsAndCaptureReceiverIfNeeded(
663[NotNullIfNotNull(nameof(rewrittenReceiver))] ref BoundExpression? rewrittenReceiver,
665ImmutableArray<BoundExpression> arguments,
669ArrayBuilder<BoundExpression>? storesOpt,
671BoundExpression? firstRewrittenArgument = null)
738ImmutableArray<BoundExpression> rewrittenArguments;
747var visitedArgumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(arguments.Length);
756var argument = arguments[i];
827extraRefInitialization is object ? ImmutableArray.Create<BoundExpression>(extraRefInitialization, assignmentToTemp) : ImmutableArray.Create<BoundExpression>(assignmentToTemp),
846ArrayBuilder<BoundExpression> visitedArgumentsBuilder,
852var argument = arguments[argumentIndex];
901var visitedArgument = visitedArgumentsBuilder[argIndex];
904visitedArgumentsBuilder[argIndex] = _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, ImmutableArray.Create<BoundExpression>(store), local);
926static bool usesReceiver(BoundExpression argument)
950private RefKind GetExtensionBlockMemberReceiverCaptureRefKind(BoundExpression rewrittenReceiver, Symbol methodOrIndexer)
1026_factory.Sequence(new BoundExpression[] { _factory.AssignmentExpression(cache, intermediateRef) }, cache),
1044_factory.Sequence(new BoundExpression[] { _factory.AssignmentExpression(cache, assignmentToTemp.Right) }, cache),
1059private ImmutableArray<BoundExpression> MakeArguments(
1060ImmutableArray<BoundExpression> rewrittenArguments,
1079BoundExpression? optimized;
1145BoundExpression[] actualArguments = new BoundExpression[parameters.Length]; // The actual arguments that will be passed; one actual argument per formal parameter.
1192private bool TryOptimizeParamsArray(BoundExpression possibleParamsArray, [NotNullWhen(true)] out BoundExpression? optimized)
1294ImmutableArray<BoundExpression> rewrittenArguments,
1353private delegate BoundExpression ParamsArrayElementRewriter<TArg>(BoundExpression element, ref TArg arg);
1354private static BoundExpression RewriteParamsArray<TArg>(BoundExpression paramsArray, ParamsArrayElementRewriter<TArg> elementRewriter, ref TArg arg)
1360ArrayBuilder<BoundExpression>? elementsBuilder = null;
1364var element = elements[i];
1365var replacement = elementRewriter(element, ref arg);
1371elementsBuilder = ArrayBuilder<BoundExpression>.GetInstance(elements.Length);
1404ImmutableArray<BoundExpression> rewrittenArguments,
1406/* out */ BoundExpression[] arguments,
1417BoundExpression argument = rewrittenArguments[a];
1443static (BoundExpression element, ref (LocalRewriter rewriter, bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps) arg) =>
1460private BoundExpression StoreArgumentToTempIfNecessary(bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps, BoundExpression argument, RefKind argRefKind, RefKind paramRefKind)
1479bool isLambdaConversion(BoundExpression expr)
1483private BoundExpression CreateEmptyArray(SyntaxNode syntax, ArrayTypeSymbol arrayType)
1485BoundExpression? arrayEmpty = CreateArrayEmptyCallIfAvailable(syntax, arrayType.ElementType);
1493ImmutableArray.Create<BoundExpression>(
1503private BoundExpression? CreateArrayEmptyCallIfAvailable(SyntaxNode syntax, TypeSymbol elementType)
1525ImmutableArray<BoundExpression>.Empty,
1538BoundExpression[] arguments,
1568BoundExpression[] arguments,
1593var argument = arguments[a];
1600static (BoundExpression element, ref (ArrayBuilder<BoundAssignmentOperator> tempStores, int tempsRemainedInUse, int firstUnclaimedStore) arg) =>
1615static BoundExpression mergeArgumentAndSideEffect(BoundExpression argument, ArrayBuilder<BoundAssignmentOperator> tempStores, ref int tempsRemainedInUse, ref int firstUnclaimedStore)
1637var value = tempStores[correspondingStore].Right;
1653var sideeffects = new BoundExpression[correspondingStore - firstUnclaimedStore];
1686BoundExpression[] actualArguments, //already re-ordered to match parameters
1710var argument = actualArguments[argIndex];
1729sideEffects: ImmutableArray.Create<BoundExpression>(boundAssignmentToTemp),
1748var loweredReceiver = VisitExpression(node.Receiver);
Lowering\LocalRewriter\LocalRewriter_CollectionExpression.cs (114)
29private BoundExpression RewriteCollectionExpressionConversion(Conversion conversion, BoundCollectionExpression node)
64var rewrittenReceiver = node.HasWithElement ? VisitExpression(node.CollectionCreation) : null;
65if (rewrittenReceiver is null && TryRewriteSingleElementSpreadToList(node, listElementType, out var result))
125BoundExpression expr;
133expr = (BoundExpression)element;
147var iteratorBody = Binder.GetUnderlyingCollectionExpressionElement(node, ((BoundExpressionStatement)spreadElement.IteratorBody).Expression, throwOnErrors: true);
160var result = Binder.GetUnderlyingCollectionExpressionElement(node, (BoundExpression)element, throwOnErrors: true);
169private bool TryRewriteSingleElementSpreadToList(BoundCollectionExpression node, TypeWithAnnotations listElementType, [NotNullWhen(true)] out BoundExpression? result)
192var rewrittenSpreadExpression = VisitExpression(singleSpread.Expression);
226private static bool CanOptimizeSingleSpreadAsCollectionBuilderArgument(BoundCollectionExpression node, [NotNullWhen(true)] out BoundExpression? spreadExpression)
250private BoundExpression VisitArrayOrSpanCollectionExpression(BoundCollectionExpression node, TypeSymbol collectionType)
288BoundExpression createImmutableArray(BoundCollectionExpression node, NamedTypeSymbol immutableArrayType)
309var arrayValue = createArray(node, arrayType, targetsReadOnlyCollection: true);
318BoundExpression? tryCreateNonArrayBackedSpan(BoundCollectionExpression node, NamedTypeSymbol spanType, bool isReadOnlySpan)
339var rewrittenElements = elements.SelectAsArray(static (element, rewriter) => rewriter.VisitExpression((BoundExpression)element), this);
358BoundExpression createSpan(BoundCollectionExpression node, NamedTypeSymbol spanType, bool isReadOnlySpan)
368var arrayValue = createArray(node, arrayType, targetsReadOnlyCollection: isReadOnlySpan);
388BoundExpression createArray(BoundCollectionExpression node, ArrayTypeSymbol arrayType, bool targetsReadOnlyCollection)
390BoundExpression array;
403var list = CreateAndPopulateList(node, arrayType.ElementTypeWithAnnotations, node.Elements,
419private BoundExpression VisitCollectionInitializerCollectionExpression(BoundCollectionExpression node, TypeSymbol collectionType)
424var rewrittenReceiver = VisitExpression(node.CollectionCreation);
431var sideEffects = ArrayBuilder<BoundExpression>.GetInstance(elements.Length + 1);
441var rewrittenElement = element is BoundCollectionExpressionSpreadElement spreadElement ?
448var rewrittenValue = rewriteCollectionInitializer(temp, ((BoundExpressionStatement)iteratorBody).Expression);
454rewriteCollectionInitializer(temp, (BoundExpression)element);
470BoundExpression? rewriteCollectionInitializer(BoundLocal rewrittenReceiver, BoundExpression expressionElement)
481private BoundExpression VisitListInterfaceCollectionExpression(BoundCollectionExpression node)
494BoundExpression arrayOrList;
523BoundExpression fieldValue = kind switch
526SynthesizedReadOnlyListKind.SingleElement => this.VisitExpression((BoundExpression)elements.Single()),
565BoundExpression createArray(BoundCollectionExpression node, ArrayTypeSymbol arrayType)
579private BoundExpression VisitCollectionBuilderCollectionExpression(BoundCollectionExpression node)
599var span = CanOptimizeSingleSpreadAsCollectionBuilderArgument(node, out var spreadExpression)
606var result = VisitExpression(node.CollectionCreation);
626node.Elements.All(e => ((BoundExpression)e).ConstantValueOpt is { });
636private BoundExpression CreateAndPopulateSpanFromInlineArray(
643Debug.Assert(elements.All(e => e is BoundExpression));
660var element = VisitExpression((BoundExpression)elements[0]);
678var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
688var element = VisitExpression((BoundExpression)elements[i]);
756private BoundExpression? TryOptimizeSingleSpreadToArray_NoConversionApplied(BoundCollectionExpression node, bool targetsReadOnlyCollection, ArrayTypeSymbol arrayType)
776var rewrittenSpreadExpression = VisitExpression(spreadExpression);
800var rewrittenSpreadExpression = CallAsSpanMethod(VisitExpression(spreadExpression), asSpanMethod);
825private BoundExpression CreateAndPopulateArray(BoundCollectionExpression node, ArrayTypeSymbol arrayType)
852elements.SelectAsArray(static (element, rewriter) => rewriter.VisitExpression((BoundExpression)element), this));
855ImmutableArray.Create<BoundExpression>(
867var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
902addElement: (ArrayBuilder<BoundExpression> expressions, BoundExpression arrayTemp, BoundExpression rewrittenValue, bool isLastElement) =>
944tryOptimizeSpreadElement: (ArrayBuilder<BoundExpression> sideEffects, BoundExpression arrayTemp, BoundCollectionExpressionSpreadElement spreadElement, BoundExpression rewrittenSpreadOperand) =>
954if (!TryConvertToSpan(arrayTemp, writableOnly: true, out var targetSpan))
1033private bool TryConvertToSpan(BoundExpression expression, bool writableOnly, [NotNullWhen(true)] out BoundExpression? span)
1048private BoundExpression CallAsSpanMethod(BoundExpression spreadExpression, MethodSymbol? asSpanMethod)
1072private (MethodSymbol spanSliceMethod, BoundExpression spreadElementAsSpan, MethodSymbol getLengthMethod, MethodSymbol copyToMethod)? PrepareCopyToOptimization(
1074BoundExpression rewrittenSpreadOperand)
1084if (!TryConvertToSpan(rewrittenSpreadOperand, writableOnly: false, out var spreadOperandAsSpan))
1114ArrayBuilder<BoundExpression> sideEffects,
1117BoundExpression spanTemp,
1118BoundExpression rewrittenSpreadOperand,
1120BoundExpression spreadOperandAsSpan,
1155private BoundExpression CreateAndPopulateList(
1159BoundExpression? rewrittenReceiver)
1167var sideEffects = ArrayBuilder<BoundExpression>.GetInstance(elements.Length + 1);
1200var knownLengthExpression = GetKnownLengthExpression(elements, numberIncludingLastSpread, localsBuilder);
1212rewrittenReceiver = _factory.New(constructor, ImmutableArray.Create<BoundExpression>(knownLengthTemp));
1224rewrittenReceiver = _factory.New(constructor, ImmutableArray<BoundExpression>.Empty);
1273addElement: (ArrayBuilder<BoundExpression> expressions, BoundExpression spanTemp, BoundExpression rewrittenValue, bool isLastElement) =>
1315tryOptimizeSpreadElement: (ArrayBuilder<BoundExpression> sideEffects, BoundExpression spanTemp, BoundCollectionExpressionSpreadElement spreadElement, BoundExpression rewrittenSpreadOperand) =>
1337addElement: (ArrayBuilder<BoundExpression> expressions, BoundExpression listTemp, BoundExpression rewrittenValue, bool isLastElement) =>
1343tryOptimizeSpreadElement: (ArrayBuilder<BoundExpression> sideEffects, BoundExpression listTemp, BoundCollectionExpressionSpreadElement spreadElement, BoundExpression rewrittenSpreadOperand) =>
1371private BoundExpression RewriteCollectionExpressionElementExpression(BoundNode element)
1373var expression = element is BoundCollectionExpressionSpreadElement spreadElement ?
1375(BoundExpression)element;
1383ArrayBuilder<BoundExpression> sideEffects)
1387var rewrittenExpression = RewriteCollectionExpressionElementExpression(elements[i]);
1397BoundExpression rewrittenReceiver,
1400ArrayBuilder<BoundExpression> sideEffects,
1401Action<ArrayBuilder<BoundExpression>, BoundExpression, BoundExpression, bool> addElement,
1402Func<ArrayBuilder<BoundExpression>, BoundExpression, BoundCollectionExpressionSpreadElement, BoundExpression, bool> tryOptimizeSpreadElement)
1407var rewrittenExpression = i < numberIncludingLastSpread ?
1416var rewrittenElement = MakeCollectionExpressionSpreadElement(
1421var rewrittenValue = VisitExpression(((BoundExpressionStatement)iteratorBody).Expression);
1422var builder = ArrayBuilder<BoundExpression>.GetInstance();
1441private BoundExpression GetKnownLengthExpression(ImmutableArray<BoundNode> elements, int numberIncludingLastSpread, ArrayBuilder<BoundLocal> rewrittenExpressions)
1446BoundExpression? sum = null;
1456var lengthAccess = VisitExpression(spreadElement.LengthOrCount);
1481BoundExpression add(BoundExpression? sum, BoundExpression value)
1489private BoundExpression MakeCollectionExpressionSpreadElement(
1491BoundExpression rewrittenExpression,
Lowering\LocalRewriter\LocalRewriter_CompoundAssignmentOperator.cs (67)
22private BoundExpression VisitCompoundAssignmentOperator(BoundCompoundAssignmentOperator node, bool used)
36private BoundExpression VisitInstanceCompoundAssignmentOperator(BoundCompoundAssignmentOperator node, bool used)
82private BoundExpression VisitBuiltInOrStaticCompoundAssignmentOperator(BoundCompoundAssignmentOperator node, bool used)
86var stores = ArrayBuilder<BoundExpression>.GetInstance();
95BoundExpression transformedLHS = TransformCompoundAssignmentLHS(node.Left, stores, temps, isDynamic);
96var lhsRead = MakeRValue(transformedLHS);
97BoundExpression rewrittenAssignment;
119var sequence = ArrayBuilder<BoundExpression>.GetInstance();
137BoundExpression loweredRight = VisitExpression(node.Right);
156var condition = _factory.Conditional(isEvent, invokeEventAccessor.ToExpression(), rewrittenAssignment, rewrittenAssignment.Type);
166BoundExpression result = (temps.Count == 0 && stores.Count == 0) ?
179BoundExpression rewriteAssignment(BoundExpression leftRead, BoundExpression right, bool rightIsVisited)
192BoundExpression opLHS = leftRead;
203BoundExpression operand;
212var loweredRight = rightIsVisited ? right : VisitExpression(right);
217BoundExpression opFinal = operand;
234BoundExpression assignment = MakeAssignmentOperator(syntax, transformedLHS, binaryResult, used: used, isChecked: isChecked, AssignmentKind.CompoundAssignment);
243private static bool IsExtensionBlockMemberAccessWithByValPossiblyStructReceiver(BoundExpression transformedLHS)
261private BoundExpression? TransformPropertyOrEventReceiver(Symbol propertyOrEvent, BoundExpression? receiverOpt, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
291BoundExpression rewrittenReceiver = VisitExpression(receiverOpt);
351private BoundDynamicMemberAccess TransformDynamicMemberAccess(BoundDynamicMemberAccess memberAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
359var rewrittenReceiver = VisitExpression(memberAccess.Receiver);
368private BoundIndexerAccess TransformIndexerAccess(BoundIndexerAccess indexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
370var receiverOpt = indexerAccess.ReceiverOpt;
373BoundExpression transformedReceiver = VisitExpression(receiverOpt);
420ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
437BoundExpression transformedReceiver,
438ImmutableArray<BoundExpression> rewrittenArguments,
439ArrayBuilder<BoundExpression> stores,
471private ImmutableArray<BoundExpression> ExtractSideEffectsFromArguments(
472ImmutableArray<BoundExpression> rewrittenArguments,
477ArrayBuilder<BoundExpression> stores,
481BoundExpression[] actualArguments = new BoundExpression[parameters.Length]; // The actual arguments that will be passed; one actual argument per formal parameter.
502if (TryOptimizeParamsArray(array, out BoundExpression? optimized))
537private BoundExpression TransformImplicitIndexerAccess(
539ArrayBuilder<BoundExpression> stores,
554private BoundExpression TransformIndexPatternIndexerAccess(BoundImplicitIndexerAccess implicitIndexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps, bool isDynamicAssignment)
557var access = GetUnderlyingIndexerOrSliceAccess(
590private bool TransformCompoundAssignmentFieldOrEventAccessReceiver(Symbol fieldOrEvent, ref BoundExpression? receiver, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
612BoundExpression rewrittenReceiver = VisitExpression(receiver);
633private BoundDynamicIndexerAccess TransformDynamicIndexerAccess(BoundDynamicIndexerAccess indexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
635BoundExpression loweredReceiver;
650var loweredArguments = new BoundExpression[arguments.Length];
692private BoundExpression TransformCompoundAssignmentLHS(BoundExpression originalLHS, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps, bool isDynamicAssignment)
771BoundExpression? receiverOpt = fieldAccess.ReceiverOpt;
800var loweredArray = VisitExpression(arrayAccess.Expression);
824var result = VisitExpression(originalLHS);
854BoundExpression? receiverOpt = eventAccess.ReceiverOpt;
882BoundExpression rewrittenVariable = VisitExpression(originalLHS);
896private BoundExpression BoxReceiver(BoundExpression rewrittenReceiver, NamedTypeSymbol memberContainingType)
907private BoundExpression SpillArrayElementAccess(
908BoundExpression loweredExpression,
909ImmutableArray<BoundExpression> loweredIndices,
910ArrayBuilder<BoundExpression> stores,
919var boundTempIndices = new BoundExpression[loweredIndices.Length];
953BoundExpression expression,
1001BoundExpression expression)
Lowering\LocalRewriter\LocalRewriter_Conversion.cs (84)
48var objectCreation = VisitExpression(node.Operand);
62var rewrittenCollection = RewriteCollectionExpressionConversion(node.Conversion.UnderlyingConversions[0], (BoundCollectionExpression)node.Operand);
75var rewrittenOperand = VisitExpression(node.Operand);
79var result = MakeConversionNode(node, node.Syntax, rewrittenOperand, node.Conversion, node.Checked, node.ExplicitCastInCode, node.ConstantValueOpt, rewrittenType);
92private BoundExpression MakeUtf8Span(BoundExpression node, IReadOnlyList<byte>? bytes)
103BoundExpression result;
105BoundExpression utf8Bytes = bytes is null ?
106BadExpression(node.Syntax, byteArray, ImmutableArray<BoundExpression>.Empty) :
111result = BadExpression(node.Syntax, node.Type, ImmutableArray<BoundExpression>.Empty);
145var builder = ArrayBuilder<BoundExpression>.GetInstance(bytes.Count + 1);
158ImmutableArray.Create<BoundExpression>(_factory.Literal(builder.Count)),
164private BoundExpression VisitUtf8Addition(BoundBinaryOperator node)
170var stack = ArrayBuilder<BoundExpression>.GetInstance();
176var current = stack.Pop();
206BoundExpression result = MakeUtf8Span(node, haveRepresentationError ? null : bytesBuilder);
212private static bool IsFloatingPointExpressionOfUnknownPrecision(BoundExpression rewrittenNode)
260private BoundExpression MakeConversionNode(
263BoundExpression rewrittenOperand,
270var result = MakeConversionNodeCore(oldNodeOpt, syntax, rewrittenOperand, conversion, @checked, explicitCastInCode, constantValueOpt, rewrittenType);
296private BoundExpression MakeConversionNodeCore(
299BoundExpression rewrittenOperand,
395BoundExpression? nullableValue = NullableAlwaysHasValue(rewrittenOperand);
468var operand = MakeConversionNode(
517var rewrittenNode = RewriteDecimalConversion(syntax, rewrittenOperand, rewrittenOperand.Type, underlyingTypeTo, @checked, isImplicit: false, constantValueOpt: constantValueOpt);
576var receiver = (!method.RequiresInstanceReceiver && !oldNodeOpt.IsExtensionMethod && !method.IsAbstract && !method.IsVirtual) ? _factory.Type(method.ContainingType) : mg.ReceiverOpt;
806private BoundExpression MakeConversionNode(BoundExpression rewrittenOperand, TypeSymbol rewrittenType, bool @checked, bool acceptFailingConversion = false, bool markAsChecked = false)
825BoundExpression rewrittenOperand,
855internal BoundExpression MakeConversionNode(
857BoundExpression rewrittenOperand,
925BoundExpression userDefined = RewriteUserDefinedConversion(
1012private BoundExpression RewriteTupleConversion(
1014BoundExpression rewrittenOperand,
1026var fieldAccessorsBuilder = ArrayBuilder<BoundExpression>.GetInstance(numElements);
1035var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(savedTuple, syntax, srcElementFields[i]);
1036var convertedFieldAccess = MakeConversionNode(syntax, fieldAccess, elementConversions[i], destElementTypes[i].Type, @checked, explicitCastInCode);
1040var result = MakeTupleCreationExpression(syntax, rewrittenType, fieldAccessorsBuilder.ToImmutableAndFree());
1044internal static bool NullableNeverHasValue(BoundExpression expression)
1059internal static BoundExpression? NullableAlwaysHasValue(BoundExpression expression)
1100private BoundExpression RewriteNullableConversion(
1102BoundExpression rewrittenOperand,
1130BoundExpression rewrittenConversion = MakeConversionNode(syntax, rewrittenOperand, conversion.UnderlyingConversions[0], rewrittenType.GetNullableUnderlyingType(), @checked);
1142BoundExpression? value = NullableAlwaysHasValue(rewrittenOperand);
1156private BoundExpression RewriteLiftedConversionInExpressionTree(
1158BoundExpression rewrittenOperand,
1209private BoundExpression RewriteFullyLiftedBuiltInConversion(
1211BoundExpression operand,
1223BoundExpression? optimized = OptimizeLiftedBuiltInConversion(syntax, operand, conversion, @checked, type);
1242BoundExpression condition = MakeNullableHasValue(syntax, boundTemp);
1244BoundExpression consequence = new BoundObjectCreationExpression(
1253BoundExpression alternative = new BoundDefaultExpression(syntax, type);
1254BoundExpression conditionalExpression = RewriteConditionalOperator(
1266sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
1271private BoundExpression? OptimizeLiftedUserDefinedConversion(
1273BoundExpression operand,
1287BoundExpression? nonNullValue = NullableAlwaysHasValue(operand);
1303private BoundExpression? OptimizeLiftedBuiltInConversion(
1305BoundExpression operand,
1324BoundExpression? nonNullValue = NullableAlwaysHasValue(operand);
1343private BoundExpression? DistributeLiftedConversionIntoLiftedOperand(
1345BoundExpression operand,
1405private BoundExpression RewriteUserDefinedConversion(
1407BoundExpression rewrittenOperand,
1439BoundExpression result = BoundCall.Synthesized(
1449private BoundExpression MakeLiftedUserDefinedConversionConsequence(BoundCall call, TypeSymbol resultType)
1461private BoundExpression RewriteLiftedUserDefinedConversion(
1463BoundExpression rewrittenOperand,
1487BoundExpression? optimized = OptimizeLiftedUserDefinedConversion(syntax, rewrittenOperand, conversion, rewrittenType);
1510BoundExpression condition = _factory.MakeNullableHasValue(syntax, boundTemp);
1526BoundExpression consequence = MakeLiftedUserDefinedConversionConsequence(userDefinedCall, rewrittenType);
1529BoundExpression alternative = new BoundDefaultExpression(syntax, rewrittenType);
1532BoundExpression conditionalExpression = RewriteConditionalOperator(
1546sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
1551private BoundExpression RewriteUnionConversion(
1553BoundExpression rewrittenOperand,
1577private BoundExpression RewriteIntPtrConversion(
1579BoundExpression rewrittenOperand,
1624var rewrittenCall = MakeCall(
1793private BoundExpression RewriteDecimalConversion(SyntaxNode syntax, BoundExpression operand, TypeSymbol fromType, TypeSymbol toType, bool @checked, bool isImplicit, ConstantValue? constantValueOpt)
1824private BoundExpression RewriteDecimalConversionCore(SyntaxNode syntax, BoundExpression operand, TypeSymbol fromType, TypeSymbol toType, bool isImplicit, ConstantValue? constantValueOpt)
Lowering\LocalRewriter\LocalRewriter_DeconstructionAssignmentOperator.cs (51)
37private BoundExpression? RewriteDeconstruction(BoundTupleExpression left, Conversion conversion, BoundExpression right, bool isUsed)
40var lhsEffects = ArrayBuilder<BoundExpression>.GetInstance();
43BoundExpression? result = RewriteDeconstruction(lhsTargets, conversion, left.Type, right, isUsed);
55private BoundExpression? RewriteDeconstruction(
59BoundExpression right,
79BoundExpression? returnValue = ApplyDeconstructionConversion(lhsTargets, right, conversion, temps, effects, isUsed, inInit: true);
88var last = effects.PopLast();
210private BoundExpression? ApplyDeconstructionConversion(
212BoundExpression right,
220ImmutableArray<BoundExpression> rightParts = GetRightParts(right, conversion, temps, effects, ref inInit);
222ImmutableArray<(BoundValuePlaceholder?, BoundExpression?)> deconstructConversionInfo = conversion.DeconstructConversionInfo;
226var builder = isUsed ? ArrayBuilder<BoundExpression>.GetInstance(leftTargets.Count) : null;
229BoundExpression? resultPart;
241var rightPart = rightParts[i];
246BoundExpression? leftTarget = leftTargets[i].Single;
277private ImmutableArray<BoundExpression> GetRightParts(BoundExpression right, Conversion conversion,
287BoundExpression evaluationResult = EvaluateSideEffectingArgumentToTemp(right,
334private ImmutableArray<BoundExpression> AccessTupleFields(BoundExpression expression, ArrayBuilder<LocalSymbol> temps,
335ArrayBuilder<BoundExpression> effects)
345BoundExpression tuple;
361var builder = ArrayBuilder<BoundExpression>.GetInstance(numElements);
364var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(tuple, expression.Syntax, fields[i]);
370private BoundExpression EvaluateConversionToTemp(BoundExpression expression, BoundValuePlaceholder placeholder, BoundExpression conversion,
371ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> effects)
381private ImmutableArray<BoundExpression> InvokeDeconstructMethod(DeconstructMethodInfo deconstruction, BoundExpression target,
382ArrayBuilder<BoundExpression> effects, ArrayBuilder<LocalSymbol> temps)
387var outLocals = ArrayBuilder<BoundExpression>.GetInstance(outputPlaceholders.Length);
418private BoundExpression EvaluateSideEffectingArgumentToTemp(
419BoundExpression arg,
420ArrayBuilder<BoundExpression> effects,
423var loweredArg = VisitExpression(arg);
443private ArrayBuilder<Binder.DeconstructionVariable> GetAssignmentTargetsAndSideEffects(BoundTupleExpression variables, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> effects)
447foreach (var variable in variables.Arguments)
463var temp = this.TransformCompoundAssignmentLHS(variable,
475internal ArrayBuilder<BoundExpression> init = null!;
476internal ArrayBuilder<BoundExpression> deconstructions = null!;
477internal ArrayBuilder<BoundExpression> conversions = null!;
478internal ArrayBuilder<BoundExpression> assignments = null!;
483result.init = ArrayBuilder<BoundExpression>.GetInstance();
484result.deconstructions = ArrayBuilder<BoundExpression>.GetInstance();
485result.conversions = ArrayBuilder<BoundExpression>.GetInstance();
486result.assignments = ArrayBuilder<BoundExpression>.GetInstance();
502internal BoundExpression? PopLast()
509var last = init.Last();
515internal ImmutableArray<BoundExpression> ToImmutableAndFree()
Lowering\LocalRewriter\LocalRewriter_Event.cs (29)
21BoundExpression? rewrittenReceiverOpt = VisitExpression(node.ReceiverOpt);
22BoundExpression rewrittenArgument = VisitExpression(node.Argument);
54var rewrittenArguments = ImmutableArray.Create<BoundExpression>(rewrittenArgument);
87private BoundExpression RewriteWindowsRuntimeEventAssignmentOperator(SyntaxNode syntax, EventSymbol eventSymbol, EventAssignmentKind kind, BoundExpression? rewrittenReceiverOpt, BoundExpression rewrittenArgument)
104BoundExpression delegateCreationArgument = boundTemp ?? rewrittenReceiverOpt ?? _factory.Type(eventType);
114BoundExpression? clearCall = null;
124rewrittenArguments: ImmutableArray.Create<BoundExpression>(removeDelegate));
128clearCall = new BoundBadExpression(syntax, LookupResultKind.NotInvocable, ImmutableArray<Symbol?>.Empty, ImmutableArray.Create<BoundExpression>(removeDelegate), ErrorTypeSymbol.UnknownResultType);
132ImmutableArray<BoundExpression> marshalArguments;
137marshalArguments = ImmutableArray.Create<BoundExpression>(removeDelegate, rewrittenArgument);
152marshalArguments = ImmutableArray.Create<BoundExpression>(addDelegate, removeDelegate, rewrittenArgument);
155BoundExpression marshalCall;
183ArrayBuilder<BoundExpression> sideEffects = ArrayBuilder<BoundExpression>.GetInstance(2); //max size
191private BoundExpression VisitWindowsRuntimeEventFieldAssignmentOperator(SyntaxNode syntax, BoundEventAccess left, BoundExpression rewrittenRight)
199BoundExpression? rewrittenReceiverOpt = VisitExpression(left.ReceiverOpt);
215BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
219private BoundExpression MakeEventAccess(
221BoundExpression? rewrittenReceiver,
248BoundExpression getOrCreateCall;
265getOrCreateCall = new BoundBadExpression(syntax, LookupResultKind.NotInvocable, ImmutableArray<Symbol?>.Empty, ImmutableArray.Create<BoundExpression>(fieldAccess), ErrorTypeSymbol.UnknownResultType);
290private BoundExpression RewriteNoPiaEventAssignmentOperator(BoundEventAssignmentOperator node, BoundExpression rewrittenReceiver, BoundExpression rewrittenArgument)
296BoundExpression? result = null;
322BoundExpression eventInfo = _factory.New(ctor, _factory.Typeof(node.Event.ContainingType, ctor.Parameters[0].Type), _factory.Literal(node.Event.MetadataName));
Lowering\LocalRewriter\LocalRewriter_FixedStatement.cs (29)
199BoundExpression? initializer = localDecl.InitializerOpt;
240BoundExpression initializerExpr = VisitExpression(fixedInitializer.Expression);
281var pointerValue = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, addr);
307BoundExpression initializerExpr = VisitExpression(fixedInitializer.Expression);
329BoundExpression callReceiver;
364var tempAssignment = factory.AssignmentExpression(
376var pointerValue = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, addr);
379BoundExpression pinAndGetPtr = factory.Sequence(
381sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
403sideEffects: ImmutableArray.Create<BoundExpression>(nullableTempAssignment),
443BoundExpression initializerExpr = VisitExpression(fixedInitializer.Expression);
464var addr = factory.Convert(
469var convertedStringTemp = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, addr);
474BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, factory.Local(localSymbol), BinaryOperatorKind.NotEqual);
475BoundExpression helperCall;
484helperCall = new BoundBadExpression(fixedInitializer.Syntax, LookupResultKind.NotInvocable, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, ErrorTypeSymbol.UnknownResultType);
487BoundExpression addition = factory.Binary(BinaryOperatorKind.PointerAndIntAddition, localType, factory.Local(localSymbol), helperCall);
512BoundExpression initializerExpr = VisitExpression(fixedInitializer.Expression);
525BoundExpression arrayTempInit = factory.AssignmentExpression(factory.Local(pinnedTemp), initializerExpr);
528BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, arrayTempInit, BinaryOperatorKind.NotEqual);
530BoundExpression lengthCall;
545lengthCall = new BoundBadExpression(fixedInitializer.Syntax, LookupResultKind.NotInvocable, ImmutableArray<Symbol?>.Empty, ImmutableArray.Create<BoundExpression>(factory.Local(pinnedTemp)), ErrorTypeSymbol.UnknownResultType);
551BoundExpression lengthCheck = factory.Binary(BinaryOperatorKind.IntNotEqual, factory.SpecialType(SpecialType.System_Boolean), lengthCall, factory.Literal(0));
554BoundExpression condition = factory.Binary(BinaryOperatorKind.LogicalBoolAnd, factory.SpecialType(SpecialType.System_Boolean), notNullCheck, lengthCheck);
557BoundExpression firstElement = factory.ArrayAccessFirstElement(factory.Local(pinnedTemp));
561BoundExpression firstElementAddress = new BoundAddressOfOperator(factory.Syntax, firstElement, type: new PointerTypeSymbol(arrayElementType));
562BoundExpression convertedFirstElementAddress = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, firstElementAddress);
565BoundExpression consequenceAssignment = factory.AssignmentExpression(factory.Local(localSymbol), convertedFirstElementAddress);
568BoundExpression alternativeAssignment = factory.AssignmentExpression(factory.Local(localSymbol), factory.Null(localType));
Lowering\LocalRewriter\LocalRewriter_ForEachStatement.cs (52)
42BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
145BoundExpression? elementConversion,
155BoundExpression rewrittenExpression = VisitExpression(convertedCollection.Operand);
166var receiver = ConvertReceiverForInvocation(forEachSyntax, rewrittenExpression, getEnumeratorInfo.Method, convertedCollection.Conversion, enumeratorInfo.CollectionType);
167BoundExpression? firstRewrittenArgument = null;
173var builder = ArrayBuilder<BoundExpression>.GetInstance(getEnumeratorInfo.Arguments.Length);
187BoundExpression enumeratorVarInitValue = MakeCall(getEnumeratorInfo, forEachSyntax, receiver,
196BoundExpression iterationVarAssignValue = ApplyConversionIfNotIdentity(
221BoundExpression rewrittenCondition = MakeCall(
367BoundExpression receiver;
368BoundExpression disposeCall;
444BoundExpression disposableVarInitValue = new BoundAsOperator(forEachSyntax,
455BoundExpression disposeCall = BoundCall.Synthesized(syntax: forEachSyntax, receiverOpt: boundDisposableVar, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, method: disposeMethod);
485private BoundStatement WrapWithAwait(SyntaxNode forEachSyntax, BoundExpression disposeCall, BoundAwaitableInfo disposeAwaitableInfoOpt)
489var awaitExpr = RewriteAwaitExpression(forEachSyntax, disposeCall, disposeAwaitableInfoOpt, awaitExpressionType, debugInfo, used: false);
505private BoundExpression ConvertReceiverForInvocation(CSharpSyntaxNode syntax, BoundExpression receiver, MethodSymbol method, Conversion receiverConversion, TypeSymbol convertedReceiverType)
569BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
598BoundExpression collectionExpression,
601BoundExpression? elementConversion,
614BoundExpression rewrittenExpression = VisitExpression(collectionExpression);
648BoundExpression iterationVarInitValue = ApplyConversionIfNotIdentity(
662BoundExpression arrayLength = getLength(this, forEachSyntax, boundArrayVar, arg);
665BoundExpression exitCondition = new BoundBinaryOperator(
706private delegate BoundStatement? GetForEachStatementAsForPreamble(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind);
707private delegate BoundExpression GetForEachStatementAsForItem<TArg>(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, BoundLocal boundArrayVar, BoundLocal boundPositionVar, TArg arg);
708private delegate BoundExpression GetForEachStatementAsForLength<TArg>(LocalRewriter rewriter, SyntaxNode syntax, BoundLocal boundArrayVar, TArg arg);
745return static (LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind) =>
796BoundExpression arrayLength = rewriter._factory.Literal(length);
812BoundExpression iterationVarValue)
828BoundExpression loweredAssignment = VisitExpression(assignment);
875BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
895BoundExpression collectionExpression,
897BoundExpression? elementConversion,
909BoundExpression rewrittenExpression = VisitExpression(collectionExpression);
937BoundExpression iterationVarInitValue = ApplyConversionIfNotIdentity(
943indices: ImmutableArray.Create<BoundExpression>(boundPositionVar),
955BoundExpression arrayLength = new BoundArrayLength(
961BoundExpression exitCondition = new BoundBinaryOperator(
1024BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
1044BoundExpression collectionExpression,
1046BoundExpression? elementConversion,
1069BoundExpression rewrittenExpression = VisitExpression(collectionExpression);
1095ImmutableArray<BoundExpression> dimensionArgument = ImmutableArray.Create(
1101BoundExpression currentDimensionUpperBound = BoundCall.Synthesized(forEachSyntax, boundArrayVar, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getUpperBoundMethod, dimensionArgument);
1117BoundExpression iterationVarInitValue = ApplyConversionIfNotIdentity(
1122indices: ImmutableArray.Create((BoundExpression[])boundPositionVar),
1149ImmutableArray<BoundExpression> dimensionArgument = ImmutableArray.Create(
1155BoundExpression currentDimensionLowerBound = BoundCall.Synthesized(forEachSyntax, boundArrayVar, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getLowerBoundMethod, dimensionArgument);
1165BoundExpression exitCondition = new BoundBinaryOperator(
1224private static BoundExpression GetUnconvertedCollectionExpression(BoundForEachStatement node, out Conversion collectionConversion)
1239private BoundStatement MakeLocalDeclaration(CSharpSyntaxNode syntax, LocalSymbol local, BoundExpression rewrittenInitialValue)
Lowering\LocalRewriter\LocalRewriter_Index.cs (12)
18BoundExpression fromEnd = MakeLiteral(node.Syntax, ConstantValue.Create(true), booleanType);
20BoundExpression operand = VisitExpression(node.Operand);
34ArrayBuilder<BoundExpression> sideeffects = ArrayBuilder<BoundExpression>.GetInstance();
39BoundExpression condition = MakeOptimizedHasValue(operand.Syntax, operand);
42BoundExpression boundOperandGetValueOrDefault = MakeOptimizedGetValueOrDefault(operand.Syntax, operand);
43BoundExpression indexCreation = new BoundObjectCreationExpression(node.Syntax, node.MethodOpt, boundOperandGetValueOrDefault, fromEnd);
46BoundExpression consequence = ConvertToNullable(node.Syntax, node.Type, indexCreation);
49BoundExpression alternative = new BoundDefaultExpression(node.Syntax, node.Type);
52BoundExpression conditionalExpression = RewriteConditionalOperator(
69private BoundExpression ConvertToNullable(SyntaxNode syntax, TypeSymbol targetNullableType, BoundExpression underlyingValue)
Lowering\LocalRewriter\LocalRewriter_IndexerAccess.cs (87)
17private BoundExpression MakeDynamicIndexerAccessReceiver(BoundDynamicIndexerAccess indexerAccess, BoundExpression loweredReceiver)
19BoundExpression result;
42var loweredReceiver = VisitExpression(node.Receiver);
50private BoundExpression MakeDynamicGetIndex(
52BoundExpression loweredReceiver,
53ImmutableArray<BoundExpression> loweredArguments,
77private BoundExpression VisitIndexerAccess(BoundIndexerAccess node, bool isLeftOfAssignment)
85BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
102private BoundExpression MakeIndexerAccess(
104BoundExpression rewrittenReceiver,
106ImmutableArray<BoundExpression> arguments,
112BoundExpression oldNode,
164ArrayBuilder<BoundExpression>? storesOpt = null;
176storesOpt = ArrayBuilder<BoundExpression>.GetInstance();
180BoundExpression? rewrittenReceiverBeforePossibleCapture = rewrittenReceiver;
182ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
217BoundExpression call = MakePropertyGetAccess(syntax, rewrittenReceiver, indexer, rewrittenArguments, argumentRefKindsOpt, getMethod);
246var rewrittenReceiver = VisitExpression(node.Expression);
258BoundExpression result;
271BoundExpression makeOffsetInput = DetermineMakePatternIndexOffsetExpressionStrategy(node.Argument, out PatternIndexOffsetLoweringStrategy strategy);
272BoundExpression integerArgument = makePatternIndexOffsetExpression(makeOffsetInput, length, strategy);
287BoundExpression? startMakeOffsetInput, endMakeOffsetInput, rewrittenRangeArg;
295BoundExpression startExpr = makePatternIndexOffsetExpression(startMakeOffsetInput, length, startStrategy);
310var sideEffectsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
312BoundExpression startExpr;
313BoundExpression rangeSizeExpr;
317BoundExpression endExpr = makePatternIndexOffsetExpression(endMakeOffsetInput, length, endStrategy);
326BoundExpression possiblyRefCapturedReceiver = rewrittenReceiver;
356ImmutableArray.Create((BoundExpression)receiverStore),
362static bool isInt32ConstantZero(BoundExpression expr)
367BoundExpression makePatternIndexOffsetExpression(BoundExpression? makeOffsetInput, int length, PatternIndexOffsetLoweringStrategy strategy)
369BoundExpression integerArgument;
401BoundExpression getElementRef(BoundInlineArrayAccess node, BoundExpression rewrittenReceiver, BoundExpression index, MethodSymbol getItemOrSliceHelper, int length)
496private BoundExpression VisitImplicitIndexerAccess(BoundImplicitIndexerAccess node, bool isLeftOfAssignment)
517private BoundExpression VisitIndexPatternIndexerAccess(BoundImplicitIndexerAccess node, bool isLeftOfAssignment)
520var sideeffects = ArrayBuilder<BoundExpression>.GetInstance(2);
522BoundExpression rewrittenIndexerAccess = GetUnderlyingIndexerOrSliceAccess(
534private BoundExpression GetUnderlyingIndexerOrSliceAccess(
539ArrayBuilder<BoundExpression> sideeffects,
551BoundExpression makeOffsetInput = DetermineMakePatternIndexOffsetExpressionStrategy(node.Argument, out PatternIndexOffsetLoweringStrategy strategy);
553var receiver = VisitExpression(node.Receiver);
594BoundExpression integerArgument;
599BoundExpression lengthAccess = VisitExpression(node.LengthOrCountAccess);
628BoundExpression rewrittenIndexerAccess;
640ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
686rewrittenIndexerAccess = (BoundExpression)VisitArrayAccess((BoundArrayAccess)node.IndexerOrSliceAccess);
706private BoundExpression MakePatternIndexOffsetExpression(
707BoundExpression? loweredExpr,
708BoundExpression? lengthAccess,
769private BoundExpression DetermineMakePatternIndexOffsetExpressionStrategy(
770BoundExpression unloweredExpr,
819private BoundExpression VisitRangePatternIndexerAccess(BoundImplicitIndexerAccess node)
823var sideEffectsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
825var rewrittenIndexerAccess = VisitRangePatternIndexerAccess(node, localsBuilder, sideEffectsBuilder, cacheAllArgumentsOnly: false);
833private BoundExpression VisitRangePatternIndexerAccess(BoundImplicitIndexerAccess node, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder, bool cacheAllArgumentsOnly)
853var receiver = VisitExpression(node.Receiver);
854var rangeArg = node.Argument;
857BoundExpression? startMakeOffsetInput, endMakeOffsetInput, rewrittenRangeArg;
879var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(2);
915BoundExpression startExpr;
916BoundExpression rangeSizeExpr;
920BoundExpression? lengthAccess = null;
1039BoundExpression endExpr = MakePatternIndexOffsetExpression(endMakeOffsetInput, lengthAccess, endStrategy);
1065var rewrittenIndexerAccess = VisitExpression(sliceCall);
1073void storeExpressionIfNotConstant([DisallowNull] ref BoundExpression? expression, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder)
1148private BoundExpression MakeRangeSize(ref BoundExpression startExpr, BoundExpression endExpr, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder)
1152BoundExpression rangeSizeExpr;
1179private void DeconstructRange(BoundExpression rewrittenRangeArg, BoundExpression lengthAccess, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder, out BoundExpression startExpr, out BoundExpression rangeSizeExpr)
1220private void RewriteRangeParts(BoundExpression rangeArg, out BoundRangeExpression? rangeExpr, out BoundExpression? startMakeOffsetInput, out PatternIndexOffsetLoweringStrategy startStrategy, out BoundExpression? endMakeOffsetInput, out PatternIndexOffsetLoweringStrategy endStrategy, out BoundExpression? rewrittenRangeArg)
1243if (rangeExpr.LeftOperandOpt is BoundExpression left)
1253if (rangeExpr.RightOperandOpt is BoundExpression right)
Lowering\LocalRewriter\LocalRewriter_NullCoalescingAssignmentOperator.cs (13)
19var stores = ArrayBuilder<BoundExpression>.GetInstance();
23BoundExpression transformedLHS = TransformCompoundAssignmentLHS(node.LeftOperand, stores, temps, node.LeftOperand.HasDynamicType());
25var lhsRead = MakeRValue(transformedLHS);
26BoundExpression loweredRight = VisitExpression(node.RightOperand);
32BoundExpression rewriteNullCoalscingAssignmentStandard()
42BoundExpression assignment;
59BoundExpression conditionalExpression = MakeNullCoalescingOperator(syntax, lhsRead, assignment, leftPlaceholder: leftPlaceholder, leftConversion: leftPlaceholder, BoundNullCoalescingOperatorResultKind.LeftType, node.LeftOperand.Type);
74BoundExpression rewriteNullCoalescingAssignmentForValueType()
83var leftOperand = node.LeftOperand;
123var tmpAssignment = MakeAssignmentOperator(node.Syntax, tmp, loweredRight, used: true, isChecked: false, AssignmentKind.SimpleAssignment);
129var transformedLhsAssignment =
142var alternative = _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, ImmutableArray.Create(tmpAssignment, transformedLhsAssignment), tmp);
145var ternary = _factory.Conditional(lhsReadHasValue, tmp, alternative, tmp.Type);
Lowering\LocalRewriter\LocalRewriter_NullCoalescingOperator.cs (19)
15BoundExpression rewrittenLeft = VisitExpression(node.LeftOperand);
16BoundExpression rewrittenRight = VisitExpression(node.RightOperand);
22private BoundExpression MakeNullCoalescingOperator(
24BoundExpression rewrittenLeft,
25BoundExpression rewrittenRight,
27BoundExpression? leftConversion,
105var notNullAccess = NullableAlwaysHasValue(conditionalAccess.WhenNotNull);
108BoundExpression? whenNullOpt = rewrittenRight;
136var unwrappedRight = RemoveIdentityConversions(rewrittenRight);
163BoundExpression nullCheck = _factory.MakeNullCheck(syntax, boundTemp, BinaryOperatorKind.NotEqual);
166BoundExpression convertedLeft = GetConvertedLeftForNullCoalescingOperator(boundTemp, leftPlaceholder, leftConversion, rewrittenResultType);
170BoundExpression conditionalExpression = RewriteConditionalOperator(
185sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
190private bool IsStringConcat(BoundExpression expression)
219private static BoundExpression RemoveIdentityConversions(BoundExpression expression)
235private BoundExpression GetConvertedLeftForNullCoalescingOperator(BoundExpression rewrittenLeft, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, TypeSymbol rewrittenResultType)
Lowering\LocalRewriter\LocalRewriter_ObjectCreationExpression.cs (35)
21var constructorInvocation = _dynamicFactory.MakeDynamicConstructorInvocation(node.Syntax, node.Type, loweredArguments, node.ArgumentNamesOpt, node.ArgumentRefKindsOpt).ToExpression();
41BoundExpression? receiverDiscard = null;
45ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
67BoundExpression rewrittenObjectCreation;
90BoundExpression? receiver = null;
107ImmutableArray<BoundExpression>.Empty,
134BoundExpression receiver = withExpr.Receiver;
160BoundExpression rewrittenReceiver = VisitExpression(receiver);
165var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
171BoundExpression value = _factory.New(anonymousType, getAnonymousTypeValues(withExpr, oldValue, anonymousType, sideEffects, temps));
176BoundExpression expression;
204ImmutableArray<BoundExpression> getAnonymousTypeValues(BoundWithExpression withExpr, BoundExpression oldValue, AnonymousTypeManager.AnonymousTypePublicSymbol anonymousType,
205ArrayBuilder<BoundExpression> sideEffects, ArrayBuilder<LocalSymbol> temps)
208var valueTemps = ArrayBuilder<BoundExpression?>.GetInstance(anonymousType.Properties.Length, fillWithValue: null);
210foreach (BoundExpression initializer in withExpr.InitializerExpression.Initializers)
217var rewrittenRight = VisitExpression(assignment.Right);
227var builder = ArrayBuilder<BoundExpression>.GetInstance(anonymousType.Properties.Length);
230if (valueTemps[property.MemberIndexOpt!.Value] is BoundExpression initializerValue)
260private BoundExpression MakeExpressionWithInitializer(
262BoundExpression rewrittenExpression,
263BoundExpression initializerExpression,
274ArrayBuilder<BoundExpression>? dynamicSiteInitializers = null;
276ArrayBuilder<BoundExpression>? loweredInitializers = ArrayBuilder<BoundExpression>.GetInstance();
281var sideEffects = ArrayBuilder<BoundExpression>.GetInstance(1 + dynamicSiteCount + loweredInitializers.Count);
319var rewrittenNewT = MakeNewT(node.Syntax, (TypeParameterSymbol)node.Type);
328private BoundExpression MakeNewT(SyntaxNode syntax, TypeParameterSymbol typeParameter)
355ImmutableArray<BoundExpression>.Empty,
385BoundExpression newGuid;
394newGuid = new BoundBadExpression(node.Syntax, LookupResultKind.NotCreatable, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, ErrorTypeSymbol.UnknownResultType);
404BoundExpression callGetTypeFromCLSID;
412callGetTypeFromCLSID = new BoundBadExpression(node.Syntax, LookupResultKind.OverloadResolutionFailure, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, ErrorTypeSymbol.UnknownResultType);
416BoundExpression rewrittenObjectCreation;
428rewrittenObjectCreation = new BoundBadExpression(node.Syntax, LookupResultKind.OverloadResolutionFailure, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, node.Type);
Lowering\LocalRewriter\LocalRewriter_ObjectOrCollectionInitializerExpression.cs (68)
18private static BoundObjectInitializerExpressionBase UpdateInitializers(BoundObjectInitializerExpressionBase initializerExpression, ImmutableArray<BoundExpression> newInitializers)
32ref ArrayBuilder<BoundExpression>? dynamicSiteInitializers,
34ArrayBuilder<BoundExpression> result,
35BoundExpression rewrittenReceiver,
36BoundExpression initializerExpression)
66private ImmutableArray<BoundExpression> MakeObjectOrCollectionInitializersForExpressionTree(BoundExpression initializerExpression)
76var result = ArrayBuilder<BoundExpression>.GetInstance();
84void addCollectionInitializersForExpressionTree(ArrayBuilder<BoundExpression> result, ImmutableArray<BoundExpression> initializers)
86foreach (var initializer in initializers)
127private void AddCollectionInitializers(ArrayBuilder<BoundExpression> result, BoundExpression rewrittenReceiver, ImmutableArray<BoundExpression> initializers)
131foreach (var initializer in initializers)
136BoundExpression? rewrittenInitializer;
157private BoundExpression MakeDynamicCollectionInitializer(BoundExpression rewrittenReceiver, BoundDynamicCollectionElementInitializer initializer)
179private BoundExpression? MakeCollectionInitializer(BoundCollectionElementInitializer initializer)
200BoundExpression? rewrittenReceiver = VisitExpression(initializer.ImplicitReceiverOpt);
215ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
245private BoundExpression VisitObjectInitializerMember(BoundObjectInitializerMember node, ref BoundExpression rewrittenReceiver, ArrayBuilder<BoundExpression> sideEffects, ref ArrayBuilder<LocalSymbol>? temps)
249return (BoundExpression)base.VisitObjectInitializerMember(node)!;
252var originalReceiver = rewrittenReceiver;
283ref ArrayBuilder<BoundExpression>? dynamicSiteInitializers,
285ArrayBuilder<BoundExpression> result,
286BoundExpression rewrittenReceiver,
287ImmutableArray<BoundExpression> initializers)
291foreach (var initializer in initializers)
303ref ArrayBuilder<BoundExpression>? dynamicSiteInitializers,
305ArrayBuilder<BoundExpression> result,
306BoundExpression rewrittenReceiver,
312BoundExpression left = assignment.Left;
313BoundExpression right = assignment.Right;
324BoundExpression rewrittenAccess;
364dynamicSiteInitializers = ArrayBuilder<BoundExpression>.GetInstance();
369var rewrittenRight = VisitExpression(right);
399var rewrittenRight = VisitExpression(right);
414dynamicSiteInitializers = ArrayBuilder<BoundExpression>.GetInstance();
419var rewrittenRight = VisitExpression(right);
453var rangeArgument = getSubArrayCall.Arguments[1];
471var rewrittenRight = VisitExpression(right);
483var rewrittenIndex = VisitExpression(pointerAccess.Index);
504var rewrittenRight = VisitExpression(right);
538var rewrittenRight = VisitExpression(right);
568void addIndexes(ArrayBuilder<BoundExpression> result, BoundAssignmentOperator assignment)
571var lhs = assignment.Left;
574foreach (var argument in initializerMember.Arguments)
579foreach (var element in initializers.Initializers)
596foreach (var index in arrayAccess.Indices)
613foreach (var initializer in ((BoundObjectInitializerExpression)assignment.Right).Initializers)
620private ImmutableArray<BoundExpression> EvaluateSideEffectingArgumentsToTemps(
621ImmutableArray<BoundExpression> args,
623ArrayBuilder<BoundExpression> sideeffects,
626ArrayBuilder<BoundExpression>? newArgs = null;
630var arg = args[i];
632BoundExpression replacement;
638(LocalRewriter rewriter, ArrayBuilder<BoundExpression> sideeffects, ArrayBuilder<LocalSymbol>? temps) elementArg = (rewriter: this, sideeffects, temps);
641static (BoundExpression element, ref (LocalRewriter rewriter, ArrayBuilder<BoundExpression> sideeffects, ArrayBuilder<LocalSymbol>? temps) elementArg) =>
655newArgs = ArrayBuilder<BoundExpression>.GetInstance(args.Length);
670private BoundExpression EvaluateSideEffects(BoundExpression arg, RefKind refKind, ArrayBuilder<BoundExpression> sideeffects, ref ArrayBuilder<LocalSymbol>? temps)
690private BoundExpression MakeObjectInitializerMemberAccess(
691BoundExpression rewrittenReceiver,
Lowering\LocalRewriter\LocalRewriter_PropertyAccess.cs (10)
20private BoundExpression VisitPropertyAccess(BoundPropertyAccess node, bool isLeftOfAssignment)
22var rewrittenReceiverOpt = VisitExpression(node.ReceiverOpt);
26private BoundExpression MakePropertyAccess(
28BoundExpression? rewrittenReceiverOpt,
68private BoundExpression MakePropertyGetAccess(SyntaxNode syntax, BoundExpression? rewrittenReceiver, PropertySymbol property, BoundPropertyAccess? oldNodeOpt)
70return MakePropertyGetAccess(syntax, rewrittenReceiver, property, ImmutableArray<BoundExpression>.Empty, default, null, oldNodeOpt);
73private BoundExpression MakePropertyGetAccess(
75BoundExpression? rewrittenReceiver,
77ImmutableArray<BoundExpression> rewrittenArguments,
Lowering\LocalRewriter\LocalRewriter_Range.cs (25)
24var left = node.LeftOperandOpt;
30var right = node.RightOperandOpt;
42BoundExpression rangeCreation = MakeRangeExpression(node.MethodOpt, left, right);
52BoundExpression tryOptimizeOperand(BoundExpression operand)
77private BoundExpression LiftRangeExpression(BoundRangeExpression node, BoundExpression? left, BoundExpression? right)
84var sideeffects = ArrayBuilder<BoundExpression>.GetInstance();
88BoundExpression? condition = null;
91var rangeExpr = MakeRangeExpression(node.MethodOpt, left, right);
101BoundExpression consequence = new BoundObjectCreationExpression(node.Syntax, nullableCtor, rangeExpr);
104BoundExpression alternative = new BoundDefaultExpression(node.Syntax, node.Type);
109BoundExpression conditionalExpression = RewriteConditionalOperator(
125BoundExpression? getIndexFromPossibleNullable(BoundExpression? arg)
130BoundExpression tempOperand = CaptureExpressionInTempIfNeeded(arg, sideeffects, locals);
135BoundExpression operandHasValue = MakeOptimizedHasValue(tempOperand.Syntax, tempOperand);
156private BoundExpression MakeRangeExpression(
158BoundExpression? left,
159BoundExpression? right)
185var arg = left ?? right;
195return F.StaticCall(constructionMethod, ImmutableArray<BoundExpression>.Empty);
201BoundExpression newIndexZero(bool fromEnd) =>
205ImmutableArray.Create<BoundExpression>(F.Literal(0), F.Literal(fromEnd)));
Lowering\LocalRewriter\LocalRewriter_StackAlloc.cs (12)
27var rewrittenCount = VisitExpression(stackAllocNode.Count);
47var stackSize = RewriteStackAllocCountToSize(rewrittenCount, elementType);
53var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
55var countTemp = CaptureExpressionInTempIfNeeded(rewrittenCount, sideEffects, locals, SynthesizedLocalKind.Spill);
56var stackSize = RewriteStackAllocCountToSize(countTemp, elementType);
60BoundExpression constructorCall;
71childBoundNodes: ImmutableArray<BoundExpression>.Empty,
97private BoundExpression RewriteStackAllocCountToSize(BoundExpression countExpression, TypeSymbol elementType)
117BoundExpression sizeOfExpression = _factory.Sizeof(elementType);
139BoundExpression convertedCount = _factory.Convert(uintType, countExpression, Conversion.ExplicitNumeric);
149BoundExpression product = _factory.Binary(multiplicationKind, uintPtrType, convertedCount, sizeOfExpression);
Lowering\LocalRewriter\LocalRewriter_StringConcat.cs (42)
23private BoundExpression VisitCompoundAssignmentStringConcatenation(BoundExpression left, BoundExpression unvisitedRight, BinaryOperatorKind operatorKind, SyntaxNode syntax)
28ArrayBuilder<BoundExpression> arguments;
36arguments = ArrayBuilder<BoundExpression>.GetInstance();
46private BoundExpression VisitStringConcatenation(BoundBinaryOperator originalOperator)
72private BoundExpression CreateStringConcat(SyntaxNode originalSyntax, ArrayBuilder<BoundExpression> visitedArguments)
105foreach (var arg in visitedArguments)
139var arg = ConvertConcatExprToString(visitedArguments[0]);
190var array = _factory.ArrayOrEmpty(_factory.SpecialType(SpecialType.System_String), finalArguments);
205/// <see cref="CreateStringConcat(SyntaxNode, ArrayBuilder{BoundExpression})"/> and performs any optimizations on the arguments that can be done. This
208private void CollectAndVisitConcatArguments(BoundBinaryOperator originalOperator, BoundExpression? visitedCompoundAssignmentLeftRead, out ArrayBuilder<BoundExpression> destinationArguments)
211destinationArguments = ArrayBuilder<BoundExpression>.GetInstance();
222var followingArgument = destinationArguments.Count > 0 ? destinationArguments[^1] : null;
234static void pushArguments(LocalRewriter self, BoundBinaryOperator binaryOperator, ArrayBuilder<BoundExpression> arguments, ref WellKnownConcatRelatedMethods concatMethods)
258static bool shouldRecurse(BoundExpression expr, [NotNullWhen(true)] out BoundBinaryOperator? binaryOperator)
287private (BoundExpression? singleConcatArgument, ImmutableArray<BoundExpression> nestedConcatArguments) SimplifyConcatArgument(BoundExpression argument, [NotNullIfNotNull(nameof(followingArgument))] ref BoundExpression? followingArgument, ref WellKnownConcatRelatedMethods wellKnownConcatOptimizationMethods)
299else if (wellKnownConcatOptimizationMethods.IsCharToString(call, out var charExpression))
355private void VisitAndAddConcatArgumentInReverseOrder(BoundExpression argument, bool argumentAlreadyVisited, ArrayBuilder<BoundExpression> finalArguments, ref WellKnownConcatRelatedMethods wellKnownConcatOptimizationMethods)
363var followingArgument = finalArguments.Count > 0 ? finalArguments[^1] : null;
413public bool IsWellKnownConcatMethod(BoundCall call, out ImmutableArray<BoundExpression> arguments)
441public bool IsCharToString(BoundCall call, [NotNullWhen(true)] out BoundExpression? charExpression)
463private readonly bool IsConcatNonArray(BoundCall call, ref MethodSymbol? concatMethod, SpecialMember concatSpecialMember, out ImmutableArray<BoundExpression> arguments)
508private static BoundExpression RewriteStringConcatenationWithSpanBasedConcat(
514ArrayBuilder<BoundExpression> args)
520BoundExpression? arg = args[i];
563var sequence = factory.Sequence(
576private BoundExpression RewriteStringConcatInExpressionLambda(BoundBinaryOperator original)
597BoundExpression currentResult = VisitExpression(stack.Peek().Left);
601var right = VisitExpression(current.Right);
621private BoundExpression ConvertConcatExprToString(BoundExpression expr)
734ImmutableArray.Create<BoundExpression>(store),
738BoundExpression makeConditionalAccess(BoundExpression receiver)
757static bool isFieldOfMarshalByRef(BoundExpression expr, CSharpCompilation compilation)
Lowering\LocalRewriter\LocalRewriter_StringInterpolation.cs (22)
16private BoundExpression RewriteInterpolatedStringConversion(BoundConversion conversion)
29private InterpolationHandlerResult RewriteToInterpolatedStringHandlerPattern(InterpolatedStringHandlerData data, ImmutableArray<BoundExpression> parts, SyntaxNode syntax)
65var handlerConstructionAssignment = _factory.AssignmentExpression(builderTemp, (BoundExpression)VisitObjectCreationExpression(construction));
69var resultExpressions = ArrayBuilder<BoundExpression>.GetInstance(parts.Length + 1);
71foreach (var part in parts)
76resultExpressions.Add((BoundExpression)VisitCall(call));
100BoundExpression? currentExpression = appendShouldProceedLocal;
104foreach (var appendCall in resultExpressions)
106var actualCall = appendCall;
165BoundExpression? result = null;
168var part = node.Parts[i];
219private BoundExpression LowerPartsToString(InterpolatedStringHandlerData data, ImmutableArray<BoundExpression> parts, SyntaxNode syntax, TypeSymbol type)
226BoundExpression toStringAndClearCall = toStringAndClear is not null
228: new BoundBadExpression(syntax, LookupResultKind.Empty, symbols: ImmutableArray<Symbol?>.Empty, childBoundNodes: ImmutableArray<BoundExpression>.Empty, type);
234private static void AssertNoImplicitInterpolatedStringHandlerConversions(ImmutableArray<BoundExpression> arguments, bool allowConversionsWithNoContext = false)
238foreach (var arg in arguments)
258private readonly ImmutableArray<BoundExpression> _expressions;
273public InterpolationHandlerResult(ImmutableArray<BoundExpression> expressions, BoundLocal handlerTemp, LocalSymbol? outTemp, LocalRewriter rewriter)
282public BoundExpression WithFinalResult(BoundExpression result)
Lowering\LocalRewriter\LocalRewriter_TupleBinaryOperator.cs (75)
31var initEffects = ArrayBuilder<BoundExpression>.GetInstance();
34BoundExpression newLeft = ReplaceTerminalElementsWithTemps(node.Left, node.Operators, initEffects, temps);
35BoundExpression newRight = ReplaceTerminalElementsWithTemps(node.Right, node.Operators, initEffects, temps);
37var returnValue = RewriteTupleNestedOperators(node.Operators, newLeft, newRight, boolType, temps, node.OperatorKind);
38BoundExpression result = _factory.Sequence(temps.ToImmutableAndFree(), initEffects.ToImmutableAndFree(), returnValue);
42private bool IsLikeTupleExpression(BoundExpression expr, [NotNullWhen(true)] out BoundTupleExpression? tuple)
64var builder = ArrayBuilder<BoundExpression>.GetInstance(tuple.Arguments.Length);
67var element = tuple.Arguments[i];
99private BoundExpression PushDownImplicitTupleConversion(
100BoundExpression expr,
101ArrayBuilder<BoundExpression> initEffects,
113var fieldAccessorsBuilder = ArrayBuilder<BoundExpression>.GetInstance(numElements);
114var savedTuple = DeferSideEffectingArgumentToTempForTupleEquality(LowerConversions(boundConversion.Operand), initEffects, temps);
120var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(savedTuple, syntax, srcElementFields[i]);
141private BoundExpression ReplaceTerminalElementsWithTemps(
142BoundExpression expr,
144ArrayBuilder<BoundExpression> initEffects,
155var builder = ArrayBuilder<BoundExpression>.GetInstance(tuple.Arguments.Length);
158var argument = tuple.Arguments[i];
159var newArgument = ReplaceTerminalElementsWithTemps(argument, multiple.Operators[i], initEffects, temps);
180/// That resulting expression must be passed through <see cref="LowerConversions(BoundExpression)"/> to
183private BoundExpression DeferSideEffectingArgumentToTempForTupleEquality(
184BoundExpression expr,
185ArrayBuilder<BoundExpression> effects,
205var deferredOperand = DeferSideEffectingArgumentToTempForTupleEquality(conv.Operand, effects, temps, conv.ExplicitCastInCode || enclosingConversionWasExplicit);
212var deferredOperand = DeferSideEffectingArgumentToTempForTupleEquality(
250private BoundExpression RewriteTupleOperator(TupleBinaryOperatorInfo @operator,
251BoundExpression left, BoundExpression right, TypeSymbol boolType,
271private BoundExpression RewriteTupleNestedOperators(TupleBinaryOperatorInfo.Multiple operators, BoundExpression left, BoundExpression right,
293var outerEffects = ArrayBuilder<BoundExpression>.GetInstance();
294var innerEffects = ArrayBuilder<BoundExpression>.GetInstance();
296BoundExpression leftHasValue, leftValue;
300BoundExpression rightHasValue, rightValue;
307BoundExpression logicalExpression = RewriteNonNullableNestedTupleOperators(operators, leftValue, rightValue, boolType, temps, operatorKind);
313BoundExpression innerSequence = _factory.Sequence(locals: ImmutableArray<LocalSymbol>.Empty, innerEffects.ToImmutableAndFree(), logicalExpression);
343BoundExpression outerSequence =
358private void MakeNullableParts(BoundExpression expr, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> innerEffects,
359ArrayBuilder<BoundExpression> outerEffects, bool saveHasValue, out BoundExpression hasValue, out BoundExpression value, out bool isNullable)
381if (NullableAlwaysHasValue(expr) is BoundExpression knownValue)
400BoundExpression makeNullableHasValue(BoundExpression expr)
421private BoundLocal MakeTemp(BoundExpression loweredExpression, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> effects)
432private BoundExpression MakeValueOrDefaultTemp(
433BoundExpression expr,
435ArrayBuilder<BoundExpression> effects)
447var operand = MakeValueOrDefaultTemp(o, temps, effects);
454var argumentBuilder = ArrayBuilder<BoundExpression>.GetInstance(tupleCardinality);
472BoundExpression valueOrDefaultCall = MakeOptimizedGetValueOrDefault(expr.Syntax, expr);
477BoundExpression MakeBoundConversion(BoundExpression expr, Conversion conversion, TypeWithAnnotations type, BoundConversion enclosing)
489private BoundExpression RewriteNonNullableNestedTupleOperators(TupleBinaryOperatorInfo.Multiple operators,
490BoundExpression left, BoundExpression right, TypeSymbol type,
495BoundExpression? currentResult = null;
498BoundExpression leftElement = GetTuplePart(left, i);
499BoundExpression rightElement = GetTuplePart(right, i);
500BoundExpression nextLogicalOperand = RewriteTupleOperator(nestedOperators[i], leftElement, rightElement, type, temps, operatorKind);
520private BoundExpression GetTuplePart(BoundExpression tuple, int i)
546private BoundExpression RewriteTupleSingleOperator(TupleBinaryOperatorInfo.Single single,
547BoundExpression left, BoundExpression right, TypeSymbol boolType, BinaryOperatorKind operatorKind)
560BoundExpression dynamicResult = _dynamicFactory.MakeDynamicBinaryOperator(single.Kind, left, right, isCompoundAssignment: false, _compilation.DynamicType).ToExpression();
577BoundExpression binary = MakeBinaryOperator(_factory.Syntax, single.Kind, left, right, single.MethodSymbolOpt?.ReturnType ?? boolType, single.MethodSymbolOpt, single.ConstrainedToTypeOpt);
580BoundExpression result;
581BoundExpression convertedBinary = ApplyConversionIfNotIdentity(single.ConversionForBool, single.ConversionForBoolPlaceholder, binary);
611private BoundExpression LowerConversions(BoundExpression expr)
Lowering\LocalRewriter\LocalRewriter_TupleCreationExpression.cs (9)
27ImmutableArray<BoundExpression> rewrittenArguments = VisitList(node.Arguments);
37private BoundExpression RewriteTupleCreationExpression(BoundTupleExpression node, ImmutableArray<BoundExpression> rewrittenArguments)
43private BoundExpression MakeTupleCreationExpression(SyntaxNode syntax, NamedTypeSymbol type, ImmutableArray<BoundExpression> rewrittenArguments)
54ImmutableArray<BoundExpression> smallestCtorArguments = ImmutableArray.Create(rewrittenArguments,
69Binder.CheckRequiredMembersInObjectInitializer(smallestConstructor, initializers: ImmutableArray<BoundExpression>.Empty, syntax, _diagnostics);
83Binder.CheckRequiredMembersInObjectInitializer(tuple8Ctor, initializers: ImmutableArray<BoundExpression>.Empty, syntax, _diagnostics);
88ImmutableArray<BoundExpression> ctorArguments = ImmutableArray.Create(rewrittenArguments,
Lowering\LocalRewriter\LocalRewriter_UnaryOperator.cs (96)
59BoundExpression loweredOperand = VisitExpression(node.Operand);
63private BoundExpression MakeUnaryOperator(
68BoundExpression loweredOperand,
74private BoundExpression MakeUnaryOperator(
80BoundExpression loweredOperand,
140var newOperand = MakeConversionNode(loweredOperand, upconvertType, false);
179private BoundExpression LowerLiftedUnaryOperator(
184BoundExpression loweredOperand,
190BoundExpression? optimized = OptimizeLiftedUnaryOperator(kind, syntax, method, constrainedToTypeOpt, loweredOperand, type);
208BoundExpression condition = _factory.MakeNullableHasValue(syntax, boundTemp);
211BoundExpression call_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTemp, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefault);
214BoundExpression consequence = GetLiftedUnaryOperatorConsequence(kind, syntax, method, constrainedToTypeOpt, type, call_GetValueOrDefault);
217BoundExpression alternative = new BoundDefaultExpression(syntax, type);
222BoundExpression conditionalExpression = RewriteConditionalOperator(
238sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
243private BoundExpression? OptimizeLiftedUnaryOperator(
248BoundExpression loweredOperand,
260BoundExpression? neverNull = NullableAlwaysHasValue(loweredOperand);
276var result = LowerLiftedUnaryOperator(operatorKind, syntax, method, constrainedToTypeOpt, conditionalLeft!.WhenNotNull, type);
354private BoundExpression GetLiftedUnaryOperatorConsequence(UnaryOperatorKind kind, SyntaxNode syntax, MethodSymbol? method, TypeSymbol? constrainedToTypeOpt, TypeSymbol type, BoundExpression nonNullOperand)
359BoundExpression unliftedOp = MakeUnaryOperator(
369BoundExpression consequence = new BoundObjectCreationExpression(
393private BoundExpression VisitIncrementOperator(BoundIncrementOperator node, bool used)
405private BoundExpression VisitInstanceIncrementOperator(BoundIncrementOperator node, bool used)
456private BoundExpression MakeInstanceCompoundAssignmentOperatorResult(SyntaxNode syntax, BoundExpression left, BoundExpression? rightOpt, MethodSymbol operatorMethod, bool isChecked, AssignmentKind assignmentKind)
462ArrayBuilder<BoundExpression> tempInitializers = ArrayBuilder<BoundExpression>.GetInstance();
466BoundExpression transformedLHS = TransformCompoundAssignmentLHS(left, tempInitializers, tempSymbols, isDynamicAssignment: false);
482BoundExpression assignBack = makeAssignmentBack(syntax, transformedLHS, boundTemp, isChecked, assignmentKind);
498BoundExpression assignBack = makeAssignmentBack(syntax, transformedLHS, boundTemp, isChecked, assignmentKind);
501var isNotClass = _factory.IsNotNullReference(_factory.Default(operandType));
523static BoundCall makeIncrementCall(SyntaxNode syntax, BoundLocal boundTemp, BoundExpression? rightOpt, MethodSymbol operatorMethod)
528BoundExpression makeAssignmentBack(SyntaxNode syntax, BoundExpression transformedLHS, BoundLocal boundTemp, bool isChecked, AssignmentKind assignmentKind)
572public BoundExpression VisitBuiltInOrStaticIncrementOperator(BoundIncrementOperator node)
579ArrayBuilder<BoundExpression> tempInitializers = ArrayBuilder<BoundExpression>.GetInstance();
585BoundExpression transformedLHS = TransformCompoundAssignmentLHS(node.Operand, tempInitializers, tempSymbols, isDynamic);
594BoundExpression boundTemp = new BoundLocal(
602var newValue = makeBuiltInOrStaticIncrementOperator(node, rewrittenValueToIncrement: (isPrefix ? MakeRValue(transformedLHS) : boundTemp));
632static bool isIndirectOrInstanceField(BoundExpression expression)
650BoundExpression rewriteWithNotRefOperand(
654ArrayBuilder<BoundExpression> tempInitializers,
656BoundExpression transformedLHS,
657BoundExpression boundTemp,
658BoundExpression newValue)
689BoundExpression rewriteWithRefOperand(
693ArrayBuilder<BoundExpression> tempInitializers,
695BoundExpression operand,
696BoundExpression boundTemp,
697BoundExpression newValue)
701var tempValue = isPrefix ? newValue : MakeRValue(operand);
703var tempAssignment = MakeAssignmentOperator(syntax, boundTemp, tempValue, used: false, isChecked: isChecked, AssignmentKind.SimpleAssignment);
705var operandValue = isPrefix ? boundTemp : newValue;
709ImmutableArray.Create<BoundExpression>(tempAssignment),
715BoundExpression operandAssignment = MakeAssignmentOperator(syntax, operand, tempAssignedAndOperandValue, used: false, isChecked: isChecked, AssignmentKind.IncrementDecrement);
728BoundExpression makeBuiltInOrStaticIncrementOperator(BoundIncrementOperator node, BoundExpression rewrittenValueToIncrement)
735BoundExpression result;
754private BoundExpression ApplyConversionIfNotIdentity(BoundExpression? conversion, BoundValuePlaceholder? placeholder, BoundExpression replacement)
765static bool hasNonIdentityConversion([NotNullWhen(true)] BoundExpression? expression)
781private BoundExpression ApplyConversion(BoundExpression conversion, BoundValuePlaceholder placeholder, BoundExpression replacement)
789private BoundExpression MakeUserDefinedStaticIncrementOperator(BoundIncrementOperator node, BoundExpression rewrittenValueToIncrement)
806BoundExpression rewrittenArgument = ApplyConversionIfNotIdentity(node.OperandConversion, node.OperandPlaceholder, rewrittenValueToIncrement);
834BoundExpression condition = _factory.MakeNullableHasValue(node.Syntax, boundTemp);
837BoundExpression call_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTemp, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefault);
840BoundExpression userDefinedCall = BoundCall.Synthesized(
848BoundExpression consequence = new BoundObjectCreationExpression(syntax, ctor, userDefinedCall);
851BoundExpression alternative = new BoundDefaultExpression(syntax, type);
856BoundExpression conditionalExpression = RewriteConditionalOperator(
872sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
877private BoundExpression MakeBuiltInIncrementOperator(BoundIncrementOperator node, BoundExpression rewrittenValueToIncrement)
879BoundExpression result;
906BoundExpression boundOne = MakeLiteral(
919BoundExpression binaryOperand = rewrittenValueToIncrement;
945BoundExpression binOp;
983private BoundExpression MakeDecimalIncDecOperator(SyntaxNode syntax, BinaryOperatorKind oper, BoundExpression operand)
990private BoundExpression MakeLiftedDecimalIncDecOperator(SyntaxNode syntax, BinaryOperatorKind oper, BoundExpression operand)
1000BoundExpression condition = _factory.MakeNullableHasValue(syntax, operand);
1002BoundExpression getValueCall = BoundCall.Synthesized(syntax, operand, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefault);
1004BoundExpression methodCall = BoundCall.Synthesized(syntax, receiverOpt: null, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, method, getValueCall);
1006BoundExpression consequence = new BoundObjectCreationExpression(syntax, ctor, methodCall);
1008BoundExpression alternative = new BoundDefaultExpression(syntax, operand.Type);
1019private BoundExpression MakeRValue(BoundExpression transformedExpression)
Lowering\LocalRewriter\LoweredDynamicOperationFactory.cs (67)
74BoundExpression loweredOperand,
100var binderConstruction = MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__Convert, new[]
117BoundExpression loweredOperand,
133var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__UnaryOperation, new[]
153BoundExpression loweredLeft,
154BoundExpression loweredRight,
173var loweredArguments = ImmutableArray.Create<BoundExpression>(loweredLeft, loweredRight);
176var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__BinaryOperation, new[]
196BoundExpression loweredReceiver,
198ImmutableArray<BoundExpression> loweredArguments,
239var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__InvokeMember, new[]
264BoundExpression loweredReceiver,
265BoundExpression loweredHandler)
271var loweredArguments = ImmutableArray<BoundExpression>.Empty;
275var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__InvokeMember, new[]
297BoundExpression loweredReceiver,
298ImmutableArray<BoundExpression> loweredArguments,
318var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__Invoke, new[]
336ImmutableArray<BoundExpression> loweredArguments,
342var loweredReceiver = _factory.Typeof(type, _factory.WellKnownType(WellKnownType.System_Type));
345var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__InvokeConstructor, new[]
361BoundExpression loweredReceiver,
373var loweredArguments = ImmutableArray<BoundExpression>.Empty;
377var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__GetMember, new[]
396BoundExpression loweredReceiver,
398BoundExpression loweredRight,
415var loweredArguments = ImmutableArray<BoundExpression>.Empty;
418var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__SetMember, new[]
437BoundExpression loweredReceiver,
438ImmutableArray<BoundExpression> loweredArguments,
447var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__GetIndex, new[]
463BoundExpression loweredReceiver,
464ImmutableArray<BoundExpression> loweredArguments,
467BoundExpression loweredRight,
486var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__SetIndex, new[]
501internal LoweredDynamicOperation MakeDynamicIsEventTest(string name, BoundExpression loweredReceiver)
505var binderConstruction = MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__IsEvent, new[]
517return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, ImmutableArray<BoundExpression>.Empty, default(ImmutableArray<RefKind>), null, resultType);
525private BoundExpression? MakeBinderConstruction(WellKnownMember factoryMethod, BoundExpression[] args)
543internal RefKind GetReceiverRefKind(BoundExpression loweredReceiver)
559internal BoundExpression MakeCallSiteArgumentInfos(
561ImmutableArray<BoundExpression> loweredArguments,
564BoundExpression? loweredReceiver = null,
567BoundExpression? loweredRight = null)
574var infos = new BoundExpression[(loweredReceiver != null ? 1 : 0) + loweredArguments.Length + (loweredRight != null ? 1 : 0)];
600BoundExpression? binderConstruction,
601BoundExpression? loweredReceiver,
603ImmutableArray<BoundExpression> loweredArguments,
605BoundExpression? loweredRight,
650var nullCallSite = _factory.Null(callSiteField.Type);
652var siteInitialization = _factory.Conditional(
671private ImmutableArray<LocalSymbol> MakeTempsForDiscardArguments(ref ImmutableArray<BoundExpression> loweredArguments)
720BoundExpression? loweredReceiver,
722ImmutableArray<BoundExpression> loweredArguments,
724BoundExpression? loweredRight,
799private BoundExpression GetArgumentInfo(
801BoundExpression boundArgument,
874private static ImmutableArray<BoundExpression> GetCallSiteArguments(BoundExpression callSiteFieldAccess, BoundExpression? receiver, ImmutableArray<BoundExpression> arguments, BoundExpression? right)
876var result = new BoundExpression[1 + (receiver != null ? 1 : 0) + arguments.Length + (right != null ? 1 : 0)];
897private TypeSymbol[] MakeCallSiteDelegateSignature(TypeSymbol callSiteType, BoundExpression? receiver, ImmutableArray<BoundExpression> arguments, BoundExpression? right, TypeSymbol resultType)
Lowering\SpillSequenceSpiller.cs (76)
39public readonly BoundExpression Value;
44public BoundSpillSequenceBuilder(SyntaxNode syntax, BoundExpression value = null)
82internal BoundSpillSequenceBuilder Update(BoundExpression value)
158internal void AddExpressions(ImmutableArray<BoundExpression> expressions)
160foreach (var expression in expressions)
244private BoundExpression VisitExpression(ref BoundSpillSequenceBuilder builder, BoundExpression expression)
246var e = (BoundExpression)this.Visit(expression);
265private static BoundExpression UpdateExpression(BoundSpillSequenceBuilder builder, BoundExpression expression)
302private BoundExpression Spill(
304BoundExpression expression,
370var left = Spill(builder, assignment.Left, RefKind.Ref);
371var right = Spill(builder, assignment.Right, RefKind.Ref);
419var receiver = Spill(builder, field.ReceiverOpt, fieldSymbol.ContainingType.IsValueType ? refKind : RefKind.None);
520BoundExpression spillInlineArrayHelperWithTwoArguments(BoundSpillSequenceBuilder builder, BoundCall call)
584private ImmutableArray<BoundExpression> VisitExpressionList(
586ImmutableArray<BoundExpression> args,
630var result = ArrayBuilder<BoundExpression>.GetInstance(newList.Length);
636var replacement = Spill(builder, newList[i], refKind, sideEffectsOnly);
667var expression = VisitExpression(ref builder, node.Expression);
674BoundExpression expression = VisitExpression(ref builder, node.ExpressionOpt);
681BoundExpression expr = VisitExpression(ref builder, node.Expression);
690var condition = VisitExpression(ref builder, node.Condition);
697var expression = VisitExpression(ref builder, node.ExpressionOpt);
704var expression = VisitExpression(ref builder, node.Expression);
711BoundExpression? exceptionSourceOpt = (BoundExpression?)this.Visit(node.ExceptionSourceOpt);
721var exceptionFilterOpt = VisitExpression(ref builder, node.ExceptionFilterOpt);
756var expr = VisitExpression(ref builder, node.Expression);
769var value = VisitExpression(ref builder, node.Value);
776var expr = VisitExpression(ref builder, node.Operand);
790var expression = VisitExpression(ref builder, node.Expression);
820ImmutableArray<BoundExpression> bounds;
847BoundExpression count = VisitExpression(ref builder, node.Count);
855var expression = VisitExpression(ref builder, node.Expression);
862var operand = VisitExpression(ref builder, node.Operand);
871var right = VisitExpression(ref builder, node.Right);
873BoundExpression left = node.Left;
902var expression = VisitExpression(ref leftBuilder, arrayAccess.Expression);
928BoundExpression fieldWithSpilledReceiver(BoundFieldAccess field, ref BoundSpillSequenceBuilder leftBuilder, bool isAssignmentTarget)
934BoundExpression receiver;
949var expression = VisitExpression(ref leftBuilder, arrayAccess.Expression);
996var right = VisitExpression(ref builder, node.Right);
997BoundExpression left;
1034BoundExpression receiver = null;
1084private static RefKind ReceiverSpillRefKind(BoundExpression receiver)
1100BoundExpression invokedExpression;
1120var condition = VisitExpression(ref conditionBuilder, node.Condition);
1123var consequence = VisitExpression(ref consequenceBuilder, node.Consequence);
1126var alternative = VisitExpression(ref alternativeBuilder, node.Alternative);
1196var operand = VisitExpression(ref builder, node.Operand);
1205var expression = VisitExpression(ref builder, node.Expression);
1221var argument = VisitExpression(ref builder, node.Argument);
1228var receiver = VisitExpression(ref builder, node.ReceiverOpt);
1235var operand = VisitExpression(ref builder, node.Operand);
1242var operand = VisitExpression(ref builder, node.Operand);
1251var right = VisitExpression(ref builder, node.RightOperand);
1252BoundExpression left;
1281var receiver = VisitExpression(ref receiverBuilder, node.Receiver);
1284var whenNotNull = VisitExpression(ref whenNotNullBuilder, node.WhenNotNull);
1287var whenNullOpt = VisitExpression(ref whenNullBuilder, node.WhenNullOpt);
1298BoundExpression condition;
1323var isNotClass = _F.IsNotNullReference(_F.Default(receiver.Type));
1367private readonly BoundExpression _receiver;
1375private ConditionalReceiverReplacer(BoundExpression receiver, int receiverId, int recursionDepth)
1382public static BoundStatement Replace(BoundNode node, BoundExpression receiver, int receiverID, int recursionDepth)
1436var index = VisitExpression(ref builder, node.Index);
1437BoundExpression expression;
1457var operand = VisitExpression(ref builder, node.Operand);
1464var value = VisitExpression(ref valueBuilder, node.Value);
1490BoundExpression operand = VisitExpression(ref builder, node.Expression);
1520BoundExpression operand = VisitExpression(ref builder, node.Operand);
1527BoundExpression operand = VisitExpression(ref builder, node.Operand);
1534BoundExpression expression = VisitExpression(ref builder, node.Expression);
Lowering\StateMachineRewriter\CapturedSymbol.cs (12)
26public abstract BoundExpression Replacement<TArg>(SyntaxNode node, Func<NamedTypeSymbol, TArg, BoundExpression> makeFrame, TArg arg);
39public override BoundExpression Replacement<TArg>(SyntaxNode node, Func<NamedTypeSymbol, TArg, BoundExpression> makeFrame, TArg arg)
41var frame = makeFrame(this.HoistedField.ContainingType, arg);
57public override BoundExpression Replacement<TArg>(SyntaxNode node, Func<NamedTypeSymbol, TArg, BoundExpression> makeFrame, TArg arg)
59var frame = makeFrame(this.HoistedField.ContainingType, arg);
68private readonly BoundExpression _replacement;
71public CapturedToExpressionSymbolReplacement(BoundExpression replacement, ImmutableArray<THoistedSymbolType> hoistedSymbols, bool isReusable)
78public override BoundExpression Replacement<TArg>(SyntaxNode node, Func<NamedTypeSymbol, TArg, BoundExpression> makeFrame, TArg arg)
Lowering\StateMachineRewriter\RefInitializationHoister.cs (13)
30where THoistedAccess : BoundExpression
58internal BoundExpression? HoistRefInitialization<TArg>(
60BoundExpression visitedRight,
86var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
90var replacement = HoistExpression(visitedRight, local, local.RefKind, sideEffects, hoistedSymbols, ref needsSacrificialEvaluation, createHoistedSymbol, createHoistedAccess, arg, isRuntimeAsync, isFieldAccessOfStruct: false);
108var last = sideEffects.Last();
134private BoundExpression HoistExpression<TArg>(
135BoundExpression expr,
138ArrayBuilder<BoundExpression> sideEffects,
152BoundExpression expression = HoistExpression(
165var indices = ArrayBuilder<BoundExpression>.GetInstance();
166foreach (var index in array.Indices)
204var receiver = HoistExpression(
Lowering\StateMachineRewriter\StateMachineRewriter.cs (10)
318var leftExpression = proxy.Replacement(
332var leftExpression = proxy.Replacement(
379protected BoundExpression MakeCurrentThreadId()
402protected SynthesizedImplementationMethod GenerateIteratorGetEnumerator(MethodSymbol getEnumeratorMethod, ref BoundExpression managedThreadId, StateMachineState initialState)
472var leftExpression = proxy.Replacement(
477var rightExpression = copySrc[method.ThisParameter].Replacement(F.Syntax, static (stateMachineType, F) => F.This(), F);
491BoundExpression resultParameter = proxy.Replacement(
497BoundExpression parameterProxy = copySrc[parameter].Replacement(F.Syntax, static (stateMachineType, F) => F.This(), F);
519protected virtual BoundStatement InitializeParameterField(MethodSymbol getEnumeratorMethod, ParameterSymbol parameter, BoundExpression resultParameter, BoundExpression parameterProxy)
Lowering\SyntheticBoundNodeFactory.cs (182)
228public BoundExpression This(LocalSymbol thisTempOpt)
230return (thisTempOpt != null) ? Local(thisTempOpt) : (BoundExpression)This();
241return new BoundBadExpression(Syntax, LookupResultKind.Empty, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, type, hasErrors: true);
249public BoundFieldAccess Field(BoundExpression? receiver, FieldSymbol f)
259public BoundExpression Property(WellKnownMember member)
264public BoundExpression Property(BoundExpression? receiverOpt, WellKnownMember member)
273public BoundExpression Property(BoundExpression? receiverOpt, PropertySymbol property)
288public BoundExpression Indexer(BoundExpression? receiverOpt, PropertySymbol property, BoundExpression arg0)
416public BoundExpressionStatement Assignment(BoundExpression left, BoundExpression right, bool isRef = false)
421public BoundExpressionStatement ExpressionStatement(BoundExpression expr)
429public BoundExpression AssignmentExpression(BoundExpression left, BoundExpression right, bool isRef = false)
437public BoundExpression AssignmentExpression(SyntaxNode syntax, BoundExpression left, BoundExpression right, bool isRef = false, bool hasErrors = false, bool wasCompilerGenerated = false)
556public BoundReturnStatement Return(BoundExpression? expression = null)
643public BoundBinaryOperator Binary(BinaryOperatorKind kind, TypeSymbol type, BoundExpression left, BoundExpression right)
648public BoundAsOperator As(BoundExpression operand, TypeSymbol type)
653public BoundIsOperator Is(BoundExpression operand, TypeSymbol type)
662public BoundBinaryOperator LogicalAnd(BoundExpression left, BoundExpression right)
669public BoundBinaryOperator LogicalOr(BoundExpression left, BoundExpression right)
676public BoundBinaryOperator IntEqual(BoundExpression left, BoundExpression right)
681public BoundBinaryOperator ObjectEqual(BoundExpression left, BoundExpression right)
686public BoundExpression IsNotNullReference(BoundExpression value)
707public BoundBinaryOperator ObjectNotEqual(BoundExpression left, BoundExpression right)
712public BoundBinaryOperator IntNotEqual(BoundExpression left, BoundExpression right)
717public BoundBinaryOperator IntLessThan(BoundExpression left, BoundExpression right)
722public BoundBinaryOperator IntGreaterThanOrEqual(BoundExpression left, BoundExpression right)
727public BoundBinaryOperator IntSubtract(BoundExpression left, BoundExpression right)
732public BoundBinaryOperator IntMultiply(BoundExpression left, BoundExpression right)
760public BoundObjectCreationExpression New(NamedTypeSymbol type, params BoundExpression[] args)
766public BoundObjectCreationExpression New(MethodSymbol ctor, params BoundExpression[] args)
769public BoundObjectCreationExpression New(NamedTypeSymbol type, ImmutableArray<BoundExpression> args)
775public BoundObjectCreationExpression New(MethodSymbol ctor, ImmutableArray<BoundExpression> args)
778public BoundObjectCreationExpression New(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKinds)
793public BoundObjectCreationExpression New(WellKnownMember wm, ImmutableArray<BoundExpression> args)
799public BoundExpression MakeIsNotANumberTest(BoundExpression input)
814public BoundExpression StaticCall(TypeSymbol receiver, MethodSymbol method, params BoundExpression[] args)
824public BoundExpression StaticCall(MethodSymbol method, ImmutableArray<BoundExpression> args)
827public BoundExpression StaticCall(WellKnownMember method, params BoundExpression[] args)
835public BoundExpression StaticCall(WellKnownMember method, ImmutableArray<TypeSymbol> typeArgs, params BoundExpression[] args)
846public BoundExpression StaticCall(SpecialMember method, params BoundExpression[] args)
853public BoundCall Call(BoundExpression? receiver, MethodSymbol method)
855return Call(receiver, method, ImmutableArray<BoundExpression>.Empty);
858public BoundCall Call(BoundExpression? receiver, MethodSymbol method, BoundExpression arg0, bool useStrictArgumentRefKinds = false)
863public BoundCall Call(BoundExpression? receiver, MethodSymbol method, BoundExpression arg0, BoundExpression arg1, bool useStrictArgumentRefKinds = false)
868public BoundCall Call(BoundExpression? receiver, MethodSymbol method, params BoundExpression[] args)
870return Call(receiver, method, ImmutableArray.Create<BoundExpression>(args));
873public BoundCall Call(BoundExpression? receiver, WellKnownMember method, BoundExpression arg0)
876public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<BoundExpression> args, bool useStrictArgumentRefKinds = false)
918public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<RefKind> refKinds, ImmutableArray<BoundExpression> args)
928public BoundExpression Conditional(BoundExpression condition, BoundExpression consequence, BoundExpression alternative, TypeSymbol type, bool isRef = false)
933public BoundComplexConditionalReceiver ComplexConditionalReceiver(BoundExpression valueTypeReceiver, BoundExpression referenceTypeReceiver)
940public BoundExpression Coalesce(BoundExpression left, BoundExpression right)
948public BoundStatement If(BoundExpression condition, BoundStatement thenClause, BoundStatement? elseClauseOpt = null)
953public BoundStatement ConditionalGoto(BoundExpression condition, LabelSymbol label, bool jumpIfTrue)
958public BoundStatement If(BoundExpression condition, ImmutableArray<LocalSymbol> locals, BoundStatement thenClause, BoundStatement? elseClauseOpt = null)
1009public BoundThrowStatement Throw(BoundExpression e)
1019public BoundExpression MakeSequence(LocalSymbol temp, params BoundExpression[] parts)
1024public BoundExpression MakeSequence(params BoundExpression[] parts)
1029public BoundExpression MakeSequence(ImmutableArray<LocalSymbol> locals, params BoundExpression[] parts)
1031var builder = ArrayBuilder<BoundExpression>.GetInstance();
1034var part = parts[i];
1040var lastExpression = parts[parts.Length - 1];
1051public BoundSequence Sequence(BoundExpression[] sideEffects, BoundExpression result, TypeSymbol? type = null)
1058public BoundExpression Sequence(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression result)
1067public BoundSpillSequence SpillSequence(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression result)
1097public BoundStatement Switch(BoundExpression ex, ImmutableArray<SyntheticSwitchSection> sections)
1192public BoundArrayLength ArrayLength(BoundExpression array)
1198public BoundArrayAccess ArrayAccessFirstElement(BoundExpression array)
1202ImmutableArray<BoundExpression> firstElementIndices = ArrayBuilder<BoundExpression>.GetInstance(rank, Literal(0)).ToImmutableAndFree();
1206public BoundArrayAccess ArrayAccess(BoundExpression array, params BoundExpression[] indices)
1211public BoundArrayAccess ArrayAccess(BoundExpression array, ImmutableArray<BoundExpression> indices)
1246public BoundExpression ThrowExpression(BoundExpression thrown, TypeSymbol type)
1251public BoundExpression Null(TypeSymbol type)
1257public BoundExpression NullRef(TypeWithAnnotations type)
1263public static BoundExpression Null(TypeSymbol type, SyntaxNode syntax)
1266BoundExpression nullLiteral = new BoundLiteral(syntax, ConstantValue.Null, type) { WasCompilerGenerated = true };
1277public BoundExpression Typeof(WellKnownType type, TypeSymbol systemType)
1282public BoundExpression Typeof(TypeSymbol type, TypeSymbol systemType)
1308public BoundExpression Typeof(TypeWithAnnotations type, TypeSymbol systemType)
1313public ImmutableArray<BoundExpression> TypeOfs(ImmutableArray<TypeWithAnnotations> typeArguments, TypeSymbol systemType)
1318public BoundExpression TypeofDynamicOperationContextType()
1324public BoundExpression Sizeof(TypeSymbol type)
1329internal BoundExpression ConstructorInfo(MethodSymbol ctor)
1347public BoundExpression MethodDefIndex(MethodSymbol method)
1356public BoundExpression LocalId(LocalSymbol symbol)
1366public BoundExpression ParameterId(ParameterSymbol symbol)
1376public BoundExpression StateMachineInstanceId()
1388public BoundExpression ModuleVersionId()
1393public BoundExpression ModuleVersionIdString()
1398public BoundExpression InstrumentationPayloadRoot(int analysisKind, TypeSymbol payloadType)
1403public BoundExpression ThrowIfModuleCancellationRequested()
1406public BoundExpression ModuleCancellationToken()
1409public BoundExpression MaximumMethodDefIndex()
1420public BoundExpression SourceDocumentIndex(Cci.DebugSourceDocument document)
1429public BoundExpression MethodInfo(MethodSymbol method, TypeSymbol systemReflectionMethodInfo)
1454public BoundExpression FieldInfo(FieldSymbol field)
1498/// and then calls <see cref="Convert(TypeSymbol, BoundExpression, Conversion, bool, bool)"/>.
1502public Conversion ClassifyEmitConversion(BoundExpression arg, TypeSymbol destination)
1515public BoundExpression Convert(TypeSymbol type, BoundExpression arg, Conversion conversion, bool isChecked = false, bool explicitCastInCode = true)
1533public BoundExpression ArrayOrEmpty(TypeSymbol elementType, BoundExpression[] elements)
1545public BoundExpression ArrayOrEmpty(TypeSymbol elementType, ImmutableArray<BoundExpression> elements)
1560public BoundExpression Array(TypeSymbol elementType, ImmutableArray<BoundExpression> elements)
1564ImmutableArray.Create<BoundExpression>(Literal(elements.Length)),
1569public BoundExpression Array(TypeSymbol elementType, BoundExpression length)
1573ImmutableArray.Create<BoundExpression>(length),
1579internal BoundExpression Default(TypeSymbol type)
1584internal static BoundExpression Default(TypeSymbol type, SyntaxNode syntax)
1613BoundExpression source,
1624internal BoundExpression NullOrDefault(TypeSymbol typeSymbol)
1629internal static BoundExpression NullOrDefault(TypeSymbol typeSymbol, SyntaxNode syntax)
1634internal BoundExpression Not(BoundExpression expression)
1645BoundExpression argument,
1740internal ImmutableArray<BoundExpression> MakeTempsForDiscardArguments(ImmutableArray<BoundExpression> arguments, ArrayBuilder<LocalSymbol> builder)
1755internal BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
1807internal BoundExpression MakeNullableHasValue(SyntaxNode syntax, BoundExpression expression)
1817internal BoundExpression RewriteNullableNullEquality(
1820BoundExpression loweredLeft,
1821BoundExpression loweredRight,
1839BoundExpression nullable = loweredRight.IsLiteralNull() ? loweredLeft : loweredRight;
1848BoundExpression nonNullValue = LocalRewriter.NullableAlwaysHasValue(nullable);
1859sideEffects: ImmutableArray.Create<BoundExpression>(nonNullValue),
1869BoundExpression whenNotNull = RewriteNullableNullEquality(
1881BoundExpression call = MakeNullableHasValue(syntax, nullable);
1882BoundExpression result = kind == BinaryOperatorKind.NullableNullNotEqual ?
Operations\CSharpOperationFactory.cs (45)
306ConstantValue? constantValue = (boundNode as BoundExpression)?.ConstantValueOpt;
321BoundExpression boundExpr => boundExpr.GetPublicTypeSymbol(),
330BoundExpression boundExpr => boundExpr.GetPublicTypeSymbol(),
468private static TypeParameterSymbol? GetConstrainedToType(Symbol targetMember, BoundExpression? receiverOpt)
535return CreateFromArray<BoundExpression, IOperation>(declaredTypeOpt.BoundDimensionsOpt);
541ImmutableArray<BoundExpression> dimensions;
550dimensions = ImmutableArray<BoundExpression>.Empty;
552return CreateFromArray<BoundExpression, IOperation>(dimensions);
765ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundDynamicObjectCreationExpression.Arguments);
794ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundDynamicInvocation.Arguments);
803internal IOperation CreateBoundDynamicIndexerAccessExpressionReceiver(BoundExpression indexer)
818internal ImmutableArray<IOperation> CreateBoundDynamicIndexerAccessArguments(BoundExpression indexer)
823return CreateFromArray<BoundExpression, IOperation>(boundDynamicAccess.Arguments);
827return CreateFromArray<BoundExpression, IOperation>(boundObjectInitializerMember.Arguments);
848ImmutableArray<IOperation> initializers = CreateFromArray<BoundExpression, IOperation>(BoundObjectCreationExpression.GetChildInitializers(boundObjectInitializerExpression));
857ImmutableArray<IOperation> initializers = CreateFromArray<BoundExpression, IOperation>(BoundObjectCreationExpression.GetChildInitializers(boundCollectionInitializerExpression));
965BoundExpression? receiver,
992ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundCollectionElementInitializer.Arguments);
1033BoundExpression boundOperand = boundConversion.Operand;
1139BoundExpression nestedOperand = nestedConversion.Operand;
1246ImmutableArray<IOperation> dimensionSizes = CreateFromArray<BoundExpression, IOperation>(boundArrayCreation.Bounds);
1257ImmutableArray<IOperation> elementValues = CreateFromArray<BoundExpression, IOperation>(boundArrayInitialization.Initializers);
1296var collectionCreation = expr.CollectionCreation;
1323return @this.CreateFromArray<BoundExpression, IOperation>(boundBad.ChildBoundNodes);
1337Create(Binder.GetUnderlyingCollectionExpressionElement(expr, (BoundExpression)element, throwOnErrors: false));
1342var iteratorItem = element.IteratorBody is { } iteratorBody ?
1371ConstantValue? constantValue = ((BoundExpression)boundDefaultExpression).ConstantValueOpt;
1484var children = CreateFromArray<BoundExpression, IOperation>(boundBadExpression.ChildBoundNodes);
1693ImmutableArray<IOperation> indices = CreateFromArray<BoundExpression, IOperation>(boundArrayAccess.Indices);
2044boundForEachStatement.Expression is not BoundConversion { Conversion.IsIdentity: true, ExplicitCastInCode: false, Operand: BoundExpression operand } ?
2316ImmutableArray<IOperation> elements = CreateFromArray<BoundExpression, IOperation>(boundTupleExpression.Arguments);
2337internal ImmutableArray<IInterpolatedStringContentOperation> CreateBoundInterpolatedStringContentOperation(ImmutableArray<BoundExpression> parts, ImmutableArray<(bool IsLiteral, bool HasAlignment, bool HasFormat)>? positionInfo)
2344foreach (var part in parts)
2370var part = parts[i];
2373BoundExpression value;
2374BoundExpression? alignment;
2375BoundExpression? format;
2443static (BoundExpression Value, BoundExpression? Alignment, BoundExpression? Format) getCallInfo(ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, (bool IsLiteral, bool HasAlignment, bool HasFormat) currentPosition)
2445BoundExpression value = arguments[0];
2455BoundExpression? alignment = alignmentIndex == -1 ? null : arguments[alignmentIndex];
2457BoundExpression? format = formatIndex == -1 ? null : arguments[formatIndex];
2501IOperation createContent(BoundExpression current)
Operations\CSharpOperationFactory_Methods.cs (11)
36internal IArgumentOperation CreateArgumentOperation(ArgumentKind kind, IParameterSymbol? parameter, BoundExpression expression)
87ImmutableArray<IOperation> ignoredDimensions = CreateFromArray<BoundExpression, IOperation>(boundLocalDeclaration.ArgumentsOpt);
114private bool IsCallVirtual(MethodSymbol? targetMethod, BoundExpression? receiver)
266ImmutableArray<BoundExpression> boundArguments,
290ImmutableArray<BoundExpression> arguments,
339private static ArgumentKind GetArgumentKind(BoundExpression argument, ref BitVector defaultArguments, int i)
364ImmutableArray<BoundExpression> arguments)
373BoundExpression argument = arguments[a];
387internal static ImmutableArray<BoundNode> CreateInvalidChildrenFromArgumentsExpression(BoundNode? receiverOpt, ImmutableArray<BoundExpression> arguments, BoundExpression? additionalNodeOpt = null)
408ImmutableArray<BoundExpression> arguments,