Binder\Binder.ValueChecks.cs (108)
127internal BoundExpression Argument { get; }
143internal MixableDestination(ParameterSymbol parameter, BoundExpression argument)
152internal MixableDestination(BoundExpression argument, EscapeLevel escapeLevel)
181internal BoundExpression Argument { get; }
185internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
193public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
217internal BoundExpression Argument { get; }
228internal EscapeValue(ParameterSymbol? parameter, BoundExpression argument, EscapeLevel escapeLevel, bool isRefEscape)
236public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out EscapeLevel escapeLevel, out bool isRefEscape)
421var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(accessorForDefaultArguments.ParameterCount);
510private BoundExpression CheckValue(BoundExpression expr, BindValueKind valueKind, BindingDiagnosticBag diagnostics)
638var receiver = methodGroup.ReceiverOpt;
656receiver == null ? ImmutableArray<BoundExpression>.Empty : ImmutableArray.Create(receiver),
674internal static bool IsTypeOrValueExpression(BoundExpression expression)
699internal bool CheckValueKind(SyntaxNode node, BoundExpression expr, BindValueKind valueKind, bool checkingReceiver, BindingDiagnosticBag diagnostics)
825var receiver = ((BoundPointerElementAccess)expr).Expression;
979bool checkArrayAccessValueKind(SyntaxNode node, BindValueKind valueKind, ImmutableArray<BoundExpression> indices, BindingDiagnosticBag diagnostics)
1014private static bool CheckNotNamespaceOrType(BoundExpression expr, BindingDiagnosticBag diagnostics)
1299private bool CheckParameterRefEscape(SyntaxNode node, BoundExpression parameter, ParameterSymbol parameterSymbol, SafeContext escapeTo, bool checkingReceiver, BindingDiagnosticBag diagnostics)
1576BoundExpression receiver = boundEvent.ReceiverOpt;
1638private bool CheckIsValidReceiverForVariable(SyntaxNode node, BoundExpression receiver, BindValueKind kind, BindingDiagnosticBag diagnostics)
1657private static bool RequiresVariableReceiver(BoundExpression receiver, Symbol symbol)
1709private bool CheckPropertyValueKind(SyntaxNode node, BoundExpression expr, BindValueKind valueKind, bool checkingReceiver, BindingDiagnosticBag diagnostics)
1716BoundExpression receiver;
1890static bool isAllowedDespiteReadonly(BoundExpression receiver)
1901bool isAllowedInitOnlySet(BoundExpression receiver)
1932private bool IsBadBaseAccess(SyntaxNode node, BoundExpression receiverOpt, Symbol member, BindingDiagnosticBag diagnostics,
1951BoundExpression expression,
1967var arguments = ArrayBuilder<BoundExpression>.GetInstance();
1992BoundExpression? receiver,
1995ImmutableArray<BoundExpression> argsOpt,
2015SafeContext getInvocationEscapeWithOldRules(MethodInfo methodInfo, ImmutableArray<ParameterSymbol> parameters, BoundExpression? receiver, ImmutableArray<BoundExpression> argsOpt, ImmutableArray<RefKind> argRefKindsOpt, ImmutableArray<int> argsToParamsOpt, SafeContext localScopeDepth, bool isRefEscape)
2088BoundExpression? receiver,
2091ImmutableArray<BoundExpression> argsOpt,
2143ref BoundExpression? receiver, ref ImmutableArray<BoundExpression> argsOpt, ref ImmutableArray<RefKind> argRefKindsOpt,
2197BoundExpression? receiver,
2200ImmutableArray<BoundExpression> argsOpt,
2224ref BoundExpression? receiver, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<BoundExpression> argsOpt,
2301BoundExpression? receiver,
2304ImmutableArray<BoundExpression> argsOpt,
2374BoundExpression? receiver,
2377ImmutableArray<BoundExpression> argsOpt,
2412var argument = argsOpt[argIndex];
2459static bool isMixableArgument(BoundExpression argument)
2472static EscapeArgument getReceiver(in MethodInfo methodInfo, BoundExpression receiver)
2498static EscapeArgument getReceiverCore(MethodSymbol? method, BoundExpression receiver)
2524ImmutableArray<BoundExpression> argsOpt,
2531var argument = argsOpt[argIndex];
2551BoundExpression? receiver,
2554ImmutableArray<BoundExpression> argsOpt,
2621BoundExpression? receiver,
2624ImmutableArray<BoundExpression> argsOpt,
2676BoundExpression? receiver,
2679ImmutableArray<BoundExpression> argsOpt,
2752BoundExpression? receiver,
2755ImmutableArray<BoundExpression> argsOpt,
2834private bool ShouldInferDeclarationExpressionValEscape(BoundExpression argument, [NotNullWhen(true)] out SourceLocalSymbol? localSymbol)
2866BoundExpression? receiverOpt,
2869ImmutableArray<BoundExpression> argsOpt,
2885ref BoundExpression? receiverOpt, ThreeState receiverIsSubjectToCloning, ImmutableArray<ParameterSymbol> parameters,
2886ImmutableArray<BoundExpression> argsOpt, ImmutableArray<int> argsToParamsOpt,
2976BoundExpression? receiverOpt,
2979ImmutableArray<BoundExpression> argsOpt,
3038void inferDeclarationExpressionValEscape(ImmutableArray<BoundExpression> argsOpt, SafeContext localScopeDepth, ArrayBuilder<EscapeValue> escapeValues)
3050foreach (var argument in argsOpt)
3062ImmutableArray<BoundExpression> argsOpt,
3400internal void ValidateEscape(BoundExpression expr, SafeContext escapeTo, bool isByRef, BindingDiagnosticBag diagnostics)
3423internal SafeContext GetRefEscape(BoundExpression expr, SafeContext localScopeDepth)
3643ImmutableArray<BoundExpression> arguments;
3731internal bool CheckRefEscape(SyntaxNode node, BoundExpression expr, SafeContext escapeFrom, SafeContext escapeTo, bool checkingReceiver, BindingDiagnosticBag diagnostics)
3964ImmutableArray<BoundExpression> arguments;
4103foreach (var element in expr.Arguments)
4126internal SafeContext GetValEscape(BoundExpression expr, SafeContext localScopeDepth)
4331ImmutableArray<BoundExpression> arguments;
4444ImmutableArray<BoundExpression> arguments;
4678private SafeContext GetTupleValEscape(ImmutableArray<BoundExpression> elements, SafeContext localScopeDepth)
4681foreach (var element in elements)
4698foreach (var expr in initExpr.Initializers)
4707private SafeContext GetValEscapeOfObjectMemberInitializer(BoundExpression expr, SafeContext localScopeDepth)
4808private SafeContext GetValEscape(ImmutableArray<BoundExpression> expressions, SafeContext localScopeDepth)
4811foreach (var expression in expressions)
4824internal bool CheckValEscape(SyntaxNode node, BoundExpression expr, SafeContext escapeFrom, SafeContext escapeTo, bool checkingReceiver, BindingDiagnosticBag diagnostics)
4909BoundExpression underlyingReceiver = ((BoundCapturedReceiverPlaceholder)expr).Receiver;
5079ImmutableArray<BoundExpression> arguments;
5233ImmutableArray<BoundExpression> arguments;
5377var clauseValue = ((BoundQueryClause)expr).Value;
5381var variableValue = ((BoundRangeVariable)expr).Value;
5401var accessedExpression = ((BoundPointerElementAccess)expr).Expression;
5405var operandExpression = ((BoundPointerIndirectionOperator)expr).Operand;
5420var result = arm.Value;
5561private SignatureOnlyMethodSymbol GetInlineArrayAccessEquivalentSignatureMethod(BoundInlineArrayAccess elementAccess, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5623private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundConversion conversion, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5629private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundExpression inlineArray, TypeSymbol resultType, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5663private bool CheckTupleValEscape(ImmutableArray<BoundExpression> elements, SafeContext escapeFrom, SafeContext escapeTo, BindingDiagnosticBag diagnostics)
5665foreach (var element in elements)
5680foreach (var expr in initExpr.Initializers)
5694private bool CheckValEscape(ImmutableArray<BoundExpression> expressions, SafeContext escapeFrom, SafeContext escapeTo, BindingDiagnosticBag diagnostics)
5696foreach (var expression in expressions)
5707private bool CheckInterpolatedStringHandlerConversionEscape(BoundExpression expression, SafeContext escapeFrom, SafeContext escapeTo, BindingDiagnosticBag diagnostics)
5728var arguments = ArrayBuilder<BoundExpression>.GetInstance();
5745private void GetInterpolatedStringHandlerArgumentsForEscape(BoundExpression expression, ArrayBuilder<BoundExpression> arguments)
5767foreach (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, indexed: false, receiver, default(SeparatedSyntaxList<TypeSyntax>), default(ImmutableArray<TypeWithAnnotations>), lookupResult, BoundMethodGroupFlags.None, diagnostics);
Binder\Binder_Attributes.cs (12)
188ImmutableArray<BoundExpression> boundConstructorArguments;
522var rhs = BindRValueWithoutTargetType(namedArgument.Expression, diagnostics);
561BoundExpression namedArgumentValue = this.BindValue(namedArgument.Expression, diagnostics, BindValueKind.RValue);
566BoundExpression lvalue;
761public ImmutableArray<TypedConstant> VisitArguments(ImmutableArray<BoundExpression> arguments, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool parentHasErrors = false)
769foreach (var argument in arguments)
835private TypedConstant VisitExpression(BoundExpression node, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool curArgumentHasErrors)
845private TypedConstant VisitExpression(BoundExpression node, TypedConstantKind typedConstantKind, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool curArgumentHasErrors)
895return VisitExpression((BoundExpression)node, diagnostics, ref attrHasErrors, curArgumentHasErrors);
911var operand = node.Operand;
973ImmutableArray<BoundExpression> bounds = node.Bounds;
1012private static TypedConstant CreateTypedConstant(BoundExpression node, TypedConstantKind typedConstantKind, BindingDiagnosticBag diagnostics, ref bool attrHasErrors, bool curArgumentHasErrors,
Binder\Binder_Await.cs (20)
19private BoundExpression BindAwait(AwaitExpressionSyntax node, BindingDiagnosticBag diagnostics)
23BoundExpression expression = BindRValueWithoutTargetType(node.Expression, diagnostics);
28private BoundAwaitExpression BindAwait(BoundExpression expression, SyntaxNode node, BindingDiagnosticBag diagnostics)
51internal BoundAwaitableInfo BindAwaitInfo(BoundAwaitableValuePlaceholder placeholder, SyntaxNode node, BindingDiagnosticBag diagnostics, ref bool hasErrors, BoundExpression? expressionOpt = null)
57out BoundExpression? getAwaiter,
71private bool CouldBeAwaited(BoundExpression expression)
243BoundExpression expression,
244out BoundExpression? getAwaiterGetResultCall,
252BoundExpression expression,
253BoundExpression getAwaiterArgument,
255out BoundExpression? getAwaiter,
258out BoundExpression? getAwaiterGetResultCall,
295private static bool ValidateAwaitedExpression(BoundExpression expression, SyntaxNode node, BindingDiagnosticBag diagnostics)
323private bool GetGetAwaiterMethod(BoundExpression expression, SyntaxNode node, BindingDiagnosticBag diagnostics, [NotNullWhen(true)] out BoundExpression? getAwaiterCall)
333getAwaiterCall = MakeInvocationExpression(node, expression, WellKnownMemberNames.GetAwaiter, ImmutableArray<BoundExpression>.Empty, diagnostics);
372var qualified = BindInstanceMemberAccess(node, node, receiver, name, 0, default(SeparatedSyntaxList<TypeSyntax>), default(ImmutableArray<TypeWithAnnotations>), invoked: false, indexed: false, diagnostics);
435private bool GetGetResultMethod(BoundExpression awaiterExpression, SyntaxNode node, TypeSymbol awaitedExpressionType, BindingDiagnosticBag diagnostics, out MethodSymbol? getResultMethod, [NotNullWhen(true)] out BoundExpression? getAwaiterGetResultCall)
438getAwaiterGetResultCall = MakeInvocationExpression(node, awaiterExpression, WellKnownMemberNames.GetResult, ImmutableArray<BoundExpression>.Empty, diagnostics);
Binder\Binder_Conversions.cs (76)
20internal BoundExpression CreateConversion(
21BoundExpression source,
32internal BoundExpression CreateConversion(
33BoundExpression source,
41internal BoundExpression CreateConversion(
43BoundExpression source,
53protected BoundExpression CreateConversion(
55BoundExpression source,
65var result = createConversion(syntax, source, conversion, isCast, conversionGroupOpt, wasCompilerGenerated, destination, diagnostics, hasErrors);
78var result2 = createConversion(syntax, placeholder2, conversion, isCast, conversionGroupOpt, wasCompilerGenerated, destination, BindingDiagnosticBag.Discarded, hasErrors);
95BoundExpression createConversion(
97BoundExpression source,
161var convertedSwitch = ConvertSwitchExpression((BoundUnconvertedSwitchExpression)source, destination, conversionIfTargetTyped: conversion, diagnostics);
176var convertedConditional = ConvertConditionalExpression((BoundUnconvertedConditionalOperator)source, destination, conversionIfTargetTyped: conversion, diagnostics);
300void reportUseSiteDiagnostics(SyntaxNode syntax, Conversion conversion, BoundExpression source, TypeSymbol destination, BindingDiagnosticBag diagnostics)
314void ensureAllUnderlyingConversionsChecked(SyntaxNode syntax, BoundExpression source, Conversion conversion, bool wasCompilerGenerated, TypeSymbol destination, BindingDiagnosticBag diagnostics)
407void checkConstraintLanguageVersionAndRuntimeSupportForConversion(SyntaxNode syntax, Conversion conversion, BoundExpression source, TypeSymbol destination, BindingDiagnosticBag diagnostics)
707private BoundExpression BindUnconvertedInterpolatedExpressionToFormattableStringFactory(BoundUnconvertedInterpolatedString unconvertedSource, TypeSymbol destination, BindingDiagnosticBag diagnostics)
712ImmutableArray<BoundExpression> parts = BindInterpolatedStringPartsForFactory(unconvertedSource, diagnostics, out bool haveErrors);
741private static BoundExpression ConvertObjectCreationExpression(
746BoundExpression expr = bindObjectCreationExpression(node.Syntax, node.InitializerOpt, node.Binder, destination.StrippedType(), arguments, diagnostics);
774static BoundExpression bindObjectCreationExpression(
839BoundExpression? collectionBuilderInvocationConversion = null;
880BoundExpression? collectionCreation = null;
921ImmutableArray.Create((BoundExpression)element),
961(BoundExpression)element,
995var convertElement = CreateConversion(
1077internal BoundExpression BindCollectionExpressionConstructor(SyntaxNode syntax, TypeSymbol targetType, MethodSymbol? constructor, BindingDiagnosticBag diagnostics)
1086BoundExpression collectionCreation;
1296BoundExpression receiver,
1301var boundExpression = addMethodBinder.BindInstanceMemberAccess(
1524ImmutableArray.Create<BoundExpression>(methodGroup.ReceiverOpt, new BoundValuePlaceholder(syntax, secondArgumentType) { WasCompilerGenerated = true }),
1619var receiver = methodGroup.Receiver;
1646internal static BoundExpression GetUnderlyingCollectionExpressionElement(BoundCollectionExpression expr, BoundExpression element, bool throwOnErrors)
1682static BoundExpression getCollectionInitializerElement(BoundCollectionElementInitializer collectionInitializer)
1685var arg = collectionInitializer.Arguments[argIndex];
1695else if (arg is BoundConversion { Operand: BoundCollectionExpression { Elements: [BoundExpression collectionElement] } })
1709BoundExpression collectionExpr = new BoundValuePlaceholder(syntax, collectionType);
1738var result = element is BoundExpression expression ?
1830Conversion elementConversion = Conversions.ClassifyImplicitConversionFromExpression((BoundExpression)element, elementType, ref useSiteInfo);
1833GenerateImplicitConversionError(diagnostics, element.Syntax, elementConversion, (BoundExpression)element, elementType);
1940private BoundExpression ConvertConditionalExpression(
1951var condition = source.Condition;
1954var trueExpr =
1958var falseExpr =
1983private BoundExpression ConvertSwitchExpression(BoundUnconvertedSwitchExpression source, TypeSymbol destination, Conversion? conversionIfTargetTyped, BindingDiagnosticBag diagnostics, bool hasErrors = false)
1993var oldValue = oldCase.Value;
1994var newValue =
2010private BoundExpression CreateUserDefinedConversion(
2012BoundExpression source,
2072BoundExpression convertedOperand = CreateConversion(
2100BoundExpression userDefinedConversion;
2164BoundExpression finalConversion = CreateConversion(
2181private BoundExpression CreateFunctionTypeConversion(SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast, ConversionGroup? conversionGroup, TypeSymbol destination, BindingDiagnosticBag diagnostics)
2204BoundExpression expr;
2229private BoundExpression CreateAnonymousFunctionConversion(SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast, ConversionGroup? conversionGroup, TypeSymbol destination, BindingDiagnosticBag diagnostics)
2256private BoundExpression CreateMethodGroupConversion(SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast, ConversionGroup? conversionGroup, TypeSymbol destination, BindingDiagnosticBag diagnostics)
2414private BoundExpression CreateStackAllocConversion(SyntaxNode syntax, BoundExpression source, Conversion conversion, bool isCast, ConversionGroup? conversionGroup, TypeSymbol destination, BindingDiagnosticBag diagnostics)
2442private BoundExpression CreateTupleLiteralConversion(SyntaxNode syntax, BoundTupleLiteral sourceTuple, Conversion conversion, bool isCast, ConversionGroup? conversionGroup, TypeSymbol destination, BindingDiagnosticBag diagnostics)
2493var convertedArguments = ArrayBuilder<BoundExpression>.GetInstance(arguments.Length);
2502var argument = arguments[i];
2509BoundExpression result = new BoundConvertedTupleLiteral(
2567BoundExpression? receiverOpt = group.ReceiverOpt;
2595private bool MemberGroupFinalValidation(BoundExpression? receiverOpt, MethodSymbol methodSymbol, SyntaxNode node, BindingDiagnosticBag diagnostics, bool invokedAsExtensionMethod)
2670private bool MemberGroupFinalValidationAccessibilityChecks(BoundExpression? receiverOpt, Symbol memberSymbol, SyntaxNode node, BindingDiagnosticBag diagnostics, bool invokedAsExtensionMethod)
2780private static bool IsMemberAccessedThroughVariableOrValue(BoundExpression? receiverOpt)
2790internal static bool IsMemberAccessedThroughType([NotNullWhen(true)] BoundExpression? receiverOpt)
2808internal static bool WasImplicitReceiver([NotNullWhen(false)] BoundExpression? receiverOpt)
2826internal bool MethodIsCompatibleWithDelegateOrFunctionPointer(BoundExpression? receiverOpt, bool isExtensionMethod, MethodSymbol method, TypeSymbol delegateType, Location errorLocation, BindingDiagnosticBag diagnostics)
3012BoundExpression? receiverOpt,
3109BoundExpression source,
Binder\Binder_Deconstruct.cs (26)
29internal BoundExpression BindDeconstruction(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics, bool resultIsUsedOverride = false)
99BoundExpression boundRight = rightPlaceholder ?? BindValue(right, deconstructionDiagnostics, BindValueKind.RValue);
115BoundExpression boundRHS,
208private BoundExpression FixTupleLiteral(ArrayBuilder<DeconstructionVariable> checkedVariables, BoundExpression boundRHS, CSharpSyntaxNode syntax, BindingDiagnosticBag diagnostics)
277BoundExpression deconstructInvocation = MakeDeconstructInvocationExpression(variables.Count,
295var nestedConversions = ArrayBuilder<(BoundValuePlaceholder?, BoundExpression?)>.GetInstance(count);
367private BoundExpression SetInferredType(BoundExpression expression, TypeSymbol type, BindingDiagnosticBag diagnostics)
407BoundExpression errorLocal = ((DeconstructionVariablePendingInference)variable.Single).FailInference(this, diagnostics);
432internal readonly BoundExpression? Single;
436internal DeconstructionVariable(BoundExpression variable, SyntaxNode syntax)
480BoundExpression element = rhsLiteral.Arguments[i];
549var valuesBuilder = ArrayBuilder<BoundExpression>.GetInstance(count);
556BoundExpression value;
572ImmutableArray<BoundExpression> arguments = valuesBuilder.ToImmutableAndFree();
595private static string? ExtractDeconstructResultElementName(BoundExpression expression)
611private BoundExpression MakeDeconstructInvocationExpression(
613BoundExpression receiver,
652var memberAccess = BindInstanceMemberAccess(
670BoundExpression result = BindMethodGroupInvocation(
715private BoundBadExpression MissingDeconstruct(BoundExpression receiver, SyntaxNode rightSyntax, int numParameters, BindingDiagnosticBag diagnostics,
716out ImmutableArray<BoundDeconstructValuePlaceholder> outPlaceholders, BoundExpression childNode)
791var boundVariable = BindExpression(node, diagnostics, invoked: false, indexed: false);
792var checkedVariable = CheckValue(boundVariable, BindValueKind.Assignable, diagnostics);
865private BoundExpression BindDeconstructionVariable(
Binder\Binder_Expressions.cs (398)
25/// This portion of the binder converts an <see cref="ExpressionSyntax"/> into a <see cref="BoundExpression"/>.
119private BoundBadExpression BadExpression(SyntaxNode syntax, BoundExpression childNode)
127private BoundBadExpression BadExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> childNodes)
143protected BoundBadExpression BadExpression(SyntaxNode syntax, LookupResultKind lookupResultKind, BoundExpression childNode)
156ImmutableArray<BoundExpression>.Empty,
164private BoundBadExpression BadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol> symbols, BoundExpression childNode)
177private BoundBadExpression BadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol> symbols, ImmutableArray<BoundExpression> childNodes, bool wasCompilerGenerated = false)
199private BoundExpression ToBadExpression(BoundExpression expr, LookupResultKind resultKind = LookupResultKind.Empty)
241internal BoundExpression BindValue(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BindValueKind valueKind)
243var result = this.BindExpression(node, diagnostics: diagnostics, invoked: false, indexed: false);
247internal BoundExpression BindRValueWithoutTargetType(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool reportNoTargetType = true)
256internal BoundExpression BindTypeOrRValue(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
258var valueOrType = BindExpression(node, diagnostics: diagnostics, invoked: false, indexed: false);
269internal BoundExpression BindToTypeForErrorRecovery(BoundExpression expression, TypeSymbol type = null)
273var result =
287internal BoundExpression BindToNaturalType(BoundExpression expression, BindingDiagnosticBag diagnostics, bool reportNoTargetType = true)
292BoundExpression result;
337var boundArgs = ArrayBuilder<BoundExpression>.GetInstance(sourceTuple.Arguments.Length);
338foreach (var arg in sourceTuple.Arguments)
414private BoundExpression BindToInferredDelegateType(BoundExpression expr, BindingDiagnosticBag diagnostics)
435internal BoundExpression BindValueAllowArgList(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BindValueKind valueKind)
437var result = this.BindExpressionAllowArgList(node, diagnostics: diagnostics);
456BoundExpression result = initializerBinder.BindVariableOrAutoPropInitializerValue(initializerOpt, field.RefKind,
469internal BoundExpression BindVariableOrAutoPropInitializerValue(
483BoundExpression initializer = BindPossibleArrayInitializer(value, varType, valueKind, diagnostics);
502out BoundExpression valueBeforeConversion)
531var initializer = initializerBinder.BindValue(equalsValueSyntax.Value, diagnostics, BindValueKind.RValue);
536public BoundExpression BindExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
541protected BoundExpression BindExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool invoked, bool indexed)
543BoundExpression expr = BindExpressionInternal(node, diagnostics, invoked, indexed);
559protected BoundExpression BindExpressionAllowArgList(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
561BoundExpression expr = BindExpressionInternal(node, diagnostics, invoked: false, indexed: false);
566private void CheckContextForPointerTypes(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BoundExpression expr)
579private BoundExpression BindExpressionInternal(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool invoked, bool indexed)
586BoundExpression result = bindExpressionInternal(node, diagnostics, invoked, indexed);
595BoundExpression bindExpressionInternal(ExpressionSyntax node, BindingDiagnosticBag diagnostics, bool invoked, bool indexed)
856private BoundExpression BindRefExpression(RefExpressionSyntax node, BindingDiagnosticBag diagnostics)
861node, LookupResultKind.Empty, ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(BindToTypeForErrorRecovery(BindValue(node.Expression, BindingDiagnosticBag.Discarded, BindValueKind.RefersToLocation))),
865private BoundExpression BindRefType(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
872private BoundExpression BindScopedType(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
879private BoundExpression BindThrowExpression(ThrowExpressionSyntax node, BindingDiagnosticBag diagnostics)
890var thrownExpression = BindThrownExpression(node.Expression, diagnostics, ref hasErrors);
929private BoundExpression BindDeclarationExpressionAsError(DeclarationExpressionSyntax node, BindingDiagnosticBag diagnostics)
946private BoundExpression BindDeclarationVariablesForErrorRecovery(TypeWithAnnotations declTypeWithAnnotations, VariableDesignationSyntax node, CSharpSyntaxNode syntax, BindingDiagnosticBag diagnostics)
954var result = BindDeconstructionVariable(declTypeWithAnnotations, single, syntax, diagnostics);
965var builder = ArrayBuilder<BoundExpression>.GetInstance(count);
973ImmutableArray<BoundExpression> subExpressions = builder.ToImmutableAndFree();
1002private BoundExpression BindTupleExpression(TupleExpressionSyntax node, BindingDiagnosticBag diagnostics)
1014ImmutableArray<BoundExpression>.Empty;
1021var boundArguments = ArrayBuilder<BoundExpression>.GetInstance(arguments.Count);
1043BoundExpression boundArgument = BindValue(argumentSyntax.Expression, diagnostics, BindValueKind.RValue);
1049ImmutableArray.Create<BoundExpression>(boundArgument), CreateErrorType("void"));
1219private BoundExpression BindRefValue(RefValueExpressionSyntax node, BindingDiagnosticBag diagnostics)
1224BoundExpression argument = BindValue(node.Expression, diagnostics, BindValueKind.RValue);
1244private BoundExpression BindMakeRef(MakeRefExpressionSyntax node, BindingDiagnosticBag diagnostics)
1247BoundExpression argument = this.BindValue(node.Expression, diagnostics, BindValueKind.RefOrOut);
1268private BoundExpression BindRefType(RefTypeExpressionSyntax node, BindingDiagnosticBag diagnostics)
1272BoundExpression argument = BindValue(node.Expression, diagnostics, BindValueKind.RValue);
1290private BoundExpression BindArgList(CSharpSyntaxNode node, BindingDiagnosticBag diagnostics)
1357private BoundExpression BindQualifiedName(QualifiedNameSyntax node, BindingDiagnosticBag diagnostics)
1362private BoundExpression BindParenthesizedExpression(ExpressionSyntax innerExpression, BindingDiagnosticBag diagnostics)
1364var result = BindExpression(innerExpression, diagnostics);
1374private BoundExpression BindTypeOf(TypeOfExpressionSyntax node, BindingDiagnosticBag diagnostics)
1429private BoundExpression BindSizeOf(SizeOfExpressionSyntax node, BindingDiagnosticBag diagnostics)
1445private BoundExpression BindFieldExpression(FieldExpressionSyntax node, BindingDiagnosticBag diagnostics)
1568private BoundExpression BindDefaultExpression(DefaultExpressionSyntax node, BindingDiagnosticBag diagnostics)
1581private BoundExpression BindIdentifier(
1614BoundExpression expression;
1648var receiver = SynthesizeMethodGroupReceiver(node, members);
1877private BoundExpression SynthesizeMethodGroupReceiver(CSharpSyntaxNode syntax, ArrayBuilder<Symbol> members)
1987private BoundExpression BindNonMethod(SimpleNameSyntax node, Symbol symbol, BindingDiagnosticBag diagnostics, LookupResultKind resultKind, bool indexed, bool isError)
2212BoundExpression receiver = SynthesizeReceiver(node, symbol, diagnostics);
2218BoundExpression receiver = SynthesizeReceiver(node, symbol, diagnostics);
2224BoundExpression receiver = SynthesizeReceiver(node, symbol, diagnostics);
2285protected virtual BoundExpression BindRangeVariable(SimpleNameSyntax node, RangeVariableSymbol qv, BindingDiagnosticBag diagnostics)
2290private BoundExpression SynthesizeReceiver(SyntaxNode node, Symbol member, BindingDiagnosticBag diagnostics)
2366private BoundExpression TryBindInteractiveReceiver(SyntaxNode syntax, NamedTypeSymbol memberDeclaringType)
2408public BoundExpression BindNamespaceOrTypeOrExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2434public BoundExpression BindLabel(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2462public BoundExpression BindNamespaceOrType(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2468public BoundExpression BindNamespaceAlias(IdentifierNameSyntax node, BindingDiagnosticBag diagnostics)
2474private static BoundExpression CreateBoundNamespaceOrTypeExpression(ExpressionSyntax node, Symbol symbol)
2582private BoundExpression BindCast(CastExpressionSyntax node, BindingDiagnosticBag diagnostics)
2584BoundExpression operand = this.BindValue(node.Expression, diagnostics, BindValueKind.RValue);
2600private BoundExpression BindFromEndIndexExpression(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
2609BoundExpression boundOperand = BindValue(node.Operand, diagnostics, BindValueKind.RValue);
2637BoundExpression boundConversion = CreateConversion(boundOperand, conversion, intType, diagnostics);
2643private BoundExpression BindRangeExpression(RangeExpressionSyntax node, BindingDiagnosticBag diagnostics)
2689BoundExpression left = BindRangeExpressionOperand(node.LeftOperand, diagnostics);
2690BoundExpression right = BindRangeExpressionOperand(node.RightOperand, diagnostics);
2710private BoundExpression BindRangeExpressionOperand(ExpressionSyntax operand, BindingDiagnosticBag diagnostics)
2717BoundExpression boundOperand = BindValue(operand, diagnostics, BindValueKind.RValue);
2746private BoundExpression BindCastCore(ExpressionSyntax node, BoundExpression operand, TypeWithAnnotations targetTypeWithAnnotations, bool wasCompilerGenerated, BindingDiagnosticBag diagnostics)
2768BoundExpression operand,
2893ImmutableArray<BoundExpression> tupleArguments,
2905var argument = tupleArguments[i];
2925private BoundExpression BindExplicitNullableCastFromNonNullable(ExpressionSyntax node, BoundExpression operand, TypeWithAnnotations targetTypeWithAnnotations, BindingDiagnosticBag diagnostics)
2943var underlyingExpr = BindCastCore(node, operand, underlyingTargetTypeWithAnnotations, wasCompilerGenerated: false, diagnostics: bag);
2959var result = BindCastCore(node, operand, targetTypeWithAnnotations, wasCompilerGenerated: operand.WasCompilerGenerated, diagnostics: bag2);
3101BoundExpression boundArgument = BindArgumentValue(diagnostics, argumentSyntax, allowArglist, refKind);
3115var arg = result.Argument(0);
3132private BoundExpression BindArgumentValue(BindingDiagnosticBag diagnostics, ArgumentSyntax argumentSyntax, bool allowArglist, RefKind refKind)
3152private BoundExpression BindOutDeclarationArgument(DeclarationExpressionSyntax declarationExpression, BindingDiagnosticBag diagnostics)
3189private BoundExpression BindOutVariableDeclarationArgument(
3254BoundExpression receiver = SynthesizeReceiver(designation, expressionVariableField, diagnostics);
3331BoundExpression boundArgumentExpression,
3399private BoundExpression BindArgumentExpression(BindingDiagnosticBag diagnostics, ExpressionSyntax argumentExpression, RefKind refKind, bool allowArglist)
3408BoundExpression argument;
3427BoundExpression? receiver,
3435ArrayBuilder<BoundExpression>? paramsArgsBuilder = null;
3443BoundExpression argument = arguments[arg];
3482BoundExpression coerceArgument(
3484BoundExpression? receiver,
3486ArrayBuilder<BoundExpression>? argumentsForInterpolationConversion,
3487BoundExpression argument,
3494BoundExpression coercedArgument = argument;
3539static ArrayBuilder<BoundExpression> collectParamsArgs(
3542ArrayBuilder<BoundExpression> arguments,
3547var paramsArgsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
3573BoundExpression? receiver,
3577ArrayBuilder<BoundExpression> paramsArgsBuilder,
3603ImmutableArray<BoundExpression> collectionArgs = paramsArgsBuilder.ToImmutableAndFree();
3606BoundExpression collection = CreateParamsCollection(node, parameters[paramsIndex], collectionArgs, diagnostics);
3646void reportUnsafeIfNeeded(MemberResolutionResult<TMember> methodResult, BindingDiagnosticBag diagnostics, BoundExpression argument, TypeWithAnnotations parameterTypeWithAnnotations)
3663BoundExpression bindInterpolatedStringHandlerInMemberCall(
3664BoundExpression unconvertedString,
3666ArrayBuilder<BoundExpression>? arguments,
3670BoundExpression? receiver,
3868var interpolatedString = BindUnconvertedInterpolatedExpressionToHandlerType(
3888private void CheckArgumentRefKind(RefKind argRefKind, BoundExpression argument, int arg, ParameterSymbol parameter,
3960private BoundExpression BindArrayCreationExpression(ArrayCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
4044ArrayBuilder<BoundExpression> sizes = ArrayBuilder<BoundExpression>.GetInstance();
4049var size = BindArrayDimension(arg, diagnostics, ref hasErrors);
4070var size = BindRValueWithoutTargetType(arg, diagnostics);
4079ImmutableArray<BoundExpression> arraySizes = sizes.ToImmutableAndFree();
4086private BoundExpression BindArrayDimension(ExpressionSyntax dimension, BindingDiagnosticBag diagnostics, ref bool hasErrors)
4091var size = BindValue(dimension, diagnostics, BindValueKind.RValue);
4111private BoundExpression BindImplicitArrayCreationExpression(ImplicitArrayCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
4119ImmutableArray<BoundExpression> boundInitializerExpressions = BindArrayInitializerExpressions(initializer, diagnostics, dimension: 1, rank: rank);
4140sizes: ImmutableArray<BoundExpression>.Empty, boundInitExprOpt: boundInitializerExpressions);
4143private BoundExpression BindImplicitStackAllocArrayCreationExpression(ImplicitStackAllocArrayCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
4146ImmutableArray<BoundExpression> boundInitializerExpressions = BindArrayInitializerExpressions(initializer, diagnostics, dimension: 1, rank: 1);
4178private ImmutableArray<BoundExpression> BindArrayInitializerExpressions(InitializerExpressionSyntax initializer, BindingDiagnosticBag diagnostics, int dimension, int rank)
4180var exprBuilder = ArrayBuilder<BoundExpression>.GetInstance();
4195private void BindArrayInitializerExpressions(InitializerExpressionSyntax initializer, ArrayBuilder<BoundExpression> exprBuilder, BindingDiagnosticBag diagnostics, int dimension, int rank)
4207var boundExpression = BindValue(expression, diagnostics, BindValueKind.RValue);
4224var boundExpression = BindValue(expression, diagnostics, BindValueKind.RValue);
4266ImmutableArray<BoundExpression> boundInitExpr,
4272ArrayBuilder<BoundExpression> initializers = ArrayBuilder<BoundExpression>.GetInstance();
4282BoundExpression boundExpression = boundInitExpr[boundInitExprIndex];
4285BoundExpression convertedExpression = GenerateConversionForAssignment(elemType, boundExpression, diagnostics);
4294BoundExpression init = null;
4347ImmutableArray<BoundExpression> boundInitExprOpt = default(ImmutableArray<BoundExpression>))
4414ImmutableArray<BoundExpression> sizes,
4415ImmutableArray<BoundExpression> boundInitExprOpt = default(ImmutableArray<BoundExpression>),
4442var size = sizes[i];
4467BoundExpression[] sizeArray = new BoundExpression[rank];
4493private BoundExpression BindStackAllocArrayCreationExpression(
4506ImmutableArray<BoundExpression>.Empty,
4529var builder = ArrayBuilder<BoundExpression>.GetInstance();
4550BoundExpression count = null;
4654private BoundExpression BindStackAllocWithInitializer(
4660BoundExpression sizeOpt,
4663ImmutableArray<BoundExpression> boundInitExprOpt = default)
4706private static int? GetIntegerConstantForArraySize(BoundExpression expression)
4727private static bool IsNegativeConstantForArraySize(BoundExpression expression)
4773internal BoundExpression BindConstructorInitializer(
4785var result = (argumentListBinder ?? this).BindConstructorInitializerCore(initializerArgumentListOpt, constructor, diagnostics);
4797private BoundExpression BindConstructorInitializerCore(
4958private BoundExpression BindConstructorInitializerCoreContinued(
4991BoundExpression receiver = ThisReference(nonNullSyntax, initializerType, wasCompilerGenerated: true);
5130private static (ParameterSymbol, SyntaxNode) TryGetPrimaryConstructorParameterUsedAsValue(SynthesizedPrimaryConstructor primaryConstructor, BoundExpression boundExpression)
5165private BoundExpression BindImplicitObjectCreationExpression(ImplicitObjectCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
5182protected BoundExpression BindObjectCreationExpression(ObjectCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
5184BoundExpression result = bindObjectCreationExpression(node, diagnostics);
5191BoundExpression bindObjectCreationExpression(ObjectCreationExpressionSyntax node, BindingDiagnosticBag diagnostics)
5244private BoundExpression BindCollectionExpression(CollectionExpressionSyntax syntax, BindingDiagnosticBag diagnostics, int nestingLevel = 0)
5251return new BoundBadExpression(syntax, LookupResultKind.Empty, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, CreateErrorType());
5276var expression = @this.BindRValueWithoutTargetType(syntax.Expression, diagnostics);
5303var convertedExpression = @this.ConvertForEachCollection(expressionPlaceholder, conversion, collectionType, diagnostics);
5305BoundExpression? lengthOrCount;
5332private BoundExpression BindDelegateCreationExpression(ObjectCreationExpressionSyntax node, NamedTypeSymbol type, BindingDiagnosticBag diagnostics)
5336var result = BindDelegateCreationExpression(node, type, analyzedArguments, node.Initializer, wasTargetTyped: false, diagnostics);
5341private BoundExpression BindDelegateCreationExpression(SyntaxNode node, NamedTypeSymbol type, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax initializerOpt, bool wasTargetTyped, BindingDiagnosticBag diagnostics)
5375BoundExpression argument = analyzedArguments.Arguments.Count >= 1 ? BindToNaturalType(analyzedArguments.Arguments[0], diagnostics) : null;
5510private BoundExpression BindClassCreationExpression(ObjectCreationExpressionSyntax node, NamedTypeSymbol type, string typeName, BindingDiagnosticBag diagnostics, TypeSymbol initializerType = null)
5544private BoundExpression MakeConstructorInvocation(
5546ArrayBuilder<BoundExpression> arguments,
5565var creation = BindClassCreationExpression(node, type.Name, node, type, analyzedArguments, diagnostics);
5575internal BoundExpression BindObjectCreationForErrorRecovery(BoundUnconvertedObjectCreationExpression node, BindingDiagnosticBag diagnostics)
5578var result = MakeBadExpressionForObjectCreation(node.Syntax, CreateErrorType(), arguments, node.InitializerOpt, typeSyntax: node.Syntax, diagnostics);
5583private BoundExpression MakeBadExpressionForObjectCreation(ObjectCreationExpressionSyntax node, TypeSymbol type, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics, bool wasCompilerGenerated = false)
5589private BoundExpression MakeBadExpressionForObjectCreation(SyntaxNode node, TypeSymbol type, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax? initializerOpt, SyntaxNode? typeSyntax, BindingDiagnosticBag diagnostics, bool wasCompilerGenerated = false)
5591var children = ArrayBuilder<BoundExpression>.GetInstance();
5639private BoundExpression BindInitializerExpressionOrValue(
5691var initializers = ArrayBuilder<BoundExpression>.GetInstance(initializerSyntax.Expressions.Count);
5697BoundExpression boundMemberInitializer = BindInitializerMemberAssignment(
5712private BoundExpression BindInitializerMemberAssignment(
5734BoundExpression boundLeft = objectInitializerMemberBinder.BindObjectInitializerMember(initializer, implicitReceiver, diagnostics);
5745BoundExpression boundRight = BindInitializerExpressionOrValue(
5768var boundNode = objectInitializerMemberBinder.BindObjectInitializerMemberMissingAssignment(identifierName, implicitReceiver, diagnostics);
5790var boundExpression = BindValue(memberInitializer, diagnostics, BindValueKind.RValue);
5796private BoundExpression BindObjectInitializerMember(
5812private BoundExpression BindObjectInitializerMemberMissingAssignment(
5822private BoundExpression BindObjectInitializerMemberCommon(
5829BoundExpression boundMember;
5911ImmutableArray<BoundExpression> arguments = ImmutableArray<BoundExpression>.Empty;
5963foreach (var argument in arguments)
6062private BoundExpression BadObjectInitializerMemberAccess(
6063BoundExpression boundMember,
6104private static void ReportDuplicateObjectMemberInitializers(BoundExpression boundMemberInitializer, HashSet<string> memberNameMap, BindingDiagnosticBag diagnostics)
6146ImmutableArray<BoundExpression> initializers,
6165foreach (var initializer in initializers)
6256var initializerBuilder = ArrayBuilder<BoundExpression>.GetInstance();
6281BoundExpression boundElementInitializer = BindCollectionInitializerElement(elementInitializer, initializerType,
6326private BoundExpression BindCollectionInitializerElement(
6356var boundElementInitializer = BindInitializerExpressionOrValue(elementInitializer, initializerType, BindValueKind.RValue, implicitReceiver.Syntax, diagnostics);
6358BoundExpression result = BindCollectionInitializerElementAddMethod(
6371private BoundExpression BindComplexElementInitializerExpression(
6382var exprBuilder = ArrayBuilder<BoundExpression>.GetInstance();
6403private BoundExpression BindUnexpectedComplexElementInitializer(InitializerExpressionSyntax node, BindingDiagnosticBag diagnostics)
6410private BoundExpression BindCollectionInitializerElementAddMethod(
6412ImmutableArray<BoundExpression> boundElementInitializerExpressions,
6443var result = bindCollectionInitializerElementAddMethod(elementInitializer, boundElementInitializerExpressions, collectionInitializerAddMethodBinder, diagnostics, implicitReceiver);
6462BoundExpression bindCollectionInitializerElementAddMethod(
6464ImmutableArray<BoundExpression> boundElementInitializerExpressions,
6490var addMethodInvocation = collectionInitializerAddMethodBinder.MakeInvocationExpression(
6586var addMethodInvocation = BindCollectionInitializerElementAddMethod(
6588ImmutableArray.Create((BoundExpression)addElementPlaceholder),
6664protected BoundExpression BindClassCreationExpression(
6682BoundExpression result = null;
6846private BoundExpression CreateBadClassCreationExpression(
6896var childNodes = ArrayBuilder<BoundExpression>.GetInstance();
6919private BoundExpression BindInterfaceCreationExpression(ObjectCreationExpressionSyntax node, NamedTypeSymbol type, BindingDiagnosticBag diagnostics)
6923var result = BindInterfaceCreationExpression(node, type, diagnostics, node.Type, analyzedArguments, node.Initializer, wasTargetTyped: false);
6928private BoundExpression BindInterfaceCreationExpression(SyntaxNode node, NamedTypeSymbol type, BindingDiagnosticBag diagnostics, SyntaxNode typeNode, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax initializerOpt, bool wasTargetTyped)
6954private BoundExpression BindComImportCoClassCreationExpression(SyntaxNode node, NamedTypeSymbol interfaceType, NamedTypeSymbol coClassType, BindingDiagnosticBag diagnostics, SyntaxNode typeNode, AnalyzedArguments analyzedArguments, InitializerExpressionSyntax initializerOpt, bool wasTargetTyped)
6992var classCreation = BindClassCreationExpression(
7035private BoundExpression BindNoPiaObjectCreationExpression(
7077private BoundExpression BindTypeParameterCreationExpression(ObjectCreationExpressionSyntax node, TypeParameterSymbol typeParameter, BindingDiagnosticBag diagnostics)
7081var result = BindTypeParameterCreationExpression(node, typeParameter, analyzedArguments, node.Initializer, node.Type, wasTargetTyped: false, diagnostics);
7098private BoundExpression BindTypeParameterCreationExpression(
7407private BoundExpression BindCheckedExpression(CheckedExpressionSyntax node, BindingDiagnosticBag diagnostics)
7416private BoundExpression BindMemberAccess(
7425BoundExpression boundLeft;
7469private BoundExpression BindLeftOfPotentialColorColorMemberAccess(ExpressionSyntax left, BindingDiagnosticBag diagnostics)
7482private BoundExpression BindLeftIdentifierOfPotentialColorColorMemberAccess(IdentifierNameSyntax left, BindingDiagnosticBag diagnostics)
7497var boundValue = BindIdentifier(left, invoked: false, indexed: false, diagnostics: valueDiagnostics);
7527var boundType = BindNamespaceOrType(left, typeDiagnostics);
7579private BoundExpression BindDynamicMemberAccess(
7581BoundExpression boundLeft,
7638/// <see cref="MakeQueryInvocation(CSharpSyntaxNode, BoundExpression, string, TypeSyntax, TypeWithAnnotations, BindingDiagnosticBag, string)"/>.
7650private BoundExpression BindMemberAccessWithBoundLeft(
7652BoundExpression boundLeft,
7735BoundExpression result;
7800BoundExpression tryBindMemberAccessWithBoundNamespaceLeft(
7803BoundExpression boundLeft,
7872BoundExpression tryBindMemberAccessWithBoundTypeLeft(
7874BoundExpression boundLeft,
7923var nonMethodExtensionMember = ResolveExtensionMemberAccessIfResultIsNonMethod(node, boundLeft, rightName,
7940private void WarnOnAccessOfOffDefault(SyntaxNode node, BoundExpression boundLeft, BindingDiagnosticBag diagnostics)
7954private BoundExpression MakeMemberAccessValue(BoundExpression expr, BindingDiagnosticBag diagnostics)
8002internal BoundExpression? ResolveExtensionMemberAccessIfResultIsNonMethod(SyntaxNode syntax, BoundExpression receiver, string name,
8031private BoundExpression GetExtensionMemberAccess(SyntaxNode syntax, BoundExpression? receiver, Symbol extensionMember, BindingDiagnosticBag diagnostics)
8058private BoundExpression BindInstanceMemberAccess(
8061BoundExpression boundLeft,
8105BoundExpression colorColorValueReceiver = GetValueExpressionIfTypeOrValueReceiver(boundLeft);
8114var nonMethodExtensionMember = ResolveExtensionMemberAccessIfResultIsNonMethod(node, boundLeft, rightName,
8136private BoundMethodGroup MakeBoundMethodGroupAndCheckOmittedTypeArguments(BoundExpression boundLeft, string rightName,
8189BoundExpression boundLeft,
8264private BoundExpression BindMemberAccessBadResult(BoundMethodGroup node)
8274private BoundExpression BindMemberAccessBadResult(
8277BoundExpression boundLeft,
8316boundLeft == null ? ImmutableArray<BoundExpression>.Empty : ImmutableArray.Create(BindToTypeForErrorRecovery(boundLeft)),
8346private static void CombineExtensionMethodArguments(BoundExpression receiver, AnalyzedArguments originalArguments, AnalyzedArguments extensionMethodArguments)
8370private static void InitializeExtensionPropertyArguments(BoundExpression receiver, AnalyzedArguments extensionPropertyArguments)
8384private BoundExpression BindMemberOfType(
8390BoundExpression left,
8403BoundExpression result;
8468boundDimensionsOpt: ImmutableArray<BoundExpression>.Empty,
8508BoundExpression left,
8588BoundExpression left,
8697BoundExpression left,
8782BoundExpression left,
8828private bool AllowRefOmittedArguments(BoundExpression receiver)
8840BoundExpression left,
8890protected BoundExpression BindFieldAccess(
8892BoundExpression receiver,
8995BoundExpression expr = new BoundFieldAccess(node, receiver, fieldSymbol, constantValueOpt, resultKind, fieldType, hasErrors: (hasErrors || hasError));
9050private BoundExpression BindPropertyAccess(
9052BoundExpression? receiver,
9071private void CheckReceiverAndRuntimeSupportForSymbolAccess(SyntaxNode node, BoundExpression receiverOpt, Symbol symbol, BindingDiagnosticBag diagnostics)
9130private BoundExpression BindEventAccess(
9132BoundExpression receiver,
9153private static bool? IsInstanceReceiver(BoundExpression receiver)
9178BoundExpression receiver,
9346private BoundExpression BindElementAccess(ElementAccessExpressionSyntax node, BindingDiagnosticBag diagnostics)
9348BoundExpression receiver = BindExpression(node.Expression, diagnostics: diagnostics, invoked: false, indexed: true);
9352private BoundExpression BindElementAccess(ExpressionSyntax node, BoundExpression receiver, BracketedArgumentListSyntax argumentList, bool allowInlineArrayElementAccess, BindingDiagnosticBag diagnostics)
9377private BoundExpression BindElementOrIndexerAccess(ExpressionSyntax node, BoundExpression expr, AnalyzedArguments analyzedArguments, bool allowInlineArrayElementAccess, BindingDiagnosticBag diagnostics)
9424BoundExpression result = BindElementAccessCore(node, expr, analyzedArguments, diagnosticsForBindElementAccessCore);
9443BoundExpression tryImplicitConversionToInlineArrayIndex(ExpressionSyntax node, BoundExpression index, BindingDiagnosticBag diagnostics, out WellKnownType indexOrRangeWellknownType)
9446BoundExpression convertedIndex = TryImplicitConversionToArrayIndex(index, SpecialType.System_Int32, node, diagnostics);
9469BoundExpression bindInlineArrayElementAccess(ExpressionSyntax node, BoundExpression expr, int length, AnalyzedArguments analyzedArguments, BoundExpression convertedIndex, WellKnownType indexOrRangeWellknownType, FieldSymbol elementField, BindingDiagnosticBag diagnostics)
9544if (rangeExpr.LeftOperandOpt is BoundExpression left)
9549if (rangeExpr.RightOperandOpt is BoundExpression right)
9594void checkInlineArrayBoundsForSystemIndex(BoundExpression convertedIndex, int length, bool excludeEnd, BindingDiagnosticBag diagnostics)
9606internal static int? InferConstantIndexFromSystemIndex(CSharpCompilation compilation, BoundExpression convertedIndex, int length, out SyntaxNode location)
9639private BoundExpression BadIndexerExpression(SyntaxNode node, BoundExpression expr, AnalyzedArguments analyzedArguments, DiagnosticInfo errorOpt, BindingDiagnosticBag diagnostics)
9650private BoundExpression BindElementAccessCore(
9652BoundExpression expr,
9685private BoundExpression BindArrayAccess(SyntaxNode node, BoundExpression expr, AnalyzedArguments arguments, BindingDiagnosticBag diagnostics)
9720BoundExpression[] convertedArguments = new BoundExpression[arguments.Arguments.Count];
9724BoundExpression argument = arguments.Arguments[i];
9726BoundExpression index = ConvertToArrayIndex(argument, diagnostics, allowIndexAndRange: rank == 1, out indexOrRangeWellknownType);
9760indexerOrSliceAccess: new BoundArrayAccess(node, receiverPlaceholder, ImmutableArray<BoundExpression>.CastUp(argumentPlaceholders), resultType) { WasCompilerGenerated = true },
9768private BoundExpression ConvertToArrayIndex(BoundExpression index, BindingDiagnosticBag diagnostics, bool allowIndexAndRange, out WellKnownType indexOrRangeWellknownType)
9784var result =
9835private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, WellKnownType wellKnownType, SyntaxNode node, BindingDiagnosticBag diagnostics)
9846var result = TryImplicitConversionToArrayIndex(expr, type, node, attemptDiagnostics);
9856private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, SpecialType specialType, SyntaxNode node, BindingDiagnosticBag diagnostics)
9862var result = TryImplicitConversionToArrayIndex(expr, type, node, attemptDiagnostics);
9873private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, TypeSymbol targetType, SyntaxNode node, BindingDiagnosticBag diagnostics)
9891BoundExpression result = CreateConversion(expr.Syntax, expr, conversion, isCast: false, conversionGroupOpt: null, destination: targetType, diagnostics); // UNDONE: was cast?
9897private BoundExpression BindPointerElementAccess(SyntaxNode node, BoundExpression expr, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
9919ArrayBuilder<BoundExpression> arguments = analyzedArguments.Arguments;
9936BoundExpression index = arguments[0];
9958private BoundExpression BindIndexerAccess(SyntaxNode node, BoundExpression expr, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
9972BoundExpression indexerAccessExpression;
10028private BoundExpression BindIndexedPropertyAccess(BoundPropertyGroup propertyGroup, bool mustHaveAllOptionalParameters, BindingDiagnosticBag diagnostics)
10031var receiver = propertyGroup.ReceiverOpt;
10045ImmutableArray<BoundExpression>.Empty,
10052var result = BindIndexedPropertyAccess(syntax, receiver, properties, arguments, diagnostics);
10058private BoundExpression BindIndexedPropertyAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<PropertySymbol> propertyGroup, AnalyzedArguments arguments, BindingDiagnosticBag diagnostics)
10065var result = BindIndexerOrIndexedPropertyAccess(syntax, receiver, properties, arguments, diagnostics);
10071private BoundExpression BindDynamicIndexer(
10073BoundExpression receiver,
10115private BoundExpression BindIndexerOrIndexedPropertyAccess(
10117BoundExpression receiver,
10155private BoundExpression BindIndexerOrIndexedPropertyAccessContinued(
10157BoundExpression receiver,
10163BoundExpression propertyAccess;
10202ImmutableArray<BoundExpression> arguments = BuildArgumentsForErrorRecovery(analyzedArguments, candidates);
10264BoundExpression receiver,
10298out var lengthOrCountAccess, out var indexerOrSliceAccess, out var argumentPlaceholders, diagnostics))
10351[NotNullWhen(true)] out BoundExpression? lengthOrCountAccess,
10352[NotNullWhen(true)] out BoundExpression? indexerOrSliceAccess,
10384[NotNullWhen(true)] out BoundExpression? indexerOrSliceAccess,
10486void makeCall(SyntaxNode syntax, BoundExpression receiver, MethodSymbol method,
10487out BoundExpression indexerOrSliceAccess, out ImmutableArray<BoundImplicitIndexerValuePlaceholder> argumentPlaceholders)
10523out BoundExpression lengthOrCountAccess,
10887var receiver = node.ReceiverOpt!;
11060BoundExpression receiver = node.ReceiverOpt;
11326BoundExpression receiver = BindConditionalAccessReceiver(node, diagnostics);
11329var access = conditionalAccessBinder.BindValue(node.WhenNotNull, diagnostics, BindValueKind.RValue);
11430private BoundConditionalAccess GenerateBadConditionalAccessNodeError(ConditionalAccessExpressionSyntax node, BoundExpression receiver, BoundExpression access, BindingDiagnosticBag diagnostics)
11439private BoundExpression BindMemberBindingExpression(MemberBindingExpressionSyntax node, bool invoked, bool indexed, BindingDiagnosticBag diagnostics)
11441BoundExpression receiver = GetReceiverForConditionalBinding(node, diagnostics);
11443var memberAccess = BindMemberAccessWithBoundLeft(node, receiver, node.Name, node.OperatorToken, invoked, indexed, diagnostics);
11447private BoundExpression BindElementBindingExpression(ElementBindingExpressionSyntax node, BindingDiagnosticBag diagnostics)
11449BoundExpression receiver = GetReceiverForConditionalBinding(node, diagnostics);
11451var memberAccess = BindElementAccess(node, receiver, node.ArgumentList, allowInlineArrayElementAccess: true, diagnostics);
11470private BoundExpression GetReceiverForConditionalBinding(ExpressionSyntax binding, BindingDiagnosticBag diagnostics)
11475BoundExpression receiver = this.ConditionalReceiverExpression;
11495private BoundExpression BindConditionalAccessReceiver(ConditionalAccessExpressionSyntax node, BindingDiagnosticBag diagnostics)
11498var 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 (81)
20/// This portion of the binder converts an <see cref="ExpressionSyntax"/> into a <see cref="BoundExpression"/>.
24private BoundExpression BindMethodGroup(ExpressionSyntax node, bool invoked, bool indexed, BindingDiagnosticBag diagnostics)
77internal BoundExpression MakeInvocationExpression(
79BoundExpression receiver,
81ImmutableArray<BoundExpression> args,
104var boundExpression = BindInstanceMemberAccess(node, node, receiver, methodName, typeArgs.NullToEmpty().Length, typeArgsSyntax, typeArgs, invoked: true, indexed: false, diagnostics, searchExtensionsIfNecessary);
139BoundExpression result = BindInvocationExpression(
158private static void ReportMakeInvocationExpressionBadMemberKind(SyntaxNode node, string methodName, BoundExpression boundExpression, BindingDiagnosticBag diagnostics)
182private BoundExpression BindInvocationExpression(
186BoundExpression result;
213BoundExpression boundExpression = BindMethodGroup(node.Expression, invoked: true, indexed: false, diagnostics: diagnostics);
236BoundExpression boundExpression = BindMethodGroup(node.Expression, invoked: true, indexed: false, diagnostics: diagnostics);
243BoundExpression bindArgumentsAndInvocation(InvocationExpressionSyntax node, BoundExpression boundExpression, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
264private BoundExpression BindArgListOperator(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics, AnalyzedArguments analyzedArguments)
272BoundExpression argument = analyzedArguments.Arguments[i];
312ImmutableArray<BoundExpression> arguments = analyzedArguments.Arguments.ToImmutable();
320private BoundExpression BindInvocationExpression(
324BoundExpression boundExpression,
340BoundExpression result;
392private BoundExpression BindDynamicInvocation(
394BoundExpression expression,
403BoundExpression? receiver;
451BoundExpression finalReceiver = ReplaceTypeOrValueReceiver(typeOrValue, useType, diagnostics);
481ImmutableArray<BoundExpression> argArray = BuildArgumentsForDynamicInvocation(arguments, diagnostics);
525private ImmutableArray<BoundExpression> BuildArgumentsForDynamicInvocation(AnalyzedArguments arguments, BindingDiagnosticBag diagnostics)
527var builder = ArrayBuilder<BoundExpression>.GetInstance(arguments.Arguments.Count);
546BoundExpression? receiver,
547ImmutableArray<BoundExpression> arguments,
575foreach (var arg in arguments)
622private BoundExpression BindDelegateInvocation(
626BoundExpression boundExpression,
632BoundExpression result;
691private BoundExpression BindMethodGroupInvocation(
712BoundExpression result = null;
726BoundExpression extensionMemberAccess = GetExtensionMemberAccess(expression, methodGroup.ReceiverOpt, extensionMember, diagnostics);
731BoundExpression extensionMemberInvocation = BindInvocationExpression(syntax, expression, methodName: null, extensionMemberAccess, analyzedArguments, diagnostics, acceptOnlyMethods: false);
872private bool IsAmbiguousDynamicParamsArgument<TMethodOrPropertySymbol>(ArrayBuilder<BoundExpression> arguments, MemberResolutionResult<TMethodOrPropertySymbol> candidate, out SyntaxNode argumentSyntax)
950private BoundExpression TryEarlyBindSingleCandidateInvocationWithDynamicArgument(
970BoundExpression result = BindInvocationExpressionContinued(
989BoundExpression receiverOpt,
1050private void CheckRestrictedTypeReceiver(BoundExpression expression, CSharpCompilation compilation, BindingDiagnosticBag diagnostics)
1234var receiver = ReplaceTypeOrValueReceiver(methodGroup.Receiver, !method.RequiresInstanceReceiver && !invokedAsExtensionMethod, diagnostics);
1253BoundExpression receiverArgument = analyzedArguments.Argument(0);
1364private BoundExpression CheckAndConvertExtensionReceiver(BoundExpression receiver, ParameterSymbol extensionParameter, BindingDiagnosticBag diagnostics)
1379internal ThreeState ReceiverIsSubjectToCloning(BoundExpression? receiver, PropertySymbol property)
1392internal ThreeState ReceiverIsSubjectToCloning(BoundExpression? receiver, MethodSymbol method)
1421private BoundExpression GetDefaultParameterSpecialNoConversion(SyntaxNode syntax, ParameterSymbol parameter, BindingDiagnosticBag diagnostics)
1438BoundExpression? defaultValue = null;
1524ArrayBuilder<BoundExpression> argumentsBuilder,
1629BoundExpression collection = CreateParamsCollection(node, parameters[paramsIndex], collectionArgs: ImmutableArray<BoundExpression>.Empty, diagnostics);
1655BoundExpression bindDefaultArgument(SyntaxNode syntax, ParameterSymbol parameter, Symbol? containingMember, bool enableCallerInfo, BindingDiagnosticBag diagnostics, ArrayBuilder<BoundExpression> argumentsBuilder, int argumentsCount, ImmutableArray<int> argsToParamsOpt)
1682BoundExpression defaultValue;
1774private BoundExpression CreateParamsCollection(SyntaxNode node, ParameterSymbol paramsParameter, ImmutableArray<BoundExpression> collectionArgs, BindingDiagnosticBag diagnostics)
1777BoundExpression collection;
1782BoundExpression arraySize = new BoundLiteral(node, ConstantValue.Create(collectionArgs.Length), int32Type) { WasCompilerGenerated = true };
1837internal bool CheckImplicitThisCopyInReadOnlyMember(BoundExpression receiver, MethodSymbol method, BindingDiagnosticBag diagnostics)
1885private BoundExpression ReplaceTypeOrValueReceiver(BoundExpression receiver, bool useType, BindingDiagnosticBag diagnostics)
1923var value = q.Value;
1924var replaced = ReplaceTypeOrValueReceiver(value, useType, diagnostics);
1932private static BoundExpression GetValueExpressionIfTypeOrValueReceiver(BoundExpression receiver)
1956private static NamedTypeSymbol GetDelegateType(BoundExpression expr)
1972BoundExpression receiver,
1981ImmutableArray<BoundExpression> args;
2047private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments, ImmutableArray<MethodSymbol> methods)
2067private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments, ImmutableArray<PropertySymbol> properties)
2088private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments, IEnumerable<ImmutableArray<ParameterSymbol>> parameterListList)
2091ArrayBuilder<BoundExpression> newArguments = ArrayBuilder<BoundExpression>.GetInstance(argumentCount);
2243private ImmutableArray<BoundExpression> BuildArgumentsForErrorRecovery(AnalyzedArguments analyzedArguments)
2250BoundExpression expr,
2286private bool TryBindNameofOperator(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics, out BoundExpression result)
2302private BoundExpression BindNameofOperatorInternal(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics)
2306var boundArgument = BindExpression(argument, diagnostics);
2446private BoundFunctionPointerInvocation BindFunctionPointerInvocation(SyntaxNode node, BoundExpression boundExpression, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
Binder\Binder_Operators.cs (128)
24private BoundExpression BindCompoundAssignment(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics)
28BoundExpression left = BindValue(node.Left, diagnostics, GetBinaryAssignmentKind(node.Kind()));
30BoundExpression right = BindValue(node.Right, diagnostics, BindValueKind.RValue);
205BoundExpression rightConverted = CreateConversion(right, best.RightConversion, bestSignature.RightType, diagnostics);
214BoundExpression? finalConversion = GenerateConversionForAssignment(leftType, finalPlaceholder, diagnostics,
257var leftConversion = CreateConversion(node.Left, leftPlaceholder, best.LeftConversion, isCast: false, conversionGroupOpt: null, best.Signature.LeftType, diagnostics);
262BoundCompoundAssignmentOperator? tryApplyUserDefinedInstanceOperator(ExpressionSyntax node, SyntaxToken operatorToken, BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
333BoundExpression rightConverted = CreateConversion(right, overloadResolutionResult.ValidResult.Result.ConversionForArg(0), method.Parameters[0].Type, diagnostics);
403private BoundExpression BindEventAssignment(AssignmentExpressionSyntax node, BoundEventAccess left, BoundExpression right, BinaryOperatorKind opKind, BindingDiagnosticBag diagnostics)
410BoundExpression receiverOpt = left.ReceiverOpt;
426BoundExpression argument = CreateConversion(right, argumentConversion, delegateType, diagnostics);
488private static bool IsLegalDynamicOperand(BoundExpression operand)
511private BoundExpression BindDynamicBinaryOperator(
514BoundExpression left,
515BoundExpression right,
595private BoundExpression BindSimpleBinaryOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
614BoundExpression result = BindExpression(current, diagnostics);
640BoundExpression left = CheckValue(result, bindValueKind, diagnostics);
641BoundExpression right = BindValue(syntaxNode.Right, diagnostics, BindValueKind.RValue);
642BoundExpression boundOp = BindSimpleBinaryOperator(syntaxNode, diagnostics, left, right, leaveUnconvertedIfInterpolatedString: true);
650private BoundExpression BindSimpleBinaryOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics,
651BoundExpression left, BoundExpression right, bool leaveUnconvertedIfInterpolatedString)
776BoundExpression resultLeft = left;
777BoundExpression resultRight = right;
843private bool BindSimpleBinaryOperatorParts(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, BinaryOperatorKind kind,
900private BoundExpression RebindSimpleBinaryOperatorAsConverted(BoundBinaryOperator unconvertedBinaryOperator, BindingDiagnosticBag diagnostics)
907var result = doRebind(diagnostics, unconvertedBinaryOperator);
910BoundExpression doRebind(BindingDiagnosticBag diagnostics, BoundBinaryOperator? current)
922BoundExpression? left = null;
942private static void ReportUnaryOperatorError(CSharpSyntaxNode node, BindingDiagnosticBag diagnostics, string operatorName, BoundExpression operand, LookupResultKind resultKind)
957private void ReportAssignmentOperatorError(AssignmentExpressionSyntax node, BinaryOperatorKind kind, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, LookupResultKind resultKind)
976private void ReportBinaryOperatorError(ExpressionSyntax node, BindingDiagnosticBag diagnostics, SyntaxToken operatorToken, BoundExpression left, BoundExpression right, LookupResultKind resultKind)
1034private BoundExpression BindConditionalLogicalOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
1057BoundExpression left = BindRValueWithoutTargetType(child, diagnostics);
1062BoundExpression right = BindRValueWithoutTargetType(binary.Right, diagnostics);
1071private BoundExpression BindConditionalLogicalOperator(BinaryExpressionSyntax node, BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
1143var resultLeft = CreateConversion(left, best.LeftConversion, signature.LeftType, diagnostics);
1144var resultRight = CreateConversion(right, best.RightConversion, signature.RightType, diagnostics);
1165BoundExpression operandConversion = CreateConversion(
1215private bool IsValidDynamicCondition(BoundExpression left, bool isNegative, BindingDiagnosticBag diagnostics, out MethodSymbol userDefinedOperator)
1505BoundExpression left,
1506BoundExpression right,
1582private bool IsTypelessExpressionAllowedInBinaryOperator(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
1606BoundExpression operand,
1856internal static TypeSymbol GetEnumType(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
1906BoundExpression left,
1907BoundExpression right,
1924BoundExpression newLeftOperand = CreateConversion(left, underlyingType, diagnostics);
1925BoundExpression newRightOperand = CreateConversion(right, underlyingType, diagnostics);
1981BoundExpression left,
1982BoundExpression right,
2135private static ConstantValue? TryFoldingNullableEquality(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2458private BoundExpression BindIncrementOperator(ExpressionSyntax node, ExpressionSyntax operandSyntax, SyntaxToken operatorToken, BindingDiagnosticBag diagnostics)
2462BoundExpression operand = BindToNaturalType(BindValue(operandSyntax, diagnostics, BindValueKind.IncrementDecrement), diagnostics);
2542BoundExpression? resultConversion = GenerateConversionForAssignment(operandType, resultPlaceholder, diagnostics, ConversionForAssignmentFlags.IncrementAssignment);
2563var operandConversion = CreateConversion(node, operandPlaceholder, best.Conversion, isCast: false, conversionGroupOpt: null, best.Signature.OperandType, diagnostics);
2580BoundIncrementOperator? tryApplyUserDefinedInstanceOperator(ExpressionSyntax node, SyntaxToken operatorToken, UnaryOperatorKind kind, BoundExpression operand, BindingDiagnosticBag diagnostics)
2880private BoundExpression BindSuppressNullableWarningExpression(PostfixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
2884var expr = BindExpression(node.Operand, diagnostics);
2904private BoundExpression BindPointerIndirectionExpression(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
2906BoundExpression operand = BindToNaturalType(BindValue(node.Operand, diagnostics, GetUnaryAssignmentKind(node.Kind())), diagnostics);
2915private static void BindPointerIndirectionExpressionInternal(CSharpSyntaxNode node, BoundExpression operand, BindingDiagnosticBag diagnostics, out TypeSymbol pointedAtType, out bool hasErrors)
2951private BoundExpression BindAddressOfExpression(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
2953BoundExpression operand = BindToNaturalType(BindValue(node.Operand, diagnostics, BindValueKind.AddressOf), diagnostics);
3003internal bool IsMoveableVariable(BoundExpression expr, out Symbol accessedLocalOrParameterOpt)
3016BoundExpression receiver;
3129BoundExpression underlyingExpr = ((BoundPointerElementAccess)expr).Expression;
3148private BoundExpression BindUnaryOperator(PrefixUnaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
3150BoundExpression operand = BindToNaturalType(BindValue(node.Operand, diagnostics, GetUnaryAssignmentKind(node.Kind())), diagnostics);
3155private void ReportSuppressionIfNeeded(BoundExpression expr, BindingDiagnosticBag diagnostics)
3164private BoundExpression BindUnaryOperatorCore(CSharpSyntaxNode node, string operatorText, BoundExpression operand, BindingDiagnosticBag diagnostics)
3229var resultOperand = CreateConversion(operand.Syntax, operand, best.Conversion, isCast: false, conversionGroupOpt: null, signature.OperandType, diagnostics);
3251BoundExpression operand,
3256BoundExpression newOperand = CreateConversion(operand, underlyingType, diagnostics);
3286BoundExpression operand,
3507private BoundLiteral BindIntegralMinValConstants(PrefixUnaryExpressionSyntax node, BoundExpression operand, BindingDiagnosticBag diagnostics)
3596private bool IsOperandErrors(CSharpSyntaxNode node, ref BoundExpression operand, BindingDiagnosticBag diagnostics)
3658private BoundExpression BindIsOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
3661var operand = BindRValueWithoutTargetType(node.Left, diagnostics);
3683var convertedExpression = BindExpressionForPattern(operand.Type, node.Right, ref hasErrors, isPatternDiagnostics, out var constantValueOpt, out var wasExpression, out _);
4129private BoundExpression BindAsOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4131var operand = BindRValueWithoutTargetType(node.Left, diagnostics);
4216BoundExpression operandConversion;
4411private BoundExpression GenerateNullCoalescingBadBinaryOpsError(BinaryExpressionSyntax node, BoundExpression leftOperand, BoundExpression rightOperand, BindingDiagnosticBag diagnostics)
4421private BoundExpression BindNullCoalescingOperator(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics)
4423var leftOperand = BindValue(node.Left, diagnostics, BindValueKind.RValue);
4425var rightOperand = BindValue(node.Right, diagnostics, BindValueKind.RValue);
4491var leftConversion = CreateConversion(node, leftPlaceholder,
4513var convertedRightOperand = CreateConversion(rightOperand, rightConversion, optLeftType0, diagnostics);
4529var convertedRightOperand = CreateConversion(rightOperand, rightConversion, optLeftType, diagnostics);
4581var leftConversion = CreateConversion(node, leftPlaceholder, leftConversionClassification, isCast: false, conversionGroupOpt: null, optRightType, diagnostics);
4595var leftConversion = CreateConversion(node, leftPlaceholder, leftConversionClassification, isCast: false, conversionGroupOpt: null, optRightType, diagnostics);
4608private BoundExpression BindNullCoalescingAssignmentOperator(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics)
4612BoundExpression leftOperand = BindValue(node.Left, diagnostics, BindValueKind.CompoundAssignment);
4614BoundExpression rightOperand = BindValue(node.Right, diagnostics, BindValueKind.RValue);
4647var convertedRightOperand = CreateConversion(rightOperand, underlyingRightConversion, underlyingLeftType, diagnostics);
4661var convertedRightOperand = CreateConversion(rightOperand, rightConversion, leftType, diagnostics);
4669private BoundExpression GenerateNullCoalescingAssignmentBadBinaryOpsError(AssignmentExpressionSyntax node, BoundExpression leftOperand, BoundExpression rightOperand, BindingDiagnosticBag diagnostics)
4711private BoundExpression BindConditionalOperator(ConditionalExpressionSyntax node, BindingDiagnosticBag diagnostics)
4738private BoundExpression BindValueConditionalOperator(ConditionalExpressionSyntax node, ExpressionSyntax whenTrue, ExpressionSyntax whenFalse, BindingDiagnosticBag diagnostics)
4740BoundExpression condition = BindBooleanExpression(node.Condition, diagnostics);
4741BoundExpression trueExpr = BindValue(whenTrue, diagnostics, BindValueKind.RValue);
4742BoundExpression falseExpr = BindValue(whenFalse, diagnostics, BindValueKind.RValue);
4779private BoundExpression BindRefConditionalOperator(ConditionalExpressionSyntax node, ExpressionSyntax whenTrue, ExpressionSyntax whenFalse, BindingDiagnosticBag diagnostics)
4781BoundExpression condition = BindBooleanExpression(node.Condition, diagnostics);
4782BoundExpression trueExpr = BindValue(whenTrue, diagnostics, BindValueKind.RValue | BindValueKind.RefersToLocation);
4783BoundExpression falseExpr = BindValue(whenFalse, diagnostics, BindValueKind.RValue | BindValueKind.RefersToLocation);
4816private void ValidateRefConditionalOperator(SyntaxNode node, BoundExpression trueExpr, BoundExpression falseExpr, BindingDiagnosticBag diagnostics)
4842private static ConstantValue FoldConditionalOperator(BoundExpression condition, BoundExpression trueExpr, BoundExpression falseExpr)
Binder\Binder_Patterns.cs (36)
18private BoundExpression BindIsPatternExpression(IsPatternExpressionSyntax node, BindingDiagnosticBag diagnostics)
22BoundExpression expression = BindRValueWithoutTargetType(node.Expression, diagnostics);
45private BoundExpression MakeIsPatternExpression(
47BoundExpression expression,
143private BoundExpression BindSwitchExpression(SwitchExpressionSyntax node, BindingDiagnosticBag diagnostics)
154internal virtual BoundExpression BindSwitchExpressionCore(
215BoundExpression? indexerAccess = null;
298BoundExpression? indexerAccess;
299BoundExpression? lengthAccess;
334out Symbol? variableSymbol, out BoundExpression? variableAccess);
349indexerAccess: out _, out var lengthAccess, receiverPlaceholder: out _, argumentPlaceholder: out _);
355out BoundExpression indexerAccess, out BoundExpression lengthAccess, out BoundListPatternReceiverPlaceholder? receiverPlaceholder, out BoundListPatternIndexPlaceholder argumentPlaceholder)
370lengthAccess = new BoundBadExpression(node, LookupResultKind.Empty, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, CreateErrorType(), hasErrors: true) { WasCompilerGenerated = true };
424var convertedExpression = BindExpressionOrTypeForPattern(inputType, innerExpression, ref hasErrors, diagnostics, out var constantValueOpt, out bool wasExpression, out Conversion patternConversion);
497private BoundExpression BindExpressionOrTypeForPattern(
507BoundExpression expression = BindTypeOrRValue(patternExpression, diagnostics);
525private BoundExpression BindExpressionForPattern(
535var expression = BindExpression(patternExpression, diagnostics: diagnostics, invoked: false, indexed: false);
542private BoundExpression BindExpressionForPatternContinued(
543BoundExpression expression,
551BoundExpression convertedExpression = ConvertPatternExpression(
587internal BoundExpression ConvertPatternExpression(
590BoundExpression expression,
596BoundExpression convertedExpression;
689BoundExpression operand = conversion.Operand;
847hasErrors: ref hasErrors, variableSymbol: out Symbol? variableSymbol, variableAccess: out BoundExpression? variableAccess);
873out BoundExpression? variableAccess)
909BoundExpression receiver = SynthesizeReceiver(designation, expressionVariableField, diagnostics);
1000BoundExpression deconstruct = MakeDeconstructInvocationExpression(
1034ref hasErrors, out Symbol? variableSymbol, out BoundExpression? variableAccess);
1051BoundExpression deconstruct,
1361variableSymbol: out Symbol? variableSymbol, variableAccess: out BoundExpression? variableAccess);
1396BoundExpression deconstruct = MakeDeconstructInvocationExpression(
1549BoundExpression boundMember = BindInstanceMemberAccess(
1631BoundExpression value = BindExpressionForPattern(inputType, node.Expression, ref hasErrors, diagnostics, out var constantValueOpt, out _, out Conversion patternConversion);
Binder\Binder_Query.cs (52)
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();
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)
695var construction = MakePair(node, x1.Name, x1Expression, x2.Name, x2Expression, state, d);
731var yExpression = lambdaBodyBinder.BindRValueWithoutTargetType(let.Expression, d);
745var construction = MakePair(let, x.Name, xExpression, let.Identifier.ValueText, yExpression, state, d);
768private BoundBlock CreateLambdaBlockForQueryClause(ExpressionSyntax expression, BoundExpression result, BindingDiagnosticBag diagnostics)
781BoundExpression expression,
783BoundExpression? queryInvocation = null,
784BoundExpression? castInvocation = null,
785BoundExpression? unoptimizedForm = null)
797private BoundExpression MakePair(CSharpSyntaxNode node, string field1Name, BoundExpression field1Value, string field2Name, BoundExpression field2Value, QueryTranslationState state, BindingDiagnosticBag diagnostics)
817AnonymousTypeField createField(string fieldName, BoundExpression fieldValue) =>
821private TypeSymbol TypeOrError(BoundExpression e)
837BoundExpression boundExpression = lambdaBodyBinder.BindValue(expression, diagnostics, BindValueKind.RValue);
847BoundExpression boundExpression = lambdaBodyBinder.BindValue(expression, diagnostics, BindValueKind.RValue);
874protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, BoundExpression arg, BindingDiagnosticBag diagnostics
887protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, ImmutableArray<BoundExpression> args, BindingDiagnosticBag diagnostics
900protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, TypeSyntax typeArgSyntax, TypeWithAnnotations typeArg, BindingDiagnosticBag diagnostics
906return MakeQueryInvocation(node, receiver, methodName, new SeparatedSyntaxList<TypeSyntax>(new SyntaxNodeOrTokenList(typeArgSyntax, 0)), ImmutableArray.Create(typeArg), ImmutableArray<BoundExpression>.Empty, diagnostics
913protected BoundCall MakeQueryInvocation(CSharpSyntaxNode node, BoundExpression receiver, string methodName, SeparatedSyntaxList<TypeSyntax> typeArgsSyntax, ImmutableArray<TypeWithAnnotations> typeArgs, ImmutableArray<BoundExpression> args, BindingDiagnosticBag diagnostics
923var ultimateReceiver = receiver;
985var checkedUltimateReceiver = CheckValue(ultimateReceiver, BindValueKind.RValue, diagnostics);
1005static BoundExpression updateUltimateReceiver(BoundExpression receiver, BoundExpression originalUltimateReceiver, BoundExpression replacementUltimateReceiver)
1024protected BoundExpression MakeConstruction(CSharpSyntaxNode node, NamedTypeSymbol toCreate, ImmutableArray<BoundExpression> args, BindingDiagnosticBag diagnostics)
1028var 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 (81)
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)
756internal MethodSymbol TryFindDisposePatternMethod(BoundExpression expr, SyntaxNode syntaxNode, bool hasAwait, BindingDiagnosticBag diagnostics, out bool isExpanded)
863internal BoundExpression BindInferredVariableInitializer(BindingDiagnosticBag diagnostics, RefKind refKind, EqualsValueClauseSyntax initializer,
873protected BoundExpression BindInferredVariableInitializer(BindingDiagnosticBag diagnostics, ExpressionSyntax initializer, BindValueKind valueKind, CSharpSyntaxNode errorSyntax)
893BoundExpression value = BindValue(initializer, diagnostics, valueKind);
894BoundExpression expression = value.Kind is BoundKind.UnboundLambda or BoundKind.MethodGroup ?
1014BoundExpression initializerOpt;
1108ImmutableArray<BoundExpression> arguments = BindDeclaratorArguments(declarator, localDiagnostics);
1136var invalidDimensions = ArrayBuilder<BoundExpression>.GetInstance();
1174internal ImmutableArray<BoundExpression> BindDeclaratorArguments(VariableDeclaratorSyntax declarator, BindingDiagnosticBag diagnostics)
1183var arguments = default(ImmutableArray<BoundExpression>);
1222private bool IsValidFixedVariableInitializer(TypeSymbol declType, ref BoundExpression initializerOpt, BindingDiagnosticBag diagnostics)
1320private MethodSymbol GetFixedPatternMethodOpt(BoundExpression initializer, BindingDiagnosticBag additionalDiagnostics)
1353private BoundExpression GetFixedLocalCollectionInitializer(
1354BoundExpression initializer,
1371BoundExpression elementConversion;
1402private BoundExpression BindAssignment(AssignmentExpressionSyntax node, BindingDiagnosticBag diagnostics)
1422var op1 = BindValue(node.Left, diagnostics, lhsKind);
1426var op2 = BindValue(rhsExpr, diagnostics, rhsKind);
1438private static BindValueKind GetRequiredRHSValueKindForRefAssignment(BoundExpression boundLeft)
1457private BoundExpression InferTypeForDiscardAssignment(BoundDiscardExpression op1, BoundExpression op2, BindingDiagnosticBag diagnostics)
1475BoundExpression op1,
1476BoundExpression op2,
1500var conversion = GenerateConversionForAssignment(lhsType, op2,
1544BoundExpression op1,
1545BoundExpression op2,
1614static object getName(BoundExpression expr)
1637internal static PropertySymbol GetPropertySymbol(BoundExpression expr, out BoundExpression receiver, out SyntaxNode propertySyntax)
1714internal static Symbol? GetIndexerOrImplicitIndexerSymbol(BoundExpression? e)
1774private static bool AccessingAutoPropertyFromConstructor(BoundExpression? receiver, PropertySymbol propertySymbol, Symbol fromMember, AccessorKind accessorKind)
1816private TypeSymbol GetAccessThroughType(BoundExpression receiver)
1835private BoundExpression BindPossibleArrayInitializer(
1848BoundExpression result;
1853ImmutableArray<BoundExpression>.Empty);
1932internal BoundExpression GenerateConversionForAssignment(TypeSymbol targetType, BoundExpression expression, BindingDiagnosticBag diagnostics, ConversionForAssignmentFlags flags = ConversionForAssignmentFlags.None)
1935internal BoundExpression GenerateConversionForAssignment(TypeSymbol targetType, BoundExpression expression, BindingDiagnosticBag diagnostics, out Conversion conversion, ConversionForAssignmentFlags flags = ConversionForAssignmentFlags.None)
2319BoundExpression operand,
2438void tryConversion(BoundExpression expr, ref bool reportedError, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
2523ImmutableArray<BoundExpression> tupleArguments,
2537var argument = tupleArguments[i];
2555var stack = ArrayBuilder<(Binder, IfStatementSyntax IfStatementSyntax, BoundExpression Condition, BoundStatement Consequence)>.GetInstance();
2560var condition = binder.BindBooleanExpression(node.Condition, diagnostics);
2594BoundExpression condition;
2619internal BoundExpression BindBooleanExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics)
2655var expr = BindValue(node, diagnostics, BindValueKind.RValue);
2734BoundExpression resultOperand = CreateConversion(
3007BoundExpression arg = null;
3142internal BoundExpression CreateReturnConversion(
3145BoundExpression argument,
3257BoundExpression boundFilter = null;
3347BoundExpression exceptionSource = null;
3367private BoundExpression BindCatchFilter(CatchFilterClauseSyntax filter, BindingDiagnosticBag diagnostics)
3371BoundExpression boundFilter = this.BindBooleanExpression(filter.FilterExpression, diagnostics);
3434private static bool IsValidStatementExpression(SyntaxNode syntax, BoundExpression expression)
3464internal BoundBlock CreateBlockFromExpression(CSharpSyntaxNode node, ImmutableArray<LocalSymbol> locals, RefKind refKind, BoundExpression expression, ExpressionSyntax expressionSyntax, BindingDiagnosticBag diagnostics)
3553private static bool IsValidExpressionBody(SyntaxNode expressionSyntax, BoundExpression expression)
3594BoundExpression expression = bodyBinder.BindValue(expressionSyntax, diagnostics, requiredValueKind);
3610BoundExpression expression = bodyBinder.BindValue(expressionSyntax, diagnostics, requiredValueKind);
3614public BoundBlock CreateBlockFromExpression(ExpressionSyntax body, BoundExpression expression, BindingDiagnosticBag diagnostics)
3724BoundExpression initializerInvocation = GetBinder(initializer).BindConstructorInitializer(initializer.ArgumentList, (MethodSymbol)this.ContainingMember(), diagnostics);
3790BoundExpression initializerInvocation = GetBinder(initializer).BindConstructorInitializer(initializer.ArgumentList, (MethodSymbol)this.ContainingMember(), diagnostics);
3801BoundExpression? initializerInvocation;
3822internal static BoundExpression? BindImplicitConstructorInitializer(
3972BoundExpression receiver = new BoundThisReference(syntax, constructor.ContainingType) { WasCompilerGenerated = true };
3978arguments: ImmutableArray<BoundExpression>.Empty,
4014BoundExpression receiver = new BoundThisReference(syntax, constructor.ContainingType) { WasCompilerGenerated = true };
4015BoundExpression argument = new BoundParameter(syntax, constructor.Parameters[0]);
4112internal PatternLookupResult PerformPatternMethodLookup(BoundExpression receiver, string methodName,
4122var boundAccess = BindInstanceMemberAccess(
4147var 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,
126out BoundExpression conversionForBool, out BoundValuePlaceholder conversionForBoolPlaceholder, out UnaryOperatorSignature boolOperator)
160BoundExpression comparisonResult = new BoundTupleOperandPlaceholder(node, type);
180BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
203BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
229(ImmutableArray<BoundExpression> leftParts, ImmutableArray<string> leftNames) = GetTupleArgumentsOrPlaceholders(left);
230(ImmutableArray<BoundExpression> rightParts, ImmutableArray<string> rightNames) = GetTupleArgumentsOrPlaceholders(right);
265private static void ReportNamesMismatchesIfAny(BoundExpression left, BoundExpression right,
325internal static BoundExpression GiveTupleTypeToDefaultLiteralIfNeeded(BoundExpression expr, TypeSymbol targetType)
336private static bool IsTupleBinaryOperation(BoundExpression left, BoundExpression right)
349private static int GetTupleCardinality(BoundExpression expr)
375private static (ImmutableArray<BoundExpression> Elements, ImmutableArray<string> Names) GetTupleArgumentsOrPlaceholders(BoundExpression expr)
384ImmutableArray<BoundExpression> placeholders = tupleType.TupleElementTypesWithAnnotations
385.SelectAsArray((t, s) => (BoundExpression)new BoundTupleOperandPlaceholder(s, t.Type), expr.Syntax);
396ImmutableArray<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;
515BoundExpression elementConversion = CreateConversion(_syntax, elementPlaceholder, elementConversionClassification, isCast: false, conversionGroupOpt: null, iterationVariableType.Type, createConversionDiagnostics);
566BoundExpression convertedCollectionExpression = ConvertForEachCollection(collectionExpr, collectionConversionClassification, builder.CollectionType, diagnostics);
626BoundExpression collectionExpr = this.GetBinder(collectionSyntax).BindValue(collectionSyntax, diagnostics, BindValueKind.RValue);
635protected BoundExpression ConvertForEachCollection(
636BoundExpression collectionExpr,
645BoundExpression convertedCollectionExpression = CreateConversion(
677ref BoundExpression collectionExpr,
713private BoundExpression UnwrapCollectionExpressionIfNullable(BoundExpression collectionExpr, BindingDiagnosticBag diagnostics)
773ref BoundExpression collectionExpr,
781BoundExpression originalCollectionExpr = collectionExpr;
827private EnumeratorResult GetEnumeratorInfoCore(SyntaxNode syntax, SyntaxNode collectionSyntax, ref BoundExpression collectionExpr, bool isAsync, BindingDiagnosticBag diagnostics, out ForEachEnumeratorInfo.Builder builder)
868BoundExpression span = new BoundValuePlaceholder(collectionExpr.Syntax, spanType).MakeCompilerGenerated();
870var originalSpan = span;
916var originalCollectionExpr = collectionExpr;
929EnumeratorResult getEnumeratorInfo(SyntaxNode syntax, SyntaxNode collectionSyntax, ref BoundExpression collectionExpr, bool isAsync, BindingDiagnosticBag diagnostics, out ForEachEnumeratorInfo.Builder builder)
973var unwrappedCollectionExpr = UnwrapCollectionExpressionIfNullable(collectionExpr, diagnostics);
1031EnumeratorResult createPatternBasedEnumeratorResult(ref ForEachEnumeratorInfo.Builder builder, BoundExpression collectionExpr, bool isAsync, bool viaExtensionMethod, BindingDiagnosticBag diagnostics)
1071private EnumeratorResult SatisfiesIEnumerableInterfaces(SyntaxNode collectionSyntax, ref ForEachEnumeratorInfo.Builder builder, BoundExpression collectionExpr, bool isAsync, BindingDiagnosticBag diagnostics, TypeSymbol unwrappedCollectionExprType)
1203private bool ReportConstantNullCollectionExpr(BoundExpression collectionExpr, BindingDiagnosticBag diagnostics)
1214private void GetDisposalInfoForEnumerator(SyntaxNode syntax, ref ForEachEnumeratorInfo.Builder builder, BoundExpression expr, bool isAsync, BindingDiagnosticBag diagnostics)
1235var argsBuilder = ArrayBuilder<BoundExpression>.GetInstance(patternDisposeMethod.ParameterCount);
1352private bool SatisfiesGetEnumeratorPattern(SyntaxNode syntax, SyntaxNode collectionSyntax, ref ForEachEnumeratorInfo.Builder builder, BoundExpression collectionExpr, bool isAsync, bool viaExtensionMethod, BindingDiagnosticBag diagnostics)
1526private MethodArgumentInfo FindForEachPatternMethodViaExtension(SyntaxNode syntax, SyntaxNode collectionSyntax, BoundExpression collectionExpr, string methodName, BindingDiagnosticBag diagnostics)
1957private MethodArgumentInfo BindDefaultArguments(MethodSymbol method, BoundExpression extensionReceiverOpt, bool expanded, SyntaxNode syntax, BindingDiagnosticBag diagnostics)
1966var argsBuilder = ArrayBuilder<BoundExpression>.GetInstance(method.ParameterCount);
Binder\RefSafetyAnalysis.cs (18)
68private HashSet<BoundExpression>? _visited = new HashSet<BoundExpression>();
281else if (node is BoundExpression expr)
291private void AssertVisited(BoundExpression expr)
699private void VisitArgumentsAndGetArgumentPlaceholders(BoundExpression? receiverOpt, ImmutableArray<BoundExpression> arguments)
703var arg = arguments[i];
740BoundExpression? receiver,
742ImmutableArray<BoundExpression> arguments)
985private void VisitDeconstructionArguments(ArrayBuilder<DeconstructionVariable> variables, SyntaxNode syntax, Conversion conversion, BoundExpression right)
1057internal readonly BoundExpression Expression;
1061internal DeconstructionVariable(BoundExpression expression, SafeContext valEscape, ArrayBuilder<DeconstructionVariable>? nestedVariables)
1073foreach (var arg in arguments)
1079DeconstructionVariable getDeconstructionAssignmentVariable(BoundExpression expr)
1087private static ImmutableArray<BoundExpression> GetDeconstructionRightParts(BoundExpression expr)
1113ImmutableArray<BoundExpression> arguments;
1118inlineArray: 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 GetImplicitUserDefinedConversion(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
872private Conversion GetExplicitUserDefinedConversion(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1029private Conversion ClassifyImplicitBuiltInConversionFromExpression(BoundExpression sourceExpression, TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1074var innerExpression = ((BoundExpressionWithNullability)sourceExpression).Expression;
1184private Conversion GetSwitchExpressionConversion(BoundExpression source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1213private Conversion GetConditionalExpressionConversion(BoundExpression source, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1231private static Conversion ClassifyNullLiteralConversion(BoundExpression source, TypeSymbol destination)
1270private static Conversion ClassifyImplicitConstantExpressionConversion(BoundExpression source, TypeSymbol destination)
1349internal static bool HasImplicitConstantExpressionConversion(BoundExpression source, TypeSymbol destination)
1401private Conversion ClassifyExplicitOnlyConversionFromExpression(BoundExpression sourceExpression, TypeSymbol destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool forCast)
1441private static bool HasImplicitEnumerationConversion(BoundExpression source, TypeSymbol destination)
1641private static bool HasAnonymousFunctionConversion(BoundExpression source, TypeSymbol destination, CSharpCompilation compilation)
1920public Conversion ClassifyImplicitExtensionMethodThisArgConversion(BoundExpression sourceExpressionOpt, TypeSymbol sourceType, TypeSymbol destination, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool isMethodGroupConversion)
1959(ConversionsBase conversions, BoundExpression s, TypeWithAnnotations d, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> u, bool forCast) =>
2279private delegate Conversion ClassifyConversionFromExpressionDelegate(ConversionsBase conversions, BoundExpression sourceExpression, TypeWithAnnotations destination, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, bool forCast);
2294(ConversionsBase conversions, BoundExpression s, TypeWithAnnotations d, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> u, bool forCast)
2312(ConversionsBase conversions, BoundExpression s, TypeWithAnnotations d, bool isChecked, ref CompoundUseSiteInfo<AssemblySymbol> u, bool forCast) =>
2344var argument = arguments[i];
3033internal bool HasImplicitConversionToOrImplementsVarianceCompatibleInterface(BoundExpression expressionToCheck, NamedTypeSymbol targetInterfaceType, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, out bool needSupportForRefStructInterfaces)
Binder\Semantics\Operators\BinaryOperatorOverloadResolution.cs (32)
20public void BinaryOperatorOverloadResolution(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
32internal void BinaryOperatorOverloadResolution_EasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result)
51BoundExpression left,
52BoundExpression right,
211BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo,
323private void GetDelegateOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right,
453BoundExpression nonDelegate = leftDelegate ? right : left;
464private void GetEnumOperation(BinaryOperatorKind kind, TypeSymbol enumType, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> operators)
588private void GetEnumOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> results)
675BoundExpression left,
676BoundExpression right,
706private void GetAllBuiltInOperators(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
763static bool useOnlyReferenceEquality(Conversions conversions, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
772static bool isUtf8ByteRepresentation(BoundExpression value)
777Conversion getOperandConversionForAllowByRefLikeNullCheck(bool isChecked, BoundExpression operand, TypeSymbol objectType, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
792BoundExpression left,
793BoundExpression right,
855BoundExpression left,
856BoundExpression right,
1064BoundExpression left,
1065BoundExpression right,
1131BoundExpression left,
1132BoundExpression right,
1184private BetterResult BetterOperator(BinaryOperatorSignature op1, BinaryOperatorSignature op2, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
Binder\Semantics\Operators\UnaryOperatorOverloadResolution.cs (9)
23public void UnaryOperatorOverloadResolution(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, UnaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
65BoundExpression operand,
131BoundExpression operand,
183private BetterResult BetterOperator(UnaryOperatorSignature op1, UnaryOperatorSignature op2, BoundExpression operand, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
241private void GetAllBuiltInOperators(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, ArrayBuilder<UnaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
272private bool CandidateOperators(bool isChecked, ArrayBuilder<UnaryOperatorSignature> operators, BoundExpression operand, ArrayBuilder<UnaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
292private void GetEnumOperations(UnaryOperatorKind kind, BoundExpression operand, ArrayBuilder<UnaryOperatorSignature> operators)
323private static UnaryOperatorSignature? GetPointerOperation(UnaryOperatorKind kind, BoundExpression operand)
347private bool GetUserDefinedOperators(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, ArrayBuilder<UnaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
Binder\Semantics\OverloadResolution\MethodTypeInference.cs (28)
97internal abstract TypeWithAnnotations GetTypeWithAnnotations(BoundExpression expr);
103internal override TypeWithAnnotations GetTypeWithAnnotations(BoundExpression expr)
138private readonly ImmutableArray<BoundExpression> _arguments;
276ImmutableArray<BoundExpression> arguments,// Required; in scenarios like method group conversions where there are
329ImmutableArray<BoundExpression> arguments,
611BoundExpression argument = _arguments[arg];
620private void MakeExplicitParameterTypeInferences(Binder binder, BoundExpression argument, TypeWithAnnotations target, ExactOrBoundsKind kind, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
693MakeExplicitParameterTypeInferences(binder, (BoundExpression)element, targetElementType, kind, ref useSiteInfo);
750var sourceArgument = sourceArguments[i];
870var argument = _arguments[arg];
875private void MakeOutputTypeInferences(Binder binder, BoundExpression argument, TypeWithAnnotations formalType, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
912if (element is BoundExpression expression)
943var sourceArgument = sourceArguments[i];
1008private static bool DoesInputTypeContain(BoundExpression argument, TypeSymbol formalParameterType, TypeParameterSymbol typeParameter)
1044private bool HasUnfixedParamInInputType(BoundExpression pSource, TypeSymbol pDest)
1063private static bool DoesOutputTypeContain(BoundExpression argument, TypeSymbol formalParameterType,
1104private bool HasUnfixedParamInOutputType(BoundExpression argument, TypeSymbol formalParameterType)
1145var argument = _arguments[iArg];
1367private void OutputTypeInference(Binder binder, BoundExpression expression, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1400private bool InferredReturnTypeInference(BoundExpression source, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1436private bool MethodGroupReturnTypeInference(Binder binder, BoundExpression source, TypeSymbol target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1545private void ExplicitParameterTypeInference(BoundExpression source, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1600private void ExplicitReturnTypeInference(BoundExpression source, TypeWithAnnotations target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
3061private TypeWithAnnotations InferReturnType(BoundExpression source, NamedTypeSymbol target, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
3189BoundExpression receiver,
3243ImmutableArray<BoundExpression> arguments,
3258ImmutableArray<BoundExpression> arguments,
3305var argument = _arguments[0];
Binder\Semantics\OverloadResolution\OverloadResolution.cs (17)
140BoundExpression receiver,
166BoundExpression receiverOpt,
188BoundExpression receiver,
431BoundExpression receiver,
582BoundExpression receiverOpt) where TMember : Symbol
2113ArrayBuilder<BoundExpression> arguments,
2152ArrayBuilder<BoundExpression> arguments,
2636ArrayBuilder<BoundExpression> arguments,
2701private static void GetParameterCounts<TMember>(MemberResolutionResult<TMember> m, ArrayBuilder<BoundExpression> arguments, out int declaredParameterCount, out int parametersUsedIncludingExpansionAndOptional) where TMember : Symbol
2853private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, TypeSymbol t2, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
2868BoundExpression node,
2923private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, Conversion conv1, TypeSymbol t2, Conversion conv2, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, out bool okToDowngradeToNeither)
3128elementBetterResult = BetterConversionFromExpression((BoundExpression)element, elementType1, conversionToE1, elementType2, conversionToE2, ref useSiteInfo, okToDowngradeToNeither: out _);
3248private bool ExpressionMatchExactly(BoundExpression node, TypeSymbol t, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
3406if (!(node is BoundExpression))
4534BoundExpression argument = arguments.Argument(argumentPosition);
4673BoundExpression argument,
Binder\Semantics\OverloadResolution\OverloadResolutionResult.cs (7)
194BoundExpression receiver,
644BoundExpression receiverOpt,
741BoundExpression receiver,
1083BoundExpression receiver,
1160BoundExpression argument = arguments.Argument(arg);
1370static bool isStringLiteralToInterpolatedStringHandlerArgumentConversion(BoundExpression argument, ParameterSymbol parameter)
1391private bool HadAmbiguousWorseMethods(BindingDiagnosticBag diagnostics, ImmutableArray<Symbol> symbols, Location location, bool isQuery, BoundExpression receiver, string name)
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,
158public BoundCall Update(ImmutableArray<BoundExpression> arguments)
163public BoundCall Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments)
168public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method)
170return Synthesized(syntax, receiverOpt, initialBindingReceiverIsSubjectToCloning: initialBindingReceiverIsSubjectToCloning, method, ImmutableArray<BoundExpression>.Empty);
173public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, BoundExpression arg0)
178public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, BoundExpression arg0, BoundExpression arg1)
183public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt = default)
253public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, params BoundExpression[] arguments)
254: this(syntax, constructor, ImmutableArray.Create<BoundExpression>(arguments), default(ImmutableArray<string?>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), default(BitVector), null, null, constructor.ContainingType)
257public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments)
267BoundExpression receiverOpt,
269ImmutableArray<BoundExpression> arguments,
292BoundExpression? receiverOpt,
295ImmutableArray<BoundExpression> arguments,
307public BoundIndexerAccess Update(BoundExpression? receiverOpt,
310ImmutableArray<BoundExpression> arguments,
328public static BoundConversion SynthesizedNonUserDefined(SyntaxNode syntax, BoundExpression operand, Conversion conversion, TypeSymbol type, ConstantValue? constantValueOpt = null)
350BoundExpression operand,
376BoundExpression operand,
403BoundExpression left,
404BoundExpression right,
430BoundExpression left,
431BoundExpression right,
443BoundExpression left,
444BoundExpression right,
472public BoundTypeExpression(SyntaxNode syntax, AliasSymbol? aliasOpt, BoundTypeExpression? boundContainingTypeOpt, ImmutableArray<BoundExpression> boundDimensionsOpt, TypeWithAnnotations typeWithAnnotations, bool hasErrors = false)
479: this(syntax, aliasOpt, boundContainingTypeOpt, ImmutableArray<BoundExpression>.Empty, typeWithAnnotations, hasErrors)
493public BoundTypeExpression(SyntaxNode syntax, AliasSymbol? aliasOpt, ImmutableArray<BoundExpression> dimensionsOpt, TypeWithAnnotations typeWithAnnotations, bool hasErrors = false)
519public BoundAssignmentOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right,
528public BoundBadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol?> symbols, ImmutableArray<BoundExpression> childBoundNodes, TypeSymbol type)
560public static BoundReturnStatement Synthesized(SyntaxNode syntax, RefKind refKind, BoundExpression expression, bool hasErrors = false)
624public BoundAddressOfOperator(SyntaxNode syntax, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
637public static BoundDagTemp ForOriginalInput(BoundExpression expr) => new BoundDagTemp(expr.Syntax, expr.Type!, source: null);
644BoundExpression left,
645BoundExpression right,
647BoundExpression? leftConversion,
649BoundExpression? finalConversion,
658BoundExpression left,
659BoundExpression right,
661BoundExpression? leftConversion,
663BoundExpression? finalConversion,
674BoundExpression operand,
686BoundExpression operand,
700BoundExpression operand,
704BoundExpression? operandConversion,
706BoundExpression? resultConversion,
714public 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)
205var types = ArrayBuilder<(BoundExpression expr, TypeWithAnnotations resultType, bool isChecked)>.GetInstance();
246ArrayBuilder<(BoundExpression expr, TypeWithAnnotations resultType, bool isChecked)> returns,
355if (!(node is BoundExpression))
376var expression = node.ExpressionOpt;
605protected abstract BoundExpression? GetLambdaExpressionBody(BoundBlock body);
610protected abstract BoundBlock CreateBlockFromLambdaExpressionBody(Binder lambdaBodyBinder, BoundExpression expression, BindingDiagnosticBag diagnostics);
821GetLambdaExpressionBody(returnInferenceLambda.Body) is BoundExpression expression &&
1585protected override BoundExpression? GetLambdaExpressionBody(BoundBlock body)
1592statements[0] is BoundReturnStatement { RefKind: Microsoft.CodeAnalysis.RefKind.None, ExpressionOpt: BoundExpression expr })
1600protected override BoundBlock CreateBlockFromLambdaExpressionBody(Binder lambdaBodyBinder, BoundExpression expression, BindingDiagnosticBag diagnostics)
CodeGen\EmitArrayInitializer.cs (27)
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,
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)
800var receiver = mg != null ? mg.ReceiverOpt : expression.Argument;
939foreach (var se in sideEffects)
946private void EmitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
967internal static RefKind GetArgumentRefKind(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt, int i)
1169var receiver = fieldAccess.ReceiverOpt;
1197private LocalDefinition EmitFieldLoadReceiver(BoundExpression receiver)
1225private bool EmitFieldLoadReceiverAddress(BoundExpression receiver)
1264private bool FieldLoadPrefersRef(BoundExpression receiver)
1317internal static bool FieldLoadMustUseRef(BoundExpression expr)
1506private bool CanUseCallOnRefTypeReceiver(BoundExpression receiver)
1574var seqValue = ((BoundSequence)(receiver)).Value;
1578var rhs = ((BoundAssignmentOperator)receiver).Right;
1596private bool IsThisReceiver(BoundExpression receiver)
1604var seqValue = ((BoundSequence)(receiver)).Value;
1638var receiver = call.ReceiverOpt;
1658var receiver = call.ReceiverOpt;
1826var receiver = call.ReceiverOpt;
1916var receiver = call.ReceiverOpt;
1943var receiver = call.ReceiverOpt;
2022var receiver = call.ReceiverOpt;
2084internal static bool IsPossibleReferenceTypeReceiverOfConstrainedCall(BoundExpression receiver)
2096internal static bool ReceiverIsKnownToReferToTempIfReferenceType(BoundExpression receiver)
2114internal static bool IsSafeToDereferenceReceiverRefAfterEvaluatingArguments(ImmutableArray<BoundExpression> arguments)
2118static bool isSafeToDereferenceReceiverRefAfterEvaluatingArgument(BoundExpression expression)
2120var current = expression;
2209internal static bool IsRef(BoundExpression receiver)
2235private static int GetCallStackBehavior(MethodSymbol method, ImmutableArray<BoundExpression> arguments)
2413foreach (var init in initializer.Initializers)
2434foreach (var arg in expression.Arguments)
2462private bool TryEmitOptimizedReadonlySpan(BoundObjectCreationExpression expression, bool used, BoundExpression inPlaceTarget, out bool avoidInPlace)
2582var left = assignmentOperator.Left;
2597var right = assignmentOperator.Right;
2645private bool SafeToGetWriteableReference(BoundExpression left)
2672private void InPlaceInit(BoundExpression target, bool used)
2687private bool TryInPlaceCtorCall(BoundExpression target, BoundObjectCreationExpression objCreation, bool used)
2726private bool PartialCtorResultCannotEscape(BoundExpression left)
2752private static bool TargetIsNotOnHeap(BoundExpression left)
2770var assignmentTarget = assignmentOperator.Left;
2990BoundExpression lhs = assignmentOperator.Left;
3061BoundExpression expression = assignment.Left;
3096var array = ((BoundArrayAccess)expression).Expression;
3381var operand = isOp.Operand;
3407var operand = asOp.Operand;
3903private 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;
864var expressionOpt = boundReturnStatement.ExpressionOpt;
1121var exceptionSourceOpt = catchBlock.ExceptionSourceOpt;
1134BoundExpression exceptionSource = exceptionSourceOpt;
1249BoundExpression expression,
1964BoundExpression caseExpressionOpt = node.CaseExpressionOpt;
1976BoundExpression condition = node.Condition;
1984BoundExpression expression = node.Expression;
CodeGen\Optimizer.cs (118)
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;
1015internal static bool IsFixedBufferAssignmentToRefLocal(BoundExpression left, BoundExpression right, bool isRef)
1027var lhs = node.Left;
1098var lhs = node.Left;
1123BoundExpression rewrittenReceiver = visitReceiver(node);
1149BoundExpression rewrittenReceiver = visitReceiver(node);
1153BoundExpression visitReceiver(BoundCall node)
1155var receiver = node.ReceiverOpt;
1173receiver = typeExpression.Update(aliasOpt: null, boundContainingTypeOpt: null, boundDimensionsOpt: ImmutableArray<BoundExpression>.Empty,
1185BoundCall visitArgumentsAndUpdateCall(BoundCall node, BoundExpression receiver)
1192private BoundExpression VisitCallOrConditionalAccessReceiver(BoundExpression receiver, BoundCall callOpt)
1207private void CheckCallReceiver(BoundExpression receiver, BoundCall call)
1213var unwrappedSequence = receiver;
1227private static ExprContext GetReceiverContext(BoundExpression receiver)
1254private ImmutableArray<BoundExpression> VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
1261ArrayBuilder<BoundExpression> rewrittenArguments = null;
1271private void VisitArgument(ImmutableArray<BoundExpression> arguments, ref ArrayBuilder<BoundExpression> rewrittenArguments, int i, RefKind argRefKind)
1275var arg = arguments[i];
1276BoundExpression rewrittenArg = VisitExpression(arg, context);
1280rewrittenArguments = ArrayBuilder<BoundExpression>.GetInstance();
1293ArrayBuilder<BoundExpression> rewrittenArguments = null;
1294ImmutableArray<BoundExpression> arguments = node.Arguments;
1311var rewrittenOperand = VisitExpression(node.Operand, ExprContext.Address);
1341var receiver = node.ReceiverOpt;
1423BoundExpression boundExpression = node.Expression;
1433boundExpression = (BoundExpression)this.Visit(boundExpression);
1453BoundExpression condition = this.VisitExpression(node.Condition, ExprContext.Value);
1460BoundExpression consequence = this.VisitExpression(node.Consequence, context);
1465BoundExpression alternative = this.VisitExpression(node.Alternative, context);
1474BoundExpression child = node.Left;
1503var left = (BoundExpression)this.Visit(child);
1518var right = (BoundExpression)this.Visit(binary.Right);
1551BoundExpression left = (BoundExpression)this.Visit(node.Left);
1556BoundExpression right = (BoundExpression)this.Visit(node.Right);
1571BoundExpression left = (BoundExpression)this.Visit(node.LeftOperand);
1578BoundExpression right = (BoundExpression)this.Visit(node.RightOperand);
1588BoundExpression receiver = VisitCallOrConditionalAccessReceiver(node.Receiver, callOpt: null);
1595BoundExpression whenNotNull = (BoundExpression)this.Visit(node.WhenNotNull);
1599var whenNull = node.WhenNullOpt;
1603whenNull = (BoundExpression)this.Visit(whenNull);
1626var valueTypeReceiver = (BoundExpression)this.Visit(node.ValueTypeReceiver);
1632var unwrappedSequence = node.ReferenceTypeReceiver;
1644var referenceTypeReceiver = (BoundExpression)this.Visit(node.ReferenceTypeReceiver);
1658BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
1686var exceptionSourceOpt = node.ExceptionSourceOpt;
1723BoundExpression boundFilter;
1726boundFilter = (BoundExpression)this.Visit(node.ExceptionFilterOpt);
1759ArrayBuilder<BoundExpression> rewrittenInitializers = null;
1767var initializer = initializers[i];
1768var rewrittenInitializer = this.VisitExpression(initializer, ExprContext.Value);
1772rewrittenInitializers = ArrayBuilder<BoundExpression>.GetInstance();
1790BoundExpression visitedOperand = this.VisitExpression(node.Operand, ExprContext.Address);
1796BoundExpression expressionOpt = (BoundExpression)this.Visit(node.ExpressionOpt);
2051var asExpression = node as BoundExpression;
2068BoundExpression child = node.Left;
2094var left = (BoundExpression)this.Visit(child);
2099var right = (BoundExpression)this.Visit(binary.Right);
2142ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
2179var right = (BoundExpression)Visit(node.Right);
2225BoundExpression? rewrittenReceiver = visitReceiver(node);
2246BoundExpression? rewrittenReceiver = visitReceiver(node);
2250BoundExpression? visitReceiver(BoundCall node)
2252BoundExpression? receiverOpt = node.ReceiverOpt;
2256receiverOpt = (BoundExpression?)this.Visit(receiverOpt);
2264receiverOpt = typeExpression.Update(aliasOpt: null, boundContainingTypeOpt: null, boundDimensionsOpt: ImmutableArray<BoundExpression>.Empty,
2276BoundExpression visitArgumentsAndUpdateCall(BoundCall node, BoundExpression? receiverOpt)
2278ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
2287var exceptionSource = node.ExceptionSourceOpt;
2290var filter = node.ExceptionFilterOpt;
2312exceptionSource = (BoundExpression)Visit(exceptionSource);
2323filter = (BoundExpression)this.Visit(filter);
2415internal override ReadOnlyBindingDiagnostic<AssemblySymbol> GetConstantValueDiagnostics(BoundExpression boundInitValue)
Compilation\CSharpSemanticModel.cs (27)
167internal abstract BoundExpression GetSpeculativelyBoundExpression(int position, ExpressionSyntax expression, SpeculativeBindingOption bindingOption, out Binder binder, out ImmutableArray<Symbol> crefSymbols);
251private static BoundExpression GetSpeculativelyBoundExpressionHelper(Binder binder, ExpressionSyntax expression, SpeculativeBindingOption bindingOption)
258BoundExpression boundNode;
279protected BoundExpression GetSpeculativelyBoundExpressionWithoutNullability(int position, ExpressionSyntax expression, SpeculativeBindingOption bindingOption, out Binder binder, out ImmutableArray<Symbol> crefSymbols)
320var boundNode = GetSpeculativelyBoundExpressionHelper(binder, expression, bindingOption);
826BoundExpression expression = bnode.Expression;
1883BoundExpression boundExpr;
1898case BoundExpression boundExpr2:
1915if (highestBoundNode is BoundExpression highestBoundExpr)
2044var boundExpr = lowestBoundNode as BoundExpression;
2045var highestBoundExpr = highestBoundNode as BoundExpression;
2275static (TypeSymbol, NullabilityInfo) getTypeAndNullability(BoundExpression expr) => (expr.Type, expr.TopLevelNullability);
2288if (lowestBoundNode is BoundExpression boundExpr)
2309var boundExpr = lowestBoundNode as BoundExpression;
2864var bnode = binder.BindExpression(expression, BindingDiagnosticBag.Discarded);
2916var bnode = binder.BindExpression(expression, BindingDiagnosticBag.Discarded);
3352BoundExpression boundNode,
3437BoundExpression valueExpression = ((BoundTypeOrValueExpression)boundNode).Data.ValueExpression;
3950private static void GetSymbolsAndResultKind(BoundExpression node, Symbol symbolOpt, ImmutableArray<MethodSymbol> originalCandidates, out OneOrMany<Symbol> symbols, out LookupResultKind resultKind)
3973BoundExpression boundNode,
4092private ImmutableArray<IPropertySymbol> GetIndexerGroupSemanticSymbols(BoundExpression boundNode, Binder binderOpt)
4616var receiver = node.ReceiverOpt;
4795BoundExpression receiver = call.Arguments[0];
4804private OneOrMany<Symbol> CreateReducedExtensionMethodIfPossible(BoundDelegateCreationExpression delegateCreation, BoundExpression receiverOpt)
Compilation\MemberSemanticModel.cs (22)
191internal override BoundExpression GetSpeculativelyBoundExpression(int position, ExpressionSyntax expression, SpeculativeBindingOption bindingOption, out Binder binder, out ImmutableArray<Symbol> crefSymbols)
204var boundRoot = binder.BindExpression(expression, BindingDiagnosticBag.Discarded);
206return (BoundExpression)NullableWalker.AnalyzeAndRewriteSpeculation(position, boundRoot, binder, snapshotManager, newSnapshots: out _, remappedSymbols: ref ignored);
475var boundExpression = this.GetLowerBoundNode(bindableNode) as BoundExpression;
499var boundExpression = this.GetLowerBoundNode(bindableNode) as BoundExpression;
1055var operation = call.IsDelegateCall ? call.ReceiverOpt : call;
1259BoundExpression boundExpr = this.GetLowerBoundNode(bindableNode) as BoundExpression;
1275var boundAdd = boundCollectionInitializer.Initializers[collectionInitializer.Expressions.IndexOf(node)];
1767BoundExpression node = queryClause;
1785BoundExpression receiver = call.ReceiverOpt;
1831private static BoundExpression GetContainingArgument(ImmutableArray<BoundExpression> arguments, int position)
1833BoundExpression result = null;
1835foreach (var arg in arguments)
1837var expr = GetContainingExprOrQueryClause(arg, position);
1854private static BoundExpression GetContainingExprOrQueryClause(BoundExpression expr, int position)
1858var value = GetQueryClauseValue((BoundQueryClause)expr);
1871private 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 }),
154ImmutableArray.Create<BoundExpression>(new BoundLiteral(syntax, ConstantValue.Create(targetSubmissionIndex), intType) { WasCompilerGenerated = true }),
180BoundExpression thisReference = null;
390BoundExpression delegateUpdate;
402arguments: ImmutableArray.Create<BoundExpression>(boundBackingField, boundParameter)),
467arguments: ImmutableArray.Create<BoundExpression>(boundTmps[1], boundParameter)),
481BoundExpression compareExchange = BoundCall.Synthesized(syntax,
485arguments: ImmutableArray.Create<BoundExpression>(boundBackingField, boundTmps[2], boundTmps[1]));
497BoundExpression loopExitCondition = new BoundBinaryOperator(syntax,
FlowAnalysis\AbstractFlowPass.cs (55)
363if (node is BoundExpression or BoundPattern)
549protected void VisitLvalue(BoundExpression node)
625protected void VisitCondition(BoundExpression node)
631private void AdjustConditionalState(BoundExpression node)
659protected virtual void VisitRvalue(BoundExpression node, bool isKnownToBeAnLvalue = false)
675protected static bool IsConstantTrue(BoundExpression node)
680protected static bool IsConstantFalse(BoundExpression node)
685protected static bool IsConstantNull(BoundExpression node)
1174(BoundExpression? construction, bool useBoolReturns, bool firstPartIsConditional) = data switch
1195protected virtual void VisitInterpolatedStringHandlerConstructor(BoundExpression? constructor)
1418private void VisitReceiverBeforeCall(BoundExpression receiverOpt, MethodSymbol method)
1426private void VisitReceiverAfterCall(BoundExpression receiverOpt, MethodSymbol method)
1515protected virtual void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1522private void VisitArgumentsBeforeCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt)
1543private void VisitArgumentsAfterCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol? method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1577protected virtual void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
1583foreach (var child in node.ChildBoundNodes)
1585VisitRvalue(child as BoundExpression);
1601VisitRvalue(child as BoundExpression);
1610foreach (var child in node.Initializers)
1672protected void SplitIfBooleanConstant(BoundExpression node)
1746BoundExpression receiver = ((BoundMethodGroup)node.Operand).ReceiverOpt;
2090if (element is BoundExpression expression)
2120protected virtual void PropertySetter(BoundExpression node, BoundExpression receiver, MethodSymbol setter, BoundExpression value = null)
2128private bool RegularPropertyAccess(BoundExpression expr)
2237private void VisitFieldAccessInternal(BoundExpression receiverOpt, FieldSymbol fieldSymbol)
2363foreach (var i in node.Indices)
2415private void VisitBinaryLogicalOperatorChildren(BoundExpression node)
2418var stack = ArrayBuilder<BoundExpression>.GetInstance();
2420BoundExpression binary;
2421BoundExpression child = node;
2462BoundExpression right;
2503protected virtual void AfterLeftChildOfBinaryLogicalOperatorHasBeenVisited(BoundExpression binary, BoundExpression right, bool isAnd, bool isBool, ref TLocalState leftTrue, ref TLocalState leftFalse)
2509protected void AfterRightChildOfBinaryLogicalOperatorHasBeenVisited(BoundExpression right, bool isAnd, bool isBool, ref TLocalState leftTrue, ref TLocalState leftFalse)
2638static bool isKnownNullOrNotNull(BoundExpression expr)
2737ReadOnlySpan<BoundExpression> parts;
2750foreach (var part in parts)
2834foreach (var expr in node.Bounds)
2982private bool TryVisitConditionalAccess(BoundExpression node, [NotNullWhen(true)] out TLocalState? stateWhenNotNull)
3033private bool VisitPossibleConditionalAccess(BoundExpression node, [NotNullWhen(true)] out TLocalState? stateWhenNotNull)
3092BoundExpression expr = node.AccessExpression;
3106Debug.Assert(expr is BoundExpression);
3166foreach (var se in sideEffects)
3262BoundExpression node,
3264BoundExpression condition,
3265BoundExpression consequence,
3266BoundExpression alternative)
3310private void VisitConditionalOperand(TLocalState state, BoundExpression operand, bool isByRef)
3435BoundExpression expr = node.ExpressionOpt;
3492protected void VisitAddressOfOperand(BoundExpression operand, bool shouldReadOperand)
3583private BoundNode VisitObjectOrCollectionInitializerExpression(ImmutableArray<BoundExpression> initializers)
3585foreach (var initializer in initializers)
FlowAnalysis\DefiniteAssignment.cs (21)
312protected override void VisitRvalue(BoundExpression node, bool isKnownToBeAnLvalue = false)
849protected virtual void NoteWrite(Symbol variable, BoundExpression value, bool read, bool isRef)
900internal static bool WriteConsideredUse(TypeSymbol type, BoundExpression value)
957private void NoteWrite(BoundExpression n, BoundExpression value, bool read, bool isRef)
1065protected override bool TryGetReceiverAndMember(BoundExpression expr, out BoundExpression receiver, out Symbol member)
1134protected bool MayRequireTracking(BoundExpression receiverOpt, FieldSymbol fieldSymbol)
1368protected virtual void CheckAssigned(BoundExpression expr, FieldSymbol fieldSymbol, SyntaxNode node)
1378private bool IsAssigned(BoundExpression node, out int unassignedSlot)
1481private Symbol UseNonFieldSymbolUnsafely(BoundExpression expression)
1516protected void Assign(BoundNode node, BoundExpression value, bool isRef = false, bool read = true)
1533protected virtual void AssignImpl(BoundNode node, BoundExpression value, bool isRef, bool written, bool read)
1650var expression = (BoundExpression)node;
1933foreach (var attributeArgument in boundAttribute.ConstructorArguments)
2533var initializer = node.Expression;
2551BoundExpression operand = node.Operand;
2579protected override void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2602protected void CheckAssigned(BoundExpression expr, SyntaxNode node)
2693var exceptionSource = catchBlock.ExceptionSourceOpt;
FlowAnalysis\NullableWalker.cs (286)
222private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)>.Builder? _analyzedNullabilityMapOpt;
237private PooledDictionary<BoundExpression, TypeWithState>? _methodGroupReceiverMapOpt;
239private PooledDictionary<BoundValuePlaceholderBase, (BoundExpression? Replacement, VisitResult Result)>? _resultForPlaceholdersOpt;
248private PooledDictionary<BoundExpression, Func<TypeWithAnnotations, TypeWithState>>? _targetTypedAnalysisCompletionOpt;
253/// 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, Location, ArrayBuilder<VisitResult>)"/>.
255private PooledDictionary<BoundExpression, Func<TypeWithAnnotations, TypeWithState>> TargetTypedAnalysisCompletion
256=> _targetTypedAnalysisCompletionOpt ??= PooledDictionary<BoundExpression, Func<TypeWithAnnotations, TypeWithState>>.GetInstance();
302private void SetResultType(BoundExpression? expression, TypeWithState type, bool updateAnalyzedNullability = true)
307private void SetAnalyzedNullability(BoundExpression? expression, TypeWithState type)
315private void UseRvalueOnly(BoundExpression? expression)
326private void SetLvalueResultType(BoundExpression? expression, TypeWithAnnotations type)
334private void UseLvalueOnly(BoundExpression? expression)
341private void SetResult(BoundExpression? expression, TypeWithState resultType, TypeWithAnnotations lvalueType, bool updateAnalyzedNullability = true, bool? isLvalue = null)
346private void SetResult(BoundExpression? expression, VisitResult visitResult, bool updateAnalyzedNullability, bool? isLvalue)
361private void SetAnalyzedNullability(BoundExpression? expression, TypeWithState resultType, TypeWithAnnotations lvalueType, bool? isLvalue = null)
369private void SetAnalyzedNullability(BoundExpression? expr, VisitResult result, bool? isLvalue = null)
432/// Used to allow <see cref="MakeSlot(BoundExpression)"/> to substitute the correct slot for a <see cref="BoundConditionalReceiver"/> when
467ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)>.Builder? analyzedNullabilityMapOpt,
544private void AddPlaceholderReplacement(BoundValuePlaceholderBase placeholder, BoundExpression? expression, VisitResult result)
551_resultForPlaceholdersOpt ??= PooledDictionary<BoundValuePlaceholderBase, (BoundExpression? Replacement, VisitResult Result)>.GetInstance();
1585ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)> analyzedNullabilitiesMap;
1590private static (SnapshotManager?, ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)>) AnalyzeWithSemanticInfo(
1600var analyzedNullabilities = ImmutableDictionary.CreateBuilder<BoundExpression, (NullabilityInfo, TypeSymbol?)>(EqualityComparer<BoundExpression>.Default, NullabilityInfoTypeComparer.Instance);
1658var analyzedNullabilities = ImmutableDictionary.CreateBuilder<BoundExpression, (NullabilityInfo, TypeSymbol?)>(EqualityComparer<BoundExpression>.Default, NullabilityInfoTypeComparer.Instance);
1698private static BoundNode Rewrite(ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)> updatedNullabilities, SnapshotManager? snapshotManager, BoundNode node, ref ImmutableDictionary<Symbol, Symbol>? remappedSymbols)
1824ImmutableDictionary<BoundExpression, (NullabilityInfo, TypeSymbol?)>.Builder? analyzedNullabilityMapOpt,
2037protected override bool TryGetReceiverAndMember(BoundExpression expr, out BoundExpression? receiver, [NotNullWhen(true)] out Symbol? member)
2095protected override int MakeSlot(BoundExpression node)
2115int makeSlot(BoundExpression node)
2138var operand = conv.Operand;
2192int getPlaceholderSlot(BoundExpression expr)
2293protected override void VisitRvalue(BoundExpression? node, bool isKnownToBeAnLvalue = false)
2307private void VisitRvalueEpilogue(BoundExpression? node)
2313private TypeWithState VisitRvalueWithState(BoundExpression? node)
2319private TypeWithAnnotations VisitLvalueWithAnnotations(BoundExpression node)
2395BoundExpression? value,
2417var unwrappedValue = SkipReferenceConversions(value);
2584private static bool IsDefaultValue(BoundExpression expr)
2617BoundExpression? valueOpt,
3039var expr = node.ExpressionOpt;
3109private TypeWithState VisitRefExpression(BoundExpression expr, TypeWithAnnotations destinationType)
3545var receiver = withExpr.Receiver;
3644var initializer = node.InitializerOpt;
3686Debug.Assert(node is BoundExpression or BoundPattern);
3690if (node is BoundExpression expr)
3698private void VisitExpressionWithoutStackGuardEpilogue(BoundExpression node)
3715bool shouldMakeNotNullRvalue(BoundExpression node) => node.IsSuppressed || node.HasAnyErrors || !IsReachable();
3895var addArgument = initializer.Arguments[argIndex];
3940var iteratorBody = ((BoundExpressionStatement)spread.IteratorBody).Expression;
3956var elementExpr = (BoundExpression)element;
4165BoundExpression node, TypeSymbol type, MethodSymbol? constructor,
4166ImmutableArray<BoundExpression> arguments, ImmutableArray<VisitResult> argumentResults,
4218var operand = arguments[0];
4236BoundExpression node,
4237ImmutableArray<BoundExpression> arguments,
4264foreach (var initializer in objectInitializer.Initializers)
4279foreach (var initializer in collectionInitializer.Initializers)
4310var left = node.Left;
4624private void SetNotNullResult(BoundExpression node)
4629private void SetNotNullResultForLambda(BoundExpression node, LocalState stateForLambda)
4676private int GetOrCreatePlaceholderSlot(BoundExpression node)
4719var argument = arguments[i];
4763foreach (var expr in node.Bounds)
4783var expressions = ArrayBuilder<BoundExpression>.GetInstance(initialization.Initializers.Length);
4808var expressionsNoConversions = ArrayBuilder<BoundExpression>.GetInstance(n);
4811var placeholderBuilder = ArrayBuilder<BoundExpression>.GetInstance(n);
4815(BoundExpression expressionNoConversion, Conversion conversion) = RemoveConversion(expression, includeExplicitConversions: false);
4900internal static bool IsTargetTypedExpression(BoundExpression node)
4915ArrayBuilder<(BoundExpression expr, TypeWithAnnotations resultType, bool isChecked)> returns,
4939var placeholdersBuilder = ArrayBuilder<BoundExpression>.GetInstance(n);
4959BoundExpression placeholder = placeholders[i];
4980private static void GetArrayElements(BoundArrayInitialization node, ArrayBuilder<BoundExpression> builder)
4982foreach (var child in node.Initializers)
5009foreach (var i in node.Indices)
5182static bool isKnownNullOrNotNull(BoundExpression expr, TypeWithState resultType)
5188LocalState getUnconditionalStateWhenNotNull(BoundExpression otherOperand, PossiblyConditionalState conditionalStateWhenNotNull)
5276BoundExpression leftOperand,
5279BoundExpression rightOperand,
5289BoundExpression binary,
5293BoundExpression left,
5294BoundExpression leftOperand,
5297BoundExpression right,
5298BoundExpression rightOperand,
5331BoundExpression expr,
5332BoundExpression operand,
5371TypeSymbol? getTypeIfContainingType(TypeSymbol baseType, TypeSymbol? derivedType, BoundExpression operand)
5388private void VisitBinaryOperatorOperandConversionAndPostConditions(BoundExpression expr, BoundExpression operand, Conversion conversion, ParameterSymbol parameter, TypeWithState operandType, bool isLifted)
5419BoundExpression leftOperand,
5437BoundExpression? operandComparedToNull = null;
5460BoundExpression? operandComparedToNonNull = null;
5490private void SplitAndLearnFromNonNullTest(BoundExpression operandComparedToNonNull, bool whenTrue)
5522private void GetSlotsToMarkAsNotNullable(BoundExpression operand, ArrayBuilder<int> slotBuilder)
5616private void LearnFromNonNullTest(BoundExpression expression, ref LocalState state)
5644private void LearnFromNullTest(BoundExpression expression, ref LocalState state)
5651var expressionWithoutConversion = RemoveConversion(expression, includeExplicitConversions: true).expression;
5737private static BoundExpression SkipReferenceConversions(BoundExpression possiblyConversion)
5758BoundExpression leftOperand = node.LeftOperand;
5759BoundExpression rightOperand = node.RightOperand;
5797BoundExpression leftOperand = node.LeftOperand;
5798BoundExpression rightOperand = node.RightOperand;
5893private bool TryVisitConditionalAccess(BoundExpression node, out PossiblyConditionalState stateWhenNotNull)
5929private bool VisitPossibleConditionalAccess(BoundExpression node, out PossiblyConditionalState stateWhenNotNull)
5962var receiver = node.Receiver;
6001BoundExpression expr = node.AccessExpression;
6018Debug.Assert(expr is BoundExpression);
6028Debug.Assert(expr is BoundExpression);
6062void makeAndAdjustReceiverSlot(BoundExpression receiver)
6084BoundExpression node,
6086BoundExpression condition,
6087BoundExpression originalConsequence,
6088BoundExpression originalAlternative)
6119BoundExpression consequencePlaceholder = CreatePlaceholderIfNecessary(originalConsequence, consequenceLValue);
6120BoundExpression alternativePlaceholder = CreatePlaceholderIfNecessary(originalAlternative, alternativeLValue);
6138(var consequence, var consequenceConversion, consequenceRValue) = visitConditionalOperand(consequenceState, originalConsequence);
6143(var alternative, var alternativeConversion, alternativeRValue) = visitConditionalOperand(alternativeState, originalAlternative);
6175BoundExpression consequencePlaceholder = CreatePlaceholderIfNecessary(consequence, consequenceRValue.ToTypeWithAnnotations(compilation));
6176BoundExpression alternativePlaceholder = CreatePlaceholderIfNecessary(alternative, alternativeRValue.ToTypeWithAnnotations(compilation));
6217BoundExpression node, BoundExpression originalConsequence, BoundExpression originalAlternative, LocalState consequenceState, LocalState alternativeState,
6218TypeWithState consequenceRValue, TypeWithState alternativeRValue, BoundExpression consequence, Conversion consequenceConversion, bool consequenceEndReachable,
6219BoundExpression alternative, Conversion alternativeConversion, bool alternativeEndReachable, TypeWithAnnotations resultTypeWithAnnotations, bool wasTargetTyped)
6261BoundExpression node,
6262BoundExpression originalConsequence,
6263BoundExpression originalAlternative,
6268BoundExpression consequence,
6271BoundExpression alternative,
6285(BoundExpression, Conversion, TypeWithState) visitConditionalOperand(LocalState state, BoundExpression operand)
6291BoundExpression operandNoConversion;
6298(TypeWithAnnotations LValueType, TypeWithState RValueType) visitConditionalRefOperand(LocalState state, BoundExpression operand)
6306void reportMismatchIfNecessary(BoundExpression node, TypeWithAnnotations source, TypeWithAnnotations destination)
6316BoundExpression node,
6317BoundExpression operand,
6367private static BoundExpression CreatePlaceholderIfNecessary(BoundExpression expr, TypeWithAnnotations type)
6519ImmutableArray<BoundExpression> arguments = getArguments(node.Arguments, adjustForNewExtension, node.ReceiverOpt);
6543static ImmutableArray<BoundExpression> getArguments(ImmutableArray<BoundExpression> arguments, bool isNewExtension, BoundExpression? receiver)
6654if (node.ReceiverOpt is BoundExpression receiver &&
6761void learnFromEqualsMethodArguments(BoundExpression left, TypeWithState leftType, BoundExpression right, TypeWithState rightType)
6803public readonly ImmutableArray<BoundExpression> Arguments;
6807public CompareExchangeInfo(ImmutableArray<BoundExpression> arguments, ImmutableArray<VisitResult> results, ImmutableArray<int> argsToParamsOpt)
6846var comparand = compareExchangeInfo.Arguments[comparandIndex];
6862private void CheckCallReceiver(BoundExpression? receiverOpt, TypeWithState receiverType, MethodSymbol method)
7038protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7045BoundExpression node,
7046ImmutableArray<BoundExpression> arguments,
7058BoundExpression node,
7059ImmutableArray<BoundExpression> arguments,
7072ImmutableArray<BoundExpression> arguments,
7094ImmutableArray<BoundExpression> arguments,
7120(ImmutableArray<BoundExpression> argumentsNoConversions, ImmutableArray<Conversion> conversions) = RemoveArgumentConversions(arguments, refKindsOpt);
7133ImmutableArray<BoundExpression> arguments,
7134ImmutableArray<BoundExpression> argumentsNoConversions,
7202var argumentNoConversion = argumentsNoConversions[i];
7203var argument = i < arguments.Length ? arguments[i] : argumentNoConversion;
7305var argument = arguments[i];
7307var argumentNoConversion = argumentsNoConversions[i];
7323ImmutableArray<BoundExpression> arguments,
7324ImmutableArray<BoundExpression> argumentsNoConversions,
7344static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7354BoundExpression argument = arguments[a];
7358ImmutableArray<BoundExpression> elements;
7366elements = ((BoundCollectionExpression)((BoundConversion)argument).Operand).UnconvertedCollectionExpression.Elements.CastArray<BoundExpression>();
7387var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(arguments.Length + elements.Length - 1);
7419bool tryShortCircuitTargetTypedExpression(BoundExpression argument, BoundExpression argumentNoConversion)
7439private void ApplyMemberPostConditions(BoundExpression? receiverOpt, MethodSymbol? method)
7578ImmutableArray<BoundExpression> arguments,
7612private ImmutableArray<FlowAnalysisAnnotations> GetParametersAnnotations(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parametersOpt, ImmutableArray<int> argsToParamsOpt, bool expanded)
7640private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
7646private bool VisitArgumentEvaluateNeedsCloningState(BoundExpression argument)
7652private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
7705BoundExpression argumentNoConversion,
7792private bool CheckDisallowedNullAssignment(TypeWithState state, FlowAnalysisAnnotations annotations, SyntaxNode node, BoundExpression? boundValueOpt = null)
7843BoundExpression argument,
7959void trackNullableStateForAssignment(BoundExpression parameterValue, TypeWithAnnotations lValueType, int targetSlot, TypeWithState parameterWithState, bool isSuppressed, FlowAnalysisAnnotations parameterAnnotations)
8049private void LearnFromPostConditions(BoundExpression argument, FlowAnalysisAnnotations parameterAnnotations)
8095private (ImmutableArray<BoundExpression> arguments, ImmutableArray<Conversion> conversions) RemoveArgumentConversions(
8096ImmutableArray<BoundExpression> arguments,
8103var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(n);
8109var argument = arguments[i];
8113var before = argument;
8178ImmutableArray<BoundExpression> arguments,
8246internal override TypeWithAnnotations GetTypeWithAnnotations(BoundExpression expr)
8257private static NullableAnnotation GetNullableAnnotation(BoundExpression expr)
8292private ImmutableArray<BoundExpression> GetArgumentsForMethodTypeInference(ImmutableArray<VisitResult> argumentResults, ImmutableArray<BoundExpression> arguments)
8300var builder = ArrayBuilder<BoundExpression>.GetInstance(n);
8308BoundExpression getArgumentForMethodTypeInference(BoundExpression argument, VisitResult visitResult)
8332if (collection.Elements[i] is BoundExpression elementExpression)
8440private static (BoundExpression expression, Conversion conversion) RemoveConversion(BoundExpression expr, bool includeExplicitConversions)
8478private Conversion GenerateConversionForConditionalOperator(BoundExpression sourceExpression, TypeSymbol? sourceType, TypeSymbol destinationType, bool reportMismatch, bool isChecked)
8489private Conversion GenerateConversion(Conversions conversions, BoundExpression? sourceExpression, TypeSymbol? sourceType, TypeSymbol destinationType, bool fromExplicitCast, bool extensionMethodThisArgument, bool isChecked)
8518private bool UseExpressionForConversion([NotNullWhen(true)] BoundExpression? value)
8672(BoundExpression operand, Conversion conversion) = RemoveConversion(node, includeExplicitConversions: true);
8707private TypeWithState VisitOptionalImplicitConversion(BoundExpression expr, TypeWithAnnotations targetTypeOpt, bool useLegacyWarnings, bool trackMembers, AssignmentKind assignmentKind)
8720BoundExpression expr,
8727(BoundExpression operand, Conversion conversion) = RemoveConversion(expr, includeExplicitConversions: false);
8734BoundExpression expr,
8737BoundExpression operand,
8770Func<TypeWithAnnotations, TypeWithState> visitConversionAsContinuation(BoundExpression expr, bool useLegacyWarnings, bool trackMembers, AssignmentKind assignmentKind, BoundExpression operand, Conversion conversion, TypeWithState operandType)
8862ImmutableArray<BoundExpression> values,
8893void trackState(BoundExpression value, FieldSymbol field, TypeWithState valueType)
8907private void TrackNullableStateOfNullableValue(int containingSlot, TypeSymbol containingType, BoundExpression? value, TypeWithState valueType, int valueSlot)
8922BoundExpression convertedNode,
9145private static BoundConversion? GetConversionIfApplicable(BoundExpression? conversionOpt, BoundExpression convertedNode)
9176BoundExpression conversionOperand,
9728BoundExpression conversionOperand,
9872private void SnapshotWalkerThroughConversionGroup(BoundExpression conversionExpression, BoundExpression convertedNode)
9891private void TrackAnalyzedNullabilityThroughConversionGroup(TypeWithState resultType, BoundConversion? conversionOpt, BoundExpression convertedNode)
9948BoundExpression node,
10014case BoundExpression arg when arg.Type is { TypeKind: TypeKind.Delegate }:
10126Action<NamedTypeSymbol>? visitDelegateArgument(NamedTypeSymbol delegateType, BoundExpression arg, bool isTargetTyped)
10140Action<NamedTypeSymbol>? analyzeDelegateConversion(NamedTypeSymbol delegateType, BoundExpression arg, bool isTargetTyped)
10160Action<NamedTypeSymbol> analyzeDelegateConversionAsContinuation(BoundExpression arg)
10170var receiverOpt = node.ReceiverOpt;
10184private bool TryGetMethodGroupReceiverNullability([NotNullWhen(true)] BoundExpression? receiverOpt, out TypeWithState type)
10199private void SetMethodGroupReceiverNullability(BoundExpression receiver, TypeWithState type)
10201_methodGroupReceiverMapOpt ??= PooledDictionary<BoundExpression, TypeWithState>.GetInstance();
10207var receiverOpt = group.ReceiverOpt;
10220var arguments = ArrayBuilder<BoundExpression>.GetInstance();
10326private void VisitThisOrBaseReference(BoundExpression node)
10347var left = node.Left;
10348var right = node.Right;
10433private void AdjustSetValue(BoundExpression left, ref TypeWithState rightState)
10448private FlowAnalysisAnnotations GetLValueAnnotations(BoundExpression expr)
10509private static bool UseLegacyWarnings(BoundExpression expr)
10557private void VisitDeconstructionArguments(ArrayBuilder<DeconstructionVariable> variables, Conversion conversion, BoundExpression right, TypeWithState? rightResultOpt = null)
10571private void VisitDeconstructMethodArguments(ArrayBuilder<DeconstructionVariable> variables, Conversion conversion, BoundExpression right, TypeWithState? rightResultOpt)
10605ArrayBuilder<BoundExpression> placeholderArgs = ArrayBuilder<BoundExpression>.GetInstance(n + 1);
10645var nestedRight = CreatePlaceholderIfNecessary(invocation.Arguments[i + offset], parameter.TypeWithAnnotations);
10672private void VisitTupleDeconstructionArguments(ArrayBuilder<DeconstructionVariable> variables, ImmutableArray<(BoundValuePlaceholder? placeholder, BoundExpression? conversion)> deconstructConversionInfo, BoundExpression right, TypeWithState? rightResultOpt)
10683var rightPart = rightParts[i];
10758internal readonly BoundExpression Expression;
10762internal DeconstructionVariable(BoundExpression expression, TypeWithAnnotations type)
10769internal DeconstructionVariable(BoundExpression expression, ArrayBuilder<DeconstructionVariable> nestedVariables)
10781foreach (var argument in arguments)
10787DeconstructionVariable getDeconstructionAssignmentVariable(BoundExpression expr)
10805private ImmutableArray<BoundExpression> GetDeconstructionRightParts(BoundExpression expr, TypeWithState? rightResultOpt)
10835return fields.SelectAsArray((f, e) => (BoundExpression)new BoundFieldAccess(e.Syntax, e, f, constantValueOpt: null), expr);
11037var initializer = node.Expression;
11059private void ReportArgumentWarnings(BoundExpression argument, TypeWithState argumentType, ParameterSymbol parameter)
11070private void ReportNullabilityMismatchInRefArgument(BoundExpression argument, TypeSymbol argumentType, ParameterSymbol parameter, TypeSymbol parameterType)
11133ImmutableArray<BoundExpression> arguments = [node.ReceiverOpt];
11177var receiverOpt = node.ReceiverOpt;
11246private Symbol VisitMemberAccess(BoundExpression node, BoundExpression? receiverOpt, Symbol member)
11350BoundExpression collectionExpression,
11352BoundExpression expr,
11672foreach (var child in node.ChildBoundNodes)
11683VisitRvalue(child as BoundExpression);
11844protected override void AfterLeftChildOfBinaryLogicalOperatorHasBeenVisited(BoundExpression node, BoundExpression right, bool isAnd, bool isBool, ref LocalState leftTrue, ref LocalState leftFalse)
11851BoundExpression? left = null;
11903private TypeWithState InferResultNullabilityOfBinaryLogicalOperator(BoundExpression node, TypeWithState leftType, TypeWithState rightType)
11997var operand = node.Operand;
12141var receiver = node.Receiver;
12153var expr = node.Expression;
12157var receiverOpt = (expr as BoundMethodGroup)?.ReceiverOpt;
12173var receiverOpt = node.ReceiverOpt;
12258private void SetUnknownResultNullability(BoundExpression expression)
12265var receiver = node.Receiver;
12277private bool CheckPossibleNullReceiver(BoundExpression? receiverOpt, bool checkNullableValueType = false)
12282private bool CheckPossibleNullReceiver(BoundExpression? receiverOpt, TypeWithState resultType, bool checkNullableValueType)
12326private void CheckExtensionMethodThisNullability(BoundExpression expr, Conversion conversion, ParameterSymbol parameter, TypeWithState result)
12393protected override void VisitInterpolatedStringHandlerConstructor(BoundExpression? constructor)
12462private void VisitThrow(BoundExpression? expr)
12481BoundExpression 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)
160foreach (var child in node.ChildBoundNodes)
234foreach (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 (1053)
273protected BoundEqualsValue(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
285public BoundExpression Value { get; }
290public BoundFieldEqualsValue(SyntaxNode syntax, FieldSymbol field, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
306public BoundFieldEqualsValue Update(FieldSymbol field, ImmutableArray<LocalSymbol> locals, BoundExpression value)
320public BoundPropertyEqualsValue(SyntaxNode syntax, PropertySymbol property, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
336public BoundPropertyEqualsValue Update(PropertySymbol property, ImmutableArray<LocalSymbol> locals, BoundExpression value)
350public BoundParameterEqualsValue(SyntaxNode syntax, ParameterSymbol parameter, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
366public BoundParameterEqualsValue Update(ParameterSymbol parameter, ImmutableArray<LocalSymbol> locals, BoundExpression value)
481public BoundCapturedReceiverPlaceholder(SyntaxNode syntax, BoundExpression receiver, SafeContext localScopeDepth, TypeSymbol? type, bool hasErrors = false)
491public BoundExpression Receiver { get; }
497public BoundCapturedReceiverPlaceholder Update(BoundExpression receiver, SafeContext localScopeDepth, TypeSymbol? type)
933public BoundPassByCopy(SyntaxNode syntax, BoundExpression expression, TypeSymbol? type, bool hasErrors = false)
942public BoundExpression Expression { get; }
947public BoundPassByCopy Update(BoundExpression expression, TypeSymbol? type)
961public BoundBadExpression(SyntaxNode syntax, LookupResultKind resultKind, ImmutableArray<Symbol?> symbols, ImmutableArray<BoundExpression> childBoundNodes, TypeSymbol? type, bool hasErrors = false)
975public ImmutableArray<BoundExpression> ChildBoundNodes { get; }
980public BoundBadExpression Update(LookupResultKind resultKind, ImmutableArray<Symbol?> symbols, ImmutableArray<BoundExpression> childBoundNodes, TypeSymbol? type)
1050public BoundTypeExpression(SyntaxNode syntax, AliasSymbol? aliasOpt, BoundTypeExpression? boundContainingTypeOpt, ImmutableArray<BoundExpression> boundDimensionsOpt, TypeWithAnnotations typeWithAnnotations, TypeSymbol type, bool hasErrors = false)
1064public ImmutableArray<BoundExpression> BoundDimensionsOpt { get; }
1071public BoundTypeExpression Update(AliasSymbol? aliasOpt, BoundTypeExpression? boundContainingTypeOpt, ImmutableArray<BoundExpression> boundDimensionsOpt, TypeWithAnnotations typeWithAnnotations, TypeSymbol type)
1164public BoundUnaryOperator(SyntaxNode syntax, UnaryOperatorKind operatorKind, BoundExpression operand, ConstantValue? constantValueOpt, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type, bool hasErrors = false)
1182public BoundExpression Operand { get; }
1192public BoundUnaryOperator Update(UnaryOperatorKind operatorKind, BoundExpression operand, ConstantValue? constantValueOpt, MethodSymbol? methodOpt, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type)
1206public 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)
1227public BoundExpression Operand { get; }
1231public BoundExpression? OperandConversion { get; }
1233public BoundExpression? ResultConversion { get; }
1240public 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)
1254public BoundAddressOfOperator(SyntaxNode syntax, BoundExpression operand, bool isManaged, TypeSymbol type, bool hasErrors = false)
1266public BoundExpression Operand { get; }
1272public BoundAddressOfOperator Update(BoundExpression operand, bool isManaged, TypeSymbol type)
1358public BoundPointerIndirectionOperator(SyntaxNode syntax, BoundExpression operand, bool refersToLocation, TypeSymbol type, bool hasErrors = false)
1370public BoundExpression Operand { get; }
1376public BoundPointerIndirectionOperator Update(BoundExpression operand, bool refersToLocation, TypeSymbol type)
1390public BoundPointerElementAccess(SyntaxNode syntax, BoundExpression expression, BoundExpression index, bool @checked, bool refersToLocation, TypeSymbol type, bool hasErrors = false)
1405public BoundExpression Expression { get; }
1406public BoundExpression Index { get; }
1413public BoundPointerElementAccess Update(BoundExpression expression, BoundExpression index, bool @checked, bool refersToLocation, TypeSymbol type)
1427public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1442public BoundExpression InvokedExpression { get; }
1443public ImmutableArray<BoundExpression> Arguments { get; }
1450public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
1464public BoundRefTypeOperator(SyntaxNode syntax, BoundExpression operand, MethodSymbol? getTypeFromHandle, TypeSymbol type, bool hasErrors = false)
1476public BoundExpression Operand { get; }
1482public BoundRefTypeOperator Update(BoundExpression operand, MethodSymbol? getTypeFromHandle, TypeSymbol type)
1496public BoundMakeRefOperator(SyntaxNode syntax, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
1507public BoundExpression Operand { get; }
1512public BoundMakeRefOperator Update(BoundExpression operand, TypeSymbol type)
1526public BoundRefValueOperator(SyntaxNode syntax, NullableAnnotation nullableAnnotation, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
1539public BoundExpression Operand { get; }
1544public BoundRefValueOperator Update(NullableAnnotation nullableAnnotation, BoundExpression operand, TypeSymbol type)
1558public BoundFromEndIndexExpression(SyntaxNode syntax, BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol type, bool hasErrors = false)
1570public BoundExpression Operand { get; }
1576public BoundFromEndIndexExpression Update(BoundExpression operand, MethodSymbol? methodOpt, TypeSymbol type)
1590public BoundRangeExpression(SyntaxNode syntax, BoundExpression? leftOperandOpt, BoundExpression? rightOperandOpt, MethodSymbol? methodOpt, TypeSymbol type, bool hasErrors = false)
1602public BoundExpression? LeftOperandOpt { get; }
1603public BoundExpression? RightOperandOpt { get; }
1609public BoundRangeExpression Update(BoundExpression? leftOperandOpt, BoundExpression? rightOperandOpt, MethodSymbol? methodOpt, TypeSymbol type)
1623protected BoundBinaryOperatorBase(BoundKind kind, SyntaxNode syntax, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1636public BoundExpression Left { get; }
1637public BoundExpression Right { get; }
1642public BoundBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1662public BoundBinaryOperator Update(BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type)
1676public BoundTupleBinaryOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type, bool hasErrors = false)
1692public BoundExpression Left { get; }
1693public BoundExpression Right { get; }
1700public BoundTupleBinaryOperator Update(BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type)
1714public 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)
1741public BoundExpression? TrueFalseOperandConversion { get; }
1749public 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)
1763public 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)
1784public BoundExpression Left { get; }
1785public BoundExpression Right { get; }
1787public BoundExpression? LeftConversion { get; }
1789public BoundExpression? FinalConversion { get; }
1796public BoundCompoundAssignmentOperator Update(BinaryOperatorSignature @operator, BoundExpression left, BoundExpression right, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundValuePlaceholder? finalPlaceholder, BoundExpression? finalConversion, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, TypeSymbol type)
1810public BoundAssignmentOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right, bool isRef, TypeSymbol type, bool hasErrors = false)
1823public BoundExpression Left { get; }
1824public BoundExpression Right { get; }
1830public BoundAssignmentOperator Update(BoundExpression left, BoundExpression right, bool isRef, TypeSymbol type)
1879public BoundNullCoalescingOperator(SyntaxNode syntax, BoundExpression leftOperand, BoundExpression rightOperand, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundNullCoalescingOperatorResultKind operatorResultKind, bool @checked, TypeSymbol type, bool hasErrors = false)
1896public BoundExpression LeftOperand { get; }
1897public BoundExpression RightOperand { get; }
1899public BoundExpression? LeftConversion { get; }
1906public BoundNullCoalescingOperator Update(BoundExpression leftOperand, BoundExpression rightOperand, BoundValuePlaceholder? leftPlaceholder, BoundExpression? leftConversion, BoundNullCoalescingOperatorResultKind operatorResultKind, bool @checked, TypeSymbol type)
1920public BoundNullCoalescingAssignmentOperator(SyntaxNode syntax, BoundExpression leftOperand, BoundExpression rightOperand, TypeSymbol? type, bool hasErrors = false)
1931public BoundExpression LeftOperand { get; }
1932public BoundExpression RightOperand { get; }
1937public BoundNullCoalescingAssignmentOperator Update(BoundExpression leftOperand, BoundExpression rightOperand, TypeSymbol? type)
1951public BoundUnconvertedConditionalOperator(SyntaxNode syntax, BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, ErrorCode noCommonTypeError, bool hasErrors = false)
1967public BoundExpression Condition { get; }
1968public BoundExpression Consequence { get; }
1969public BoundExpression Alternative { get; }
1976public BoundUnconvertedConditionalOperator Update(BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, ErrorCode noCommonTypeError)
1990public BoundConditionalOperator(SyntaxNode syntax, bool isRef, BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
2010public BoundExpression Condition { get; }
2011public BoundExpression Consequence { get; }
2012public BoundExpression Alternative { get; }
2020public BoundConditionalOperator Update(bool isRef, BoundExpression condition, BoundExpression consequence, BoundExpression alternative, ConstantValue? constantValueOpt, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, TypeSymbol type)
2034public BoundArrayAccess(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundExpression> indices, TypeSymbol type, bool hasErrors = false)
2047public BoundExpression Expression { get; }
2048public ImmutableArray<BoundExpression> Indices { get; }
2053public BoundArrayAccess Update(BoundExpression expression, ImmutableArray<BoundExpression> indices, TypeSymbol type)
2096public BoundArrayLength(SyntaxNode syntax, BoundExpression expression, TypeSymbol type, bool hasErrors = false)
2107public BoundExpression Expression { get; }
2112public BoundArrayLength Update(BoundExpression expression, TypeSymbol type)
2126public BoundAwaitableInfo(SyntaxNode syntax, BoundAwaitableValuePlaceholder? awaitableInstancePlaceholder, bool isDynamic, BoundExpression? getAwaiter, PropertySymbol? isCompleted, MethodSymbol? getResult, bool hasErrors = false)
2138public BoundExpression? GetAwaiter { get; }
2145public BoundAwaitableInfo Update(BoundAwaitableValuePlaceholder? awaitableInstancePlaceholder, bool isDynamic, BoundExpression? getAwaiter, PropertySymbol? isCompleted, MethodSymbol? getResult)
2159public BoundAwaitExpression(SyntaxNode syntax, BoundExpression expression, BoundAwaitableInfo awaitableInfo, BoundAwaitExpressionDebugInfo debugInfo, TypeSymbol type, bool hasErrors = false)
2173public BoundExpression Expression { get; }
2180public BoundAwaitExpression Update(BoundExpression expression, BoundAwaitableInfo awaitableInfo, BoundAwaitExpressionDebugInfo debugInfo, TypeSymbol type)
2833public BoundIsOperator(SyntaxNode syntax, BoundExpression operand, BoundTypeExpression targetType, ConversionKind conversionKind, TypeSymbol type, bool hasErrors = false)
2847public BoundExpression Operand { get; }
2854public BoundIsOperator Update(BoundExpression operand, BoundTypeExpression targetType, ConversionKind conversionKind, TypeSymbol type)
2868public BoundAsOperator(SyntaxNode syntax, BoundExpression operand, BoundTypeExpression targetType, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, TypeSymbol type, bool hasErrors = false)
2883public BoundExpression Operand { get; }
2886public BoundExpression? OperandConversion { get; }
2891public BoundAsOperator Update(BoundExpression operand, BoundTypeExpression targetType, BoundValuePlaceholder? operandPlaceholder, BoundExpression? operandConversion, TypeSymbol type)
2937public BoundConversion(SyntaxNode syntax, BoundExpression operand, Conversion conversion, bool isBaseConversion, bool @checked, bool explicitCastInCode, ConstantValue? constantValueOpt, ConversionGroup? conversionGroupOpt, TypeSymbol type, bool hasErrors = false)
2954public BoundExpression Operand { get; }
2965public BoundConversion Update(BoundExpression operand, Conversion conversion, bool isBaseConversion, bool @checked, bool explicitCastInCode, ConstantValue? constantValueOpt, ConversionGroup? conversionGroupOpt, TypeSymbol type)
2979public BoundReadOnlySpanFromArray(SyntaxNode syntax, BoundExpression operand, MethodSymbol conversionMethod, TypeSymbol type, bool hasErrors = false)
2992public BoundExpression Operand { get; }
2998public BoundReadOnlySpanFromArray Update(BoundExpression operand, MethodSymbol conversionMethod, TypeSymbol type)
3047public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3058public ImmutableArray<BoundExpression> Arguments { get; }
3064public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3078public BoundFixedLocalCollectionInitializer(SyntaxNode syntax, TypeSymbol elementPointerType, BoundValuePlaceholder? elementPointerPlaceholder, BoundExpression? elementPointerConversion, BoundExpression expression, MethodSymbol? getPinnableOpt, TypeSymbol type, bool hasErrors = false)
3096public BoundExpression? ElementPointerConversion { get; }
3097public BoundExpression Expression { get; }
3103public BoundFixedLocalCollectionInitializer Update(TypeSymbol elementPointerType, BoundValuePlaceholder? elementPointerPlaceholder, BoundExpression? elementPointerConversion, BoundExpression expression, MethodSymbol? getPinnableOpt, TypeSymbol type)
3384public BoundLocalDeclaration(SyntaxNode syntax, LocalSymbol localSymbol, BoundTypeExpression? declaredTypeOpt, BoundExpression? initializerOpt, ImmutableArray<BoundExpression> argumentsOpt, bool inferredType, bool hasErrors = false)
3399public BoundExpression? InitializerOpt { get; }
3400public ImmutableArray<BoundExpression> ArgumentsOpt { get; }
3406public BoundLocalDeclaration Update(LocalSymbol localSymbol, BoundTypeExpression? declaredTypeOpt, BoundExpression? initializerOpt, ImmutableArray<BoundExpression> argumentsOpt, bool inferredType)
3553public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3562public BoundExpression? ExpressionOpt { get; }
3568public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
3582public BoundYieldReturnStatement(SyntaxNode syntax, BoundExpression expression, bool hasErrors = false)
3591public BoundExpression Expression { get; }
3596public BoundYieldReturnStatement Update(BoundExpression expression)
3627public BoundThrowStatement(SyntaxNode syntax, BoundExpression? expressionOpt, bool hasErrors = false)
3633public BoundExpression? ExpressionOpt { get; }
3638public BoundThrowStatement Update(BoundExpression? expressionOpt)
3652public BoundExpressionStatement(SyntaxNode syntax, BoundExpression expression, bool hasErrors = false)
3661public BoundExpression Expression { get; }
3666public BoundExpressionStatement Update(BoundExpression expression)
3754public BoundSwitchStatement(SyntaxNode syntax, BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel, bool hasErrors = false)
3774public BoundExpression Expression { get; }
3785public BoundSwitchStatement Update(BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel)
3799public BoundSwitchDispatch(SyntaxNode syntax, BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt, bool hasErrors = false)
3813public BoundExpression Expression { get; }
3821public BoundSwitchDispatch Update(BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt)
3835public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, BoundStatement consequence, BoundStatement? alternativeOpt, bool hasErrors = false)
3847public BoundExpression Condition { get; }
3854public BoundIfStatement Update(BoundExpression condition, BoundStatement consequence, BoundStatement? alternativeOpt)
3896protected BoundConditionalLoopStatement(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3912public BoundExpression Condition { get; }
3918public BoundDoStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3934public BoundDoStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3948public BoundWhileStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3964public BoundWhileStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3978public BoundForStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3999public BoundExpression? Condition { get; }
4006public BoundForStatement Update(ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4020public BoundForEachStatement(SyntaxNode syntax, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundAwaitableInfo? awaitOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4045public BoundExpression? ElementConversion { get; }
4048public BoundExpression? IterationErrorExpressionOpt { get; }
4049public BoundExpression Expression { get; }
4057public BoundForEachStatement Update(ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundAwaitableInfo? awaitOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4102public BoundUsingStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations? declarationsOpt, BoundExpression? expressionOpt, BoundStatement body, BoundAwaitableInfo? awaitOpt, MethodArgumentInfo? patternDisposeInfoOpt, bool hasErrors = false)
4119public BoundExpression? ExpressionOpt { get; }
4127public BoundUsingStatement Update(ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations? declarationsOpt, BoundExpression? expressionOpt, BoundStatement body, BoundAwaitableInfo? awaitOpt, MethodArgumentInfo? patternDisposeInfoOpt)
4175public BoundLockStatement(SyntaxNode syntax, BoundExpression argument, BoundStatement body, bool hasErrors = false)
4186public BoundExpression Argument { get; }
4192public BoundLockStatement Update(BoundExpression argument, BoundStatement body)
4243public BoundCatchBlock(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression? exceptionSourceOpt, TypeSymbol? exceptionTypeOpt, BoundStatementList? exceptionFilterPrologueOpt, BoundExpression? exceptionFilterOpt, BoundBlock body, bool isSynthesizedAsyncCatchAll, bool hasErrors = false)
4260public BoundExpression? ExceptionSourceOpt { get; }
4263public BoundExpression? ExceptionFilterOpt { get; }
4270public BoundCatchBlock Update(ImmutableArray<LocalSymbol> locals, BoundExpression? exceptionSourceOpt, TypeSymbol? exceptionTypeOpt, BoundStatementList? exceptionFilterPrologueOpt, BoundExpression? exceptionFilterOpt, BoundBlock body, bool isSynthesizedAsyncCatchAll)
4583public BoundRangeVariable(SyntaxNode syntax, RangeVariableSymbol rangeVariableSymbol, BoundExpression value, TypeSymbol type, bool hasErrors = false)
4597public BoundExpression Value { get; }
4602public BoundRangeVariable Update(RangeVariableSymbol rangeVariableSymbol, BoundExpression value, TypeSymbol type)
4693public BoundGotoStatement(SyntaxNode syntax, LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt, bool hasErrors = false)
4705public BoundExpression? CaseExpressionOpt { get; }
4711public BoundGotoStatement Update(LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt)
4830public BoundConditionalGoto(SyntaxNode syntax, BoundExpression condition, bool jumpIfTrue, LabelSymbol label, bool hasErrors = false)
4842public BoundExpression Condition { get; }
4849public BoundConditionalGoto Update(BoundExpression condition, bool jumpIfTrue, LabelSymbol label)
4863protected BoundSwitchExpression(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4878public BoundExpression Expression { get; }
4887public BoundSwitchExpressionArm(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label, bool hasErrors = false)
4905public BoundExpression? WhenClause { get; }
4906public BoundExpression Value { get; }
4912public BoundSwitchExpressionArm Update(ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label)
4926public BoundUnconvertedSwitchExpression(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4940public BoundUnconvertedSwitchExpression Update(BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type)
4954public BoundConvertedSwitchExpression(SyntaxNode syntax, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type, bool hasErrors = false)
4974public BoundConvertedSwitchExpression Update(TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type)
5095public BoundWhenDecisionDagNode(SyntaxNode syntax, ImmutableArray<BoundPatternBinding> bindings, BoundExpression? whenExpression, BoundDecisionDagNode whenTrue, BoundDecisionDagNode? whenFalse, bool hasErrors = false)
5109public BoundExpression? WhenExpression { get; }
5116public BoundWhenDecisionDagNode Update(ImmutableArray<BoundPatternBinding> bindings, BoundExpression? whenExpression, BoundDecisionDagNode whenTrue, BoundDecisionDagNode? whenFalse)
5517public BoundDagIndexerEvaluation(SyntaxNode syntax, TypeSymbol indexerType, BoundDagTemp lengthTemp, int index, BoundExpression indexerAccess, BoundListPatternReceiverPlaceholder receiverPlaceholder, BoundListPatternIndexPlaceholder argumentPlaceholder, BoundDagTemp input, bool hasErrors = false)
5543public BoundExpression IndexerAccess { get; }
5550public BoundDagIndexerEvaluation Update(TypeSymbol indexerType, BoundDagTemp lengthTemp, int index, BoundExpression indexerAccess, BoundListPatternReceiverPlaceholder receiverPlaceholder, BoundListPatternIndexPlaceholder argumentPlaceholder, BoundDagTemp input)
5564public BoundDagSliceEvaluation(SyntaxNode syntax, TypeSymbol sliceType, BoundDagTemp lengthTemp, int startIndex, int endIndex, BoundExpression indexerAccess, BoundSlicePatternReceiverPlaceholder receiverPlaceholder, BoundSlicePatternRangePlaceholder argumentPlaceholder, BoundDagTemp input, bool hasErrors = false)
5592public BoundExpression IndexerAccess { get; }
5599public BoundDagSliceEvaluation Update(TypeSymbol sliceType, BoundDagTemp lengthTemp, int startIndex, int endIndex, BoundExpression indexerAccess, BoundSlicePatternReceiverPlaceholder receiverPlaceholder, BoundSlicePatternRangePlaceholder argumentPlaceholder, BoundDagTemp input)
5674public BoundSwitchLabel(SyntaxNode syntax, LabelSymbol label, BoundPattern pattern, BoundExpression? whenClause, bool hasErrors = false)
5688public BoundExpression? WhenClause { get; }
5693public BoundSwitchLabel Update(LabelSymbol label, BoundPattern pattern, BoundExpression? whenClause)
5707protected BoundMethodOrPropertyGroup(BoundKind kind, SyntaxNode syntax, BoundExpression? receiverOpt, LookupResultKind resultKind, bool hasErrors = false)
5715public BoundExpression? ReceiverOpt { get; }
5721public BoundSequencePointExpression(SyntaxNode syntax, BoundExpression expression, TypeSymbol? type, bool hasErrors = false)
5730public BoundExpression Expression { get; }
5735public BoundSequencePointExpression Update(BoundExpression expression, TypeSymbol? type)
5749public BoundSequence(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression value, TypeSymbol type, bool hasErrors = false)
5765public ImmutableArray<BoundExpression> SideEffects { get; }
5766public BoundExpression Value { get; }
5771public BoundSequence Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression value, TypeSymbol type)
5785public BoundSpillSequence(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression value, TypeSymbol type, bool hasErrors = false)
5802public BoundExpression Value { get; }
5807public BoundSpillSequence Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression value, TypeSymbol type)
5821public BoundDynamicMemberAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, bool invoked, bool indexed, TypeSymbol type, bool hasErrors = false)
5837public BoundExpression Receiver { get; }
5846public BoundDynamicMemberAccess Update(BoundExpression receiver, ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, bool invoked, bool indexed, TypeSymbol type)
5860protected BoundDynamicInvocableBase(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol? type, bool hasErrors = false)
5871public BoundExpression Expression { get; }
5872public ImmutableArray<BoundExpression> Arguments { get; }
5877public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5899public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
5913public BoundConditionalAccess(SyntaxNode syntax, BoundExpression receiver, BoundExpression accessExpression, TypeSymbol type, bool hasErrors = false)
5926public BoundExpression Receiver { get; }
5927public BoundExpression AccessExpression { get; }
5932public BoundConditionalAccess Update(BoundExpression receiver, BoundExpression accessExpression, TypeSymbol type)
5946public BoundLoweredConditionalAccess(SyntaxNode syntax, BoundExpression receiver, MethodSymbol? hasValueMethodOpt, BoundExpression whenNotNull, BoundExpression? whenNullOpt, int id, bool forceCopyOfNullableValueType, TypeSymbol type, bool hasErrors = false)
5963public BoundExpression Receiver { get; }
5965public BoundExpression WhenNotNull { get; }
5966public BoundExpression? WhenNullOpt { get; }
5973public BoundLoweredConditionalAccess Update(BoundExpression receiver, MethodSymbol? hasValueMethodOpt, BoundExpression whenNotNull, BoundExpression? whenNullOpt, int id, bool forceCopyOfNullableValueType, TypeSymbol type)
6025public BoundComplexConditionalReceiver(SyntaxNode syntax, BoundExpression valueTypeReceiver, BoundExpression referenceTypeReceiver, TypeSymbol type, bool hasErrors = false)
6038public BoundExpression ValueTypeReceiver { get; }
6039public BoundExpression ReferenceTypeReceiver { get; }
6044public BoundComplexConditionalReceiver Update(BoundExpression valueTypeReceiver, BoundExpression referenceTypeReceiver, TypeSymbol type)
6058public 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)
6085public BoundMethodGroup Update(ImmutableArray<TypeWithAnnotations> typeArgumentsOpt, string name, ImmutableArray<MethodSymbol> methods, Symbol? lookupSymbolOpt, DiagnosticInfo? lookupError, BoundMethodGroupFlags? flags, FunctionTypeSymbol? functionType, BoundExpression? receiverOpt, LookupResultKind resultKind)
6099public BoundPropertyGroup(SyntaxNode syntax, ImmutableArray<PropertySymbol> properties, BoundExpression? receiverOpt, LookupResultKind resultKind, bool hasErrors = false)
6113public BoundPropertyGroup Update(ImmutableArray<PropertySymbol> properties, BoundExpression? receiverOpt, LookupResultKind resultKind)
6127public 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)
6151public BoundExpression? ReceiverOpt { get; }
6154public ImmutableArray<BoundExpression> Arguments { get; }
6168public 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)
6182public BoundEventAssignmentOperator(SyntaxNode syntax, EventSymbol @event, bool isAddition, bool isDynamic, BoundExpression? receiverOpt, BoundExpression argument, TypeSymbol type, bool hasErrors = false)
6201public BoundExpression? ReceiverOpt { get; }
6202public BoundExpression Argument { get; }
6207public BoundEventAssignmentOperator Update(EventSymbol @event, bool isAddition, bool isDynamic, BoundExpression? receiverOpt, BoundExpression argument, TypeSymbol type)
6221public 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)
6241public ImmutableArray<BoundExpression> ConstructorArguments { get; }
6252public BoundAttribute Update(MethodSymbol? constructor, ImmutableArray<BoundExpression> constructorArguments, ImmutableArray<string?> constructorArgumentNamesOpt, ImmutableArray<int> constructorArgumentsToParamsOpt, bool constructorExpanded, BitVector constructorDefaultArguments, ImmutableArray<BoundAssignmentOperator> namedArguments, LookupResultKind resultKind, TypeSymbol type)
6266public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6281public ImmutableArray<BoundExpression> Arguments { get; }
6290public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6325public 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)
6349public override ImmutableArray<BoundExpression> Arguments { get; }
6362public 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)
6417public BoundCollectionExpression(SyntaxNode syntax, CollectionExpressionTypeKind collectionTypeKind, BoundObjectOrCollectionValuePlaceholder? placeholder, BoundExpression? collectionCreation, MethodSymbol? collectionBuilderMethod, BoundValuePlaceholder? collectionBuilderInvocationPlaceholder, BoundExpression? collectionBuilderInvocationConversion, bool wasTargetTyped, BoundUnconvertedCollectionExpression unconvertedCollectionExpression, ImmutableArray<BoundNode> elements, TypeSymbol type, bool hasErrors = false)
6438public BoundExpression? CollectionCreation { get; }
6441public BoundExpression? CollectionBuilderInvocationConversion { get; }
6448public BoundCollectionExpression Update(CollectionExpressionTypeKind collectionTypeKind, BoundObjectOrCollectionValuePlaceholder? placeholder, BoundExpression? collectionCreation, MethodSymbol? collectionBuilderMethod, BoundValuePlaceholder? collectionBuilderInvocationPlaceholder, BoundExpression? collectionBuilderInvocationConversion, bool wasTargetTyped, BoundUnconvertedCollectionExpression unconvertedCollectionExpression, ImmutableArray<BoundNode> elements, TypeSymbol type)
6490public BoundCollectionExpressionSpreadElement(SyntaxNode syntax, BoundExpression expression, BoundCollectionExpressionSpreadExpressionPlaceholder? expressionPlaceholder, BoundExpression? conversion, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundExpression? lengthOrCount, BoundValuePlaceholder? elementPlaceholder, BoundStatement? iteratorBody, bool hasErrors = false)
6505public BoundExpression Expression { get; }
6507public BoundExpression? Conversion { get; }
6509public BoundExpression? LengthOrCount { get; }
6516public BoundCollectionExpressionSpreadElement Update(BoundExpression expression, BoundCollectionExpressionSpreadExpressionPlaceholder? expressionPlaceholder, BoundExpression? conversion, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundExpression? lengthOrCount, BoundValuePlaceholder? elementPlaceholder, BoundStatement? iteratorBody)
6530protected BoundTupleExpression(BoundKind kind, SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type, bool hasErrors = false)
6541public ImmutableArray<BoundExpression> Arguments { get; }
6548public BoundTupleLiteral(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type, bool hasErrors = false)
6561public BoundTupleLiteral Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type)
6575public BoundConvertedTupleLiteral(SyntaxNode syntax, BoundTupleLiteral? sourceTuple, bool wasTargetTyped, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type, bool hasErrors = false)
6591public BoundConvertedTupleLiteral Update(BoundTupleLiteral? sourceTuple, bool wasTargetTyped, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<bool> inferredNamesOpt, TypeSymbol? type)
6605public 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)
6624public override ImmutableArray<BoundExpression> Arguments { get; }
6634public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6680protected BoundObjectInitializerExpressionBase(BoundKind kind, SyntaxNode syntax, BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type, bool hasErrors = false)
6694public ImmutableArray<BoundExpression> Initializers { get; }
6699public BoundObjectInitializerExpression(SyntaxNode syntax, BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type, bool hasErrors = false)
6713public BoundObjectInitializerExpression Update(BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type)
6727public 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)
6749public ImmutableArray<BoundExpression> Arguments { get; }
6762public 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)
6821public BoundCollectionInitializerExpression(SyntaxNode syntax, BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type, bool hasErrors = false)
6835public BoundCollectionInitializerExpression Update(BoundObjectOrCollectionValuePlaceholder placeholder, ImmutableArray<BoundExpression> initializers, TypeSymbol type)
6849public 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)
6869public ImmutableArray<BoundExpression> Arguments { get; }
6870public BoundExpression? ImplicitReceiverOpt { get; }
6880public BoundCollectionElementInitializer Update(MethodSymbol addMethod, ImmutableArray<BoundExpression> arguments, BoundExpression? implicitReceiverOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, bool invokedAsExtensionMethod, LookupResultKind resultKind, TypeSymbol type)
6894public BoundDynamicCollectionElementInitializer(SyntaxNode syntax, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
6912public BoundDynamicCollectionElementInitializer Update(ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6961public BoundAnonymousObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<BoundAnonymousPropertyDeclaration> declarations, TypeSymbol type, bool hasErrors = false)
6977public ImmutableArray<BoundExpression> Arguments { get; }
6983public BoundAnonymousObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<BoundAnonymousPropertyDeclaration> declarations, TypeSymbol type)
7067public BoundDelegateCreationExpression(SyntaxNode syntax, BoundExpression argument, MethodSymbol? methodOpt, bool isExtensionMethod, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
7081public BoundExpression Argument { get; }
7089public BoundDelegateCreationExpression Update(BoundExpression argument, MethodSymbol? methodOpt, bool isExtensionMethod, bool wasTargetTyped, TypeSymbol type)
7103public BoundArrayCreation(SyntaxNode syntax, ImmutableArray<BoundExpression> bounds, BoundArrayInitialization? initializerOpt, TypeSymbol type, bool hasErrors = false)
7115public ImmutableArray<BoundExpression> Bounds { get; }
7121public BoundArrayCreation Update(ImmutableArray<BoundExpression> bounds, BoundArrayInitialization? initializerOpt, TypeSymbol type)
7135public BoundArrayInitialization(SyntaxNode syntax, bool isInferred, ImmutableArray<BoundExpression> initializers, bool hasErrors = false)
7147public ImmutableArray<BoundExpression> Initializers { get; }
7152public BoundArrayInitialization Update(bool isInferred, ImmutableArray<BoundExpression> initializers)
7166protected BoundStackAllocArrayCreationBase(BoundKind kind, SyntaxNode syntax, TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol? type, bool hasErrors = false)
7179public BoundExpression Count { get; }
7185public BoundStackAllocArrayCreation(SyntaxNode syntax, TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol? type, bool hasErrors = false)
7198public BoundStackAllocArrayCreation Update(TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol? type)
7212public BoundConvertedStackAllocExpression(SyntaxNode syntax, TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol type, bool hasErrors = false)
7227public BoundConvertedStackAllocExpression Update(TypeSymbol elementType, BoundExpression count, BoundArrayInitialization? initializerOpt, TypeSymbol type)
7241public BoundFieldAccess(SyntaxNode syntax, BoundExpression? receiverOpt, FieldSymbol fieldSymbol, ConstantValue? constantValueOpt, LookupResultKind resultKind, bool isByValue, bool isDeclaration, TypeSymbol type, bool hasErrors = false)
7257public BoundExpression? ReceiverOpt { get; }
7267public BoundFieldAccess Update(BoundExpression? receiverOpt, FieldSymbol fieldSymbol, ConstantValue? constantValueOpt, LookupResultKind resultKind, bool isByValue, bool isDeclaration, TypeSymbol type)
7321public BoundPropertyAccess(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol propertySymbol, AccessorKind autoPropertyAccessorKind, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
7336public BoundExpression? ReceiverOpt { get; }
7345public BoundPropertyAccess Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol propertySymbol, AccessorKind autoPropertyAccessorKind, LookupResultKind resultKind, TypeSymbol type)
7359public BoundEventAccess(SyntaxNode syntax, BoundExpression? receiverOpt, EventSymbol eventSymbol, bool isUsableAsField, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
7373public BoundExpression? ReceiverOpt { get; }
7381public BoundEventAccess Update(BoundExpression? receiverOpt, EventSymbol eventSymbol, bool isUsableAsField, LookupResultKind resultKind, TypeSymbol type)
7395public 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)
7417public BoundExpression? ReceiverOpt { get; }
7420public ImmutableArray<BoundExpression> Arguments { get; }
7432public 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)
7446public BoundImplicitIndexerAccess(SyntaxNode syntax, BoundExpression receiver, BoundExpression argument, BoundExpression lengthOrCountAccess, BoundImplicitIndexerReceiverPlaceholder receiverPlaceholder, BoundExpression indexerOrSliceAccess, ImmutableArray<BoundImplicitIndexerValuePlaceholder> argumentPlaceholders, TypeSymbol type, bool hasErrors = false)
7471public BoundExpression Receiver { get; }
7472public BoundExpression Argument { get; }
7473public BoundExpression LengthOrCountAccess { get; }
7475public BoundExpression IndexerOrSliceAccess { get; }
7481public BoundImplicitIndexerAccess Update(BoundExpression receiver, BoundExpression argument, BoundExpression lengthOrCountAccess, BoundImplicitIndexerReceiverPlaceholder receiverPlaceholder, BoundExpression indexerOrSliceAccess, ImmutableArray<BoundImplicitIndexerValuePlaceholder> argumentPlaceholders, TypeSymbol type)
7495public BoundInlineArrayAccess(SyntaxNode syntax, BoundExpression expression, BoundExpression argument, bool isValue, WellKnownMember getItemOrSliceHelper, TypeSymbol type, bool hasErrors = false)
7514public BoundExpression Expression { get; }
7515public BoundExpression Argument { get; }
7522public BoundInlineArrayAccess Update(BoundExpression expression, BoundExpression argument, bool isValue, WellKnownMember getItemOrSliceHelper, TypeSymbol type)
7536public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7553public BoundExpression Receiver { get; }
7554public ImmutableArray<BoundExpression> Arguments { get; }
7562public BoundDynamicIndexerAccess Update(BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type)
7660public BoundQueryClause(SyntaxNode syntax, BoundExpression value, RangeVariableSymbol? definedSymbol, BoundExpression? operation, BoundExpression? cast, Binder binder, BoundExpression? unoptimizedForm, TypeSymbol type, bool hasErrors = false)
7677public BoundExpression Value { get; }
7679public BoundExpression? Operation { get; }
7680public BoundExpression? Cast { get; }
7682public BoundExpression? UnoptimizedForm { get; }
7687public BoundQueryClause Update(BoundExpression value, RangeVariableSymbol? definedSymbol, BoundExpression? operation, BoundExpression? cast, Binder binder, BoundExpression? unoptimizedForm, TypeSymbol type)
7727public BoundNameOfOperator(SyntaxNode syntax, BoundExpression argument, ConstantValue constantValueOpt, TypeSymbol type, bool hasErrors = false)
7740public BoundExpression Argument { get; }
7746public BoundNameOfOperator Update(BoundExpression argument, ConstantValue constantValueOpt, TypeSymbol type)
7760protected BoundInterpolatedStringBase(BoundKind kind, SyntaxNode syntax, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type, bool hasErrors = false)
7770public ImmutableArray<BoundExpression> Parts { get; }
7776public BoundUnconvertedInterpolatedString(SyntaxNode syntax, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type, bool hasErrors = false)
7788public BoundUnconvertedInterpolatedString Update(ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type)
7802public BoundInterpolatedString(SyntaxNode syntax, InterpolatedStringHandlerData? interpolationData, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type, bool hasErrors = false)
7816public BoundInterpolatedString Update(InterpolatedStringHandlerData? interpolationData, ImmutableArray<BoundExpression> parts, ConstantValue? constantValueOpt, TypeSymbol? type)
7896public BoundStringInsert(SyntaxNode syntax, BoundExpression value, BoundExpression? alignment, BoundLiteral? format, bool isInterpolatedStringHandlerAppendCall, bool hasErrors = false)
7909public BoundExpression Value { get; }
7910public BoundExpression? Alignment { get; }
7917public BoundStringInsert Update(BoundExpression value, BoundExpression? alignment, BoundLiteral? format, bool isInterpolatedStringHandlerAppendCall)
7931public BoundIsPatternExpression(SyntaxNode syntax, BoundExpression expression, BoundPattern pattern, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type, bool hasErrors = false)
7949public BoundExpression Expression { get; }
7959public BoundIsPatternExpression Update(BoundExpression expression, BoundPattern pattern, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type)
8001public BoundConstantPattern(SyntaxNode syntax, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8018public BoundExpression Value { get; }
8024public BoundConstantPattern Update(BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType)
8078protected BoundObjectPattern(BoundKind kind, SyntaxNode syntax, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8090public BoundExpression? VariableAccess { get; }
8095public BoundDeclarationPattern(SyntaxNode syntax, BoundTypeExpression declaredType, bool isVar, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8117public BoundDeclarationPattern Update(BoundTypeExpression declaredType, bool isVar, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType)
8131public BoundRecursivePattern(SyntaxNode syntax, BoundTypeExpression? declaredType, MethodSymbol? deconstructMethod, ImmutableArray<BoundPositionalSubpattern> deconstruction, ImmutableArray<BoundPropertySubpattern> properties, bool isExplicitNotNullTest, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8158public BoundRecursivePattern Update(BoundTypeExpression? declaredType, MethodSymbol? deconstructMethod, ImmutableArray<BoundPositionalSubpattern> deconstruction, ImmutableArray<BoundPropertySubpattern> properties, bool isExplicitNotNullTest, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType)
8172public BoundListPattern(SyntaxNode syntax, ImmutableArray<BoundPattern> subpatterns, bool hasSlice, BoundExpression? lengthAccess, BoundExpression? indexerAccess, BoundListPatternReceiverPlaceholder? receiverPlaceholder, BoundListPatternIndexPlaceholder? argumentPlaceholder, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8194public BoundExpression? LengthAccess { get; }
8195public BoundExpression? IndexerAccess { get; }
8202public BoundListPattern Update(ImmutableArray<BoundPattern> subpatterns, bool hasSlice, BoundExpression? lengthAccess, BoundExpression? indexerAccess, BoundListPatternReceiverPlaceholder? receiverPlaceholder, BoundListPatternIndexPlaceholder? argumentPlaceholder, Symbol? variable, BoundExpression? variableAccess, TypeSymbol inputType, TypeSymbol narrowedType)
8216public BoundSlicePattern(SyntaxNode syntax, BoundPattern? pattern, BoundExpression? indexerAccess, BoundSlicePatternReceiverPlaceholder? receiverPlaceholder, BoundSlicePatternRangePlaceholder? argumentPlaceholder, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8234public BoundExpression? IndexerAccess { get; }
8241public BoundSlicePattern Update(BoundPattern? pattern, BoundExpression? indexerAccess, BoundSlicePatternReceiverPlaceholder? receiverPlaceholder, BoundSlicePatternRangePlaceholder? argumentPlaceholder, TypeSymbol inputType, TypeSymbol narrowedType)
8508public BoundRelationalPattern(SyntaxNode syntax, BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8527public BoundExpression Value { get; }
8533public BoundRelationalPattern Update(BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType)
8582public BoundThrowExpression(SyntaxNode syntax, BoundExpression expression, TypeSymbol? type, bool hasErrors = false)
8591public BoundExpression Expression { get; }
8596public BoundThrowExpression Update(BoundExpression expression, TypeSymbol? type)
8610protected VariablePendingInference(BoundKind kind, SyntaxNode syntax, Symbol variableSymbol, BoundExpression? receiverOpt, bool hasErrors = false)
8622public BoundExpression? ReceiverOpt { get; }
8627public OutVariablePendingInference(SyntaxNode syntax, Symbol variableSymbol, BoundExpression? receiverOpt, bool hasErrors = false)
8639public OutVariablePendingInference Update(Symbol variableSymbol, BoundExpression? receiverOpt)
8653public DeconstructionVariablePendingInference(SyntaxNode syntax, Symbol variableSymbol, BoundExpression? receiverOpt, bool hasErrors = false)
8665public DeconstructionVariablePendingInference Update(Symbol variableSymbol, BoundExpression? receiverOpt)
8780public BoundExpressionWithNullability(SyntaxNode syntax, BoundExpression expression, NullableAnnotation nullableAnnotation, TypeSymbol? type, bool hasErrors = false)
8790public BoundExpression Expression { get; }
8797public BoundExpressionWithNullability Update(BoundExpression expression, NullableAnnotation nullableAnnotation, TypeSymbol? type)
8811public BoundWithExpression(SyntaxNode syntax, BoundExpression receiver, MethodSymbol? cloneMethod, BoundObjectInitializerExpressionBase initializerExpression, TypeSymbol type, bool hasErrors = false)
8825public BoundExpression Receiver { get; }
8832public BoundWithExpression Update(BoundExpression receiver, MethodSymbol? cloneMethod, BoundObjectInitializerExpressionBase initializerExpression, TypeSymbol type)
10823BoundExpression value = (BoundExpression)this.Visit(node.Value);
10830BoundExpression value = (BoundExpression)this.Visit(node.Value);
10837BoundExpression value = (BoundExpression)this.Visit(node.Value);
10852BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
10919BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
10926ImmutableArray<BoundExpression> childBoundNodes = this.VisitList(node.ChildBoundNodes);
10944ImmutableArray<BoundExpression> boundDimensionsOpt = this.VisitList(node.BoundDimensionsOpt);
10964BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
10973BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
10975BoundExpression? operandConversion = node.OperandConversion;
10977BoundExpression? resultConversion = node.ResultConversion;
10984BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11003BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11009BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11010BoundExpression index = (BoundExpression)this.Visit(node.Index);
11016BoundExpression invokedExpression = (BoundExpression)this.Visit(node.InvokedExpression);
11017ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11024BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11030BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11036BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11043BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11050BoundExpression? leftOperandOpt = (BoundExpression?)this.Visit(node.LeftOperandOpt);
11051BoundExpression? rightOperandOpt = (BoundExpression?)this.Visit(node.RightOperandOpt);
11057BoundExpression left = (BoundExpression)this.Visit(node.Left);
11058BoundExpression right = (BoundExpression)this.Visit(node.Right);
11064BoundExpression left = (BoundExpression)this.Visit(node.Left);
11065BoundExpression right = (BoundExpression)this.Visit(node.Right);
11076BoundExpression? trueFalseOperandConversion = node.TrueFalseOperandConversion;
11077BoundExpression left = (BoundExpression)this.Visit(node.Left);
11078BoundExpression right = (BoundExpression)this.Visit(node.Right);
11086BoundExpression left = (BoundExpression)this.Visit(node.Left);
11087BoundExpression right = (BoundExpression)this.Visit(node.Right);
11089BoundExpression? leftConversion = node.LeftConversion;
11091BoundExpression? finalConversion = node.FinalConversion;
11097BoundExpression left = (BoundExpression)this.Visit(node.Left);
11098BoundExpression right = (BoundExpression)this.Visit(node.Right);
11111BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
11112BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
11114BoundExpression? leftConversion = node.LeftConversion;
11120BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
11121BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
11127BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11128BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
11129BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
11135BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11136BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
11137BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
11144BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11145ImmutableArray<BoundExpression> indices = this.VisitList(node.Indices);
11157BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11166BoundExpression? getAwaiter = (BoundExpression?)this.Visit(node.GetAwaiter);
11171BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11276BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11283BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11286BoundExpression? operandConversion = node.OperandConversion;
11298BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11305BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
11316ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11324BoundExpression? elementPointerConversion = node.ElementPointerConversion;
11325BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11367BoundExpression? initializerOpt = (BoundExpression?)this.Visit(node.InitializerOpt);
11368ImmutableArray<BoundExpression> argumentsOpt = this.VisitList(node.ArgumentsOpt);
11392BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
11397BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11403BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
11408BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11426BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11435BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11440BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11450BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11459BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11470BoundExpression? condition = (BoundExpression?)this.Visit(node.Condition);
11481BoundExpression? elementConversion = node.ElementConversion;
11483BoundExpression? iterationErrorExpressionOpt = (BoundExpression?)this.Visit(node.IterationErrorExpressionOpt);
11484BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11500BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
11514BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
11529BoundExpression? exceptionSourceOpt = (BoundExpression?)this.Visit(node.ExceptionSourceOpt);
11531BoundExpression? exceptionFilterOpt = (BoundExpression?)this.Visit(node.ExceptionFilterOpt);
11581BoundExpression value = (BoundExpression)this.Visit(node.Value);
11599BoundExpression? caseExpressionOpt = (BoundExpression?)this.Visit(node.CaseExpressionOpt);
11623BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
11631BoundExpression? whenClause = (BoundExpression?)this.Visit(node.WhenClause);
11632BoundExpression value = (BoundExpression)this.Visit(node.Value);
11638BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11647BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11674BoundExpression? whenExpression = (BoundExpression?)this.Visit(node.WhenExpression);
11749BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
11759BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
11783BoundExpression? whenClause = (BoundExpression?)this.Visit(node.WhenClause);
11788BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11795ImmutableArray<BoundExpression> sideEffects = this.VisitList(node.SideEffects);
11796BoundExpression value = (BoundExpression)this.Visit(node.Value);
11804BoundExpression value = (BoundExpression)this.Visit(node.Value);
11810BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
11817BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11818ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11824BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
11825BoundExpression accessExpression = (BoundExpression)this.Visit(node.AccessExpression);
11832BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
11833BoundExpression whenNotNull = (BoundExpression)this.Visit(node.WhenNotNull);
11834BoundExpression? whenNullOpt = (BoundExpression?)this.Visit(node.WhenNullOpt);
11845BoundExpression valueTypeReceiver = (BoundExpression)this.Visit(node.ValueTypeReceiver);
11846BoundExpression referenceTypeReceiver = (BoundExpression)this.Visit(node.ReferenceTypeReceiver);
11855BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
11862BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
11870BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
11871ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11878BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
11879BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
11886ImmutableArray<BoundExpression> constructorArguments = this.VisitList(node.ConstructorArguments);
11893ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11901ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11916BoundExpression? collectionCreation = node.CollectionCreation;
11918BoundExpression? collectionBuilderInvocationConversion = node.CollectionBuilderInvocationConversion;
11931BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
11933BoundExpression? conversion = node.Conversion;
11934BoundExpression? lengthOrCount = node.LengthOrCount;
11941ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11948ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11955ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11969ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
11976ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11990ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
11997ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
11998BoundExpression? implicitReceiverOpt = (BoundExpression?)this.Visit(node.ImplicitReceiverOpt);
12005BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12006ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12018ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12038BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12044ImmutableArray<BoundExpression> bounds = this.VisitList(node.Bounds);
12051ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
12057BoundExpression count = (BoundExpression)this.Visit(node.Count);
12065BoundExpression count = (BoundExpression)this.Visit(node.Count);
12074BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12087BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12094BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12102BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12103ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12109BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12110BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12111BoundExpression lengthOrCountAccess = node.LengthOrCountAccess;
12113BoundExpression indexerOrSliceAccess = node.IndexerOrSliceAccess;
12120BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12121BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12128BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12129ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12150BoundExpression value = (BoundExpression)this.Visit(node.Value);
12151BoundExpression? operation = node.Operation;
12152BoundExpression? cast = node.Cast;
12153BoundExpression? unoptimizedForm = node.UnoptimizedForm;
12164BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
12170ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
12176ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
12192BoundExpression value = (BoundExpression)this.Visit(node.Value);
12193BoundExpression? alignment = (BoundExpression?)this.Visit(node.Alignment);
12202BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12210BoundExpression value = (BoundExpression)this.Visit(node.Value);
12225BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
12237BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
12246BoundExpression? lengthAccess = node.LengthAccess;
12247BoundExpression? indexerAccess = node.IndexerAccess;
12250BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
12258BoundExpression? indexerAccess = node.IndexerAccess;
12317BoundExpression value = (BoundExpression)this.Visit(node.Value);
12329BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12336BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12343BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
12369BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12376BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12385private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> _updatedNullabilities;
12389public NullabilityRewriter(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> updatedNullabilities, NullableWalker.SnapshotManager? snapshotManager, ImmutableDictionary<Symbol, Symbol>.Builder remappedSymbols)
12400BoundExpression value = (BoundExpression)this.Visit(node.Value);
12408BoundExpression value = (BoundExpression)this.Visit(node.Value);
12416BoundExpression value = (BoundExpression)this.Visit(node.Value);
12434BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
12600BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12618ImmutableArray<BoundExpression> childBoundNodes = this.VisitList(node.ChildBoundNodes);
12636ImmutableArray<BoundExpression> boundDimensionsOpt = this.VisitList(node.BoundDimensionsOpt);
12680BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12700BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12702BoundExpression? operandConversion = node.OperandConversion;
12704BoundExpression? resultConversion = node.ResultConversion;
12721BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12773BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12790BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
12791BoundExpression index = (BoundExpression)this.Visit(node.Index);
12808BoundExpression invokedExpression = (BoundExpression)this.Visit(node.InvokedExpression);
12809ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
12827BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12844BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12861BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12879BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
12897BoundExpression? leftOperandOpt = (BoundExpression?)this.Visit(node.LeftOperandOpt);
12898BoundExpression? rightOperandOpt = (BoundExpression?)this.Visit(node.RightOperandOpt);
12915BoundExpression left = (BoundExpression)this.Visit(node.Left);
12916BoundExpression right = (BoundExpression)this.Visit(node.Right);
12934BoundExpression left = (BoundExpression)this.Visit(node.Left);
12935BoundExpression right = (BoundExpression)this.Visit(node.Right);
12937BoundExpression? leftConversion = node.LeftConversion;
12939BoundExpression? finalConversion = node.FinalConversion;
12956BoundExpression left = (BoundExpression)this.Visit(node.Left);
12957BoundExpression right = (BoundExpression)this.Visit(node.Right);
12992BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
12993BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
12995BoundExpression? leftConversion = node.LeftConversion;
13012BoundExpression leftOperand = (BoundExpression)this.Visit(node.LeftOperand);
13013BoundExpression rightOperand = (BoundExpression)this.Visit(node.RightOperand);
13030BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13031BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
13032BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
13050BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13051BoundExpression consequence = (BoundExpression)this.Visit(node.Consequence);
13052BoundExpression alternative = (BoundExpression)this.Visit(node.Alternative);
13069BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13070ImmutableArray<BoundExpression> indices = this.VisitList(node.Indices);
13104BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13124BoundExpression? getAwaiter = (BoundExpression?)this.Visit(node.GetAwaiter);
13130BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13380BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13398BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13401BoundExpression? operandConversion = node.OperandConversion;
13435BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13453BoundExpression operand = (BoundExpression)this.Visit(node.Operand);
13482ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
13502BoundExpression? elementPointerConversion = node.ElementPointerConversion;
13503BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13545BoundExpression? initializerOpt = (BoundExpression?)this.Visit(node.InitializerOpt);
13546ImmutableArray<BoundExpression> argumentsOpt = this.VisitList(node.ArgumentsOpt);
13562BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13572BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13580BoundExpression condition = (BoundExpression)this.Visit(node.Condition);
13590BoundExpression? condition = (BoundExpression?)this.Visit(node.Condition);
13600BoundExpression? elementConversion = node.ElementConversion;
13602BoundExpression? iterationErrorExpressionOpt = (BoundExpression?)this.Visit(node.IterationErrorExpressionOpt);
13603BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13614BoundExpression? expressionOpt = (BoundExpression?)this.Visit(node.ExpressionOpt);
13632BoundExpression? exceptionSourceOpt = (BoundExpression?)this.Visit(node.ExceptionSourceOpt);
13634BoundExpression? exceptionFilterOpt = (BoundExpression?)this.Visit(node.ExceptionFilterOpt);
13748BoundExpression value = (BoundExpression)this.Visit(node.Value);
13796BoundExpression? whenClause = (BoundExpression?)this.Visit(node.WhenClause);
13797BoundExpression value = (BoundExpression)this.Visit(node.Value);
13803BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13823BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13872BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
13883BoundExpression indexerAccess = (BoundExpression)this.Visit(node.IndexerAccess);
13900BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13918ImmutableArray<BoundExpression> sideEffects = this.VisitList(node.SideEffects);
13919BoundExpression value = (BoundExpression)this.Visit(node.Value);
13938BoundExpression value = (BoundExpression)this.Visit(node.Value);
13955BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
13973BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
13974ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
13991BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
13992BoundExpression accessExpression = (BoundExpression)this.Visit(node.AccessExpression);
14010BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
14011BoundExpression whenNotNull = (BoundExpression)this.Visit(node.WhenNotNull);
14012BoundExpression? whenNullOpt = (BoundExpression?)this.Visit(node.WhenNullOpt);
14041BoundExpression valueTypeReceiver = (BoundExpression)this.Visit(node.ValueTypeReceiver);
14042BoundExpression referenceTypeReceiver = (BoundExpression)this.Visit(node.ReferenceTypeReceiver);
14062BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14080BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14099BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14100ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14118BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14119BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
14137ImmutableArray<BoundExpression> constructorArguments = this.VisitList(node.ConstructorArguments);
14155ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14174ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14211BoundExpression? collectionCreation = node.CollectionCreation;
14213BoundExpression? collectionBuilderInvocationConversion = node.CollectionBuilderInvocationConversion;
14244ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14262ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14280ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14316ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
14335ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14370ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
14388ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14389BoundExpression? implicitReceiverOpt = (BoundExpression?)this.Visit(node.ImplicitReceiverOpt);
14407BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14408ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14438ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14491BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
14508ImmutableArray<BoundExpression> bounds = this.VisitList(node.Bounds);
14526ImmutableArray<BoundExpression> initializers = this.VisitList(node.Initializers);
14544BoundExpression count = (BoundExpression)this.Visit(node.Count);
14563BoundExpression count = (BoundExpression)this.Visit(node.Count);
14582BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14617BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14635BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14654BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
14655ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14672BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14673BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
14691BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
14692ImmutableArray<BoundExpression> arguments = this.VisitList(node.Arguments);
14746BoundExpression value = (BoundExpression)this.Visit(node.Value);
14747BoundExpression? operation = node.Operation;
14748BoundExpression? cast = node.Cast;
14749BoundExpression? unoptimizedForm = node.UnoptimizedForm;
14766BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
14783ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
14800ImmutableArray<BoundExpression> parts = this.VisitList(node.Parts);
14841BoundExpression value = (BoundExpression)this.Visit(node.Value);
14842BoundExpression? alignment = (BoundExpression?)this.Visit(node.Alignment);
14860BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
14881BoundExpression value = (BoundExpression)this.Visit(node.Value);
14898BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
14911BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
14921BoundExpression? lengthAccess = node.LengthAccess;
14922BoundExpression? indexerAccess = node.IndexerAccess;
14925BoundExpression? variableAccess = (BoundExpression?)this.Visit(node.VariableAccess);
14934BoundExpression? indexerAccess = node.IndexerAccess;
14993BoundExpression value = (BoundExpression)this.Visit(node.Value);
15011BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
15029BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
15047BoundExpression? receiverOpt = (BoundExpression?)this.Visit(node.ReceiverOpt);
15090BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
15108BoundExpression receiver = (BoundExpression)this.Visit(node.Receiver);
Lowering\AsyncRewriter\AsyncMethodToStateMachineRewriter.cs (20)
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)
352var expression = (BoundExpression)Visit(node.Expression);
360var getAwaiter = node.AwaitableInfo.IsDynamic ?
362(BoundExpression)Visit(node.AwaitableInfo.GetAwaiter);
364resultPlace = (BoundExpression)Visit(resultPlace);
392BoundExpression getResultCall = MakeCallMaybeDynamic(
419private BoundExpression MakeCallMaybeDynamic(
420BoundExpression receiver,
441loweredArguments: ImmutableArray<BoundExpression>.Empty,
448private BoundExpression GenerateGetIsCompleted(LocalSymbol awaiterTemp, MethodSymbol getIsCompletedMethod)
639BoundExpression result =
649ImmutableArray.Create<BoundExpression>(F.AssignmentExpression(F.Local(thisTemp), F.This())),
667F.Assignment(F.Local(_exprRetValue), (BoundExpression)Visit(node.ExpressionOpt)),
Lowering\ClosureConversion\ClosureConversion.cs (49)
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);
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);
1652BoundExpression receiver;
1664BoundExpression result = new BoundDelegateCreationExpression(
1691BoundExpression cache;
1734return new BoundBadExpression(F.Syntax, LookupResultKind.Empty, ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
Lowering\ClosureConversion\ExpressionLambdaRewriter.cs (135)
21private readonly Dictionary<ParameterSymbol, BoundExpression> _parameterMap = new Dictionary<ParameterSymbol, BoundExpression>();
117var result = r.VisitLambdaInternal(node);
131private BoundExpression TranslateLambdaBody(BoundBlock block)
141var result = Visit(((BoundReturnStatement)stmt).ExpressionOpt);
165private BoundExpression Visit(BoundExpression node)
174var result = VisitInternal(node);
179private BoundExpression VisitExpressionWithoutStackGuard(BoundExpression node)
253private BoundExpression VisitInternal(BoundExpression node)
255BoundExpression result;
279private BoundExpression VisitExpressionWithStackGuard(BoundExpression node)
291private BoundExpression VisitArrayAccess(BoundArrayAccess node)
293var array = Visit(node.Expression);
296var arg = node.Indices[0];
297var index = Visit(arg);
310private BoundExpression Indices(ImmutableArray<BoundExpression> expressions)
312var builder = ArrayBuilder<BoundExpression>.GetInstance();
313foreach (var arg in expressions)
315var index = Visit(arg);
326private BoundExpression Expressions(ImmutableArray<BoundExpression> expressions)
328var builder = ArrayBuilder<BoundExpression>.GetInstance();
329foreach (var arg in expressions)
337private BoundExpression VisitArrayCreation(BoundArrayCreation node)
340var boundType = _bound.Typeof(arrayType.ElementType, _bound.WellKnownType(WellKnownType.System_Type));
351return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), ExpressionType);
360private BoundExpression VisitArrayLength(BoundArrayLength node)
365private BoundExpression VisitAsOperator(BoundAsOperator node)
369var operand = _bound.Null(_bound.SpecialType(SpecialType.System_Object));
378private BoundExpression VisitBaseReference(BoundBaseReference node)
382return new BoundBadExpression(node.Syntax, 0, ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), ExpressionType);
487private BoundExpression VisitBinaryOperator(BinaryOperatorKind opKind, MethodSymbol methodOpt, TypeSymbol type, BoundExpression left, BoundExpression right)
509var enumOperand = (opKind.OperandTypes() == BinaryOperatorKind.UnderlyingAndEnum) ? right : left;
516var loweredLeft = VisitAndPromoteEnumOperand(left, promotedType, isChecked);
517var loweredRight = VisitAndPromoteEnumOperand(right, promotedType, isChecked);
519var result = MakeBinary(methodOpt, type, isLifted, requiresLifted, opFactory, loweredLeft, loweredRight);
524var loweredLeft = Visit(left);
525var loweredRight = Visit(right);
531private static BoundExpression DemoteEnumOperand(BoundExpression operand)
548private BoundExpression VisitAndPromoteEnumOperand(BoundExpression operand, TypeSymbol promotedType, bool isChecked)
561var demotedOperand = DemoteEnumOperand(operand);
562var loweredOperand = Visit(demotedOperand);
567private BoundExpression MakeBinary(MethodSymbol methodOpt, TypeSymbol type, bool isLifted, bool requiresLifted, WellKnownMember opFactory, BoundExpression loweredLeft, BoundExpression loweredRight)
598private BoundExpression Demote(BoundExpression node, TypeSymbol type, bool isChecked)
618private BoundExpression ConvertIndex(BoundExpression expr, TypeSymbol oldType, TypeSymbol newType)
636private BoundExpression VisitCall(BoundCall node)
655private BoundExpression VisitConditionalOperator(BoundConditionalOperator node)
657var condition = Visit(node.Condition);
658var consequence = VisitExactType(node.Consequence);
659var alternative = VisitExactType(node.Alternative);
667private BoundExpression VisitExactType(BoundExpression e)
686private BoundExpression VisitConversion(BoundConversion node)
708var e1 = requireAdditionalCast
711var e2 = _bound.StaticCall(node.Checked && SyntaxFacts.IsCheckedOperator(method.Name) ?
721var operand = Visit(node.Operand);
734var e1 = Convert(Visit(node.Operand), node.Operand.Type, intermediate, node.Checked, false);
744private BoundExpression Convert(BoundExpression operand, TypeSymbol oldType, TypeSymbol newType, bool isChecked, bool isExplicit)
749private BoundExpression Convert(BoundExpression expr, TypeSymbol type, bool isChecked)
757private BoundExpression DelegateCreation(BoundExpression receiver, MethodSymbol method, TypeSymbol delegateType, bool requiresInstanceReceiver)
759var nullObject = _bound.Null(_objectType);
763BoundExpression unquoted;
785private BoundExpression VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
808private BoundExpression VisitFieldAccess(BoundFieldAccess node)
810var receiver = node.FieldSymbol.IsStatic ? _bound.Null(ExpressionType) : Visit(node.ReceiverOpt);
816private BoundExpression VisitIsOperator(BoundIsOperator node)
818var operand = node.Operand;
827private BoundExpression VisitLambda(BoundLambda node)
829var result = VisitLambdaInternal(node);
833private BoundExpression VisitLambdaInternal(BoundLambda node)
837var initializers = ArrayBuilder<BoundExpression>.GetInstance();
838var parameters = ArrayBuilder<BoundExpression>.GetInstance();
845var parameter = _bound.StaticCall(
868private BoundExpression VisitNewT(BoundNewT node)
873private BoundExpression VisitNullCoalescingOperator(BoundNullCoalescingOperator node)
875var left = Visit(node.LeftOperand);
876var right = Visit(node.RightOperand);
889private BoundExpression MakeConversionLambda(Conversion conversion, TypeSymbol fromType, TypeSymbol toType)
895var parameter = _bound.StaticCall(WellKnownMember.System_Linq_Expressions_Expression__Parameter, _bound.Typeof(fromType, _bound.WellKnownType(WellKnownType.System_Type)), _bound.Literal(parameterName));
897var convertedValue = Visit(_bound.Convert(toType, _bound.Parameter(lambdaParameter), conversion));
899var result = _bound.Sequence(
901ImmutableArray.Create<BoundExpression>(_bound.AssignmentExpression(parameterReference, parameter)),
905_bound.ArrayOrEmpty(ParameterExpressionType, ImmutableArray.Create<BoundExpression>(parameterReference))));
909private BoundExpression InitializerMemberSetter(Symbol symbol)
924private BoundExpression InitializerMemberGetter(Symbol symbol)
941private BoundExpression VisitInitializer(BoundExpression node, out InitializerKind kind)
948var builder = ArrayBuilder<BoundExpression>.GetInstance();
957var value = VisitInitializer(a.Right, out elementKind);
962var left = InitializerMemberGetter(sym);
971var left = InitializerMemberSetter(sym);
980var left = InitializerMemberGetter(sym);
1002var builder = ArrayBuilder<BoundExpression>.GetInstance();
1008BoundExpression elementInit = _bound.StaticCall(WellKnownMember.System_Linq_Expressions_Expression__ElementInit,
1025private BoundExpression VisitObjectCreationExpression(BoundObjectCreationExpression node)
1030private BoundExpression VisitObjectCreationContinued(BoundExpression creation, BoundExpression initializerExpressionOpt)
1032var result = creation;
1035var init = VisitInitializer(initializerExpressionOpt, out initializerKind);
1047private BoundExpression VisitObjectCreationExpressionInternal(BoundObjectCreationExpression node)
1062var ctor = _bound.ConstructorInfo(node.Constructor);
1063var args = _bound.Convert(_IEnumerableType.Construct(ExpressionType), Expressions(node.Arguments));
1067var membersBuilder = ArrayBuilder<BoundExpression>.GetInstance();
1082private BoundExpression VisitParameter(BoundParameter node)
1087private static BoundExpression VisitPointerIndirectionOperator(BoundPointerIndirectionOperator node)
1091return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
1094private static BoundExpression VisitPointerElementAccess(BoundPointerElementAccess node)
1098return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
1101private BoundExpression VisitPropertyAccess(BoundPropertyAccess node)
1103var receiver = node.PropertySymbol.IsStatic ? _bound.Null(ExpressionType) : Visit(node.ReceiverOpt);
1126private static BoundExpression VisitSizeOfOperator(BoundSizeOfOperator node)
1130return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundExpression>(node), node.Type);
1133private BoundExpression VisitUnaryOperator(BoundUnaryOperator node)
1135var arg = node.Operand;
1136var loweredArg = Visit(arg);
1191var result = _bound.StaticCall(opFactory, loweredArg);
1202private 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 (27)
356public override BoundExpression InstrumentUserDefinedLocalAssignment(BoundAssignmentOperator original)
360var assignment = base.InstrumentUserDefinedLocalAssignment(original);
363BoundExpression? refAssignmentSourceIndex;
388if (!TryGetLocalOrParameterInfo(original.Left, out var targetSymbol, out var targetType, out var targetIndex))
409private bool TryGetLocalOrParameterInfo(BoundNode node, [NotNullWhen(true)] out Symbol? symbol, [NotNullWhen(true)] out TypeSymbol? type, [NotNullWhen(true)] out BoundExpression? indexExpression)
435private ImmutableArray<BoundExpression> MakeStoreLoggerArguments(
439BoundExpression value,
440BoundExpression? refAssignmentSourceIndex,
441BoundExpression index)
455var addressOf = value is BoundLocal or BoundParameter ?
456(BoundExpression)new BoundAddressOfOperator(_factory.Syntax, value, isManaged: false, parameter.Type) :
466BoundExpression toString;
485private BoundExpression VariableRead(Symbol localOrParameterSymbol)
495ref BoundExpression? rewrittenSource,
497ref BoundExpression? rewrittenFilter,
523var targetIndex = _factory.LocalId(targetSymbol);
543public override BoundExpression InstrumentCall(BoundCall original, BoundExpression rewritten)
546public override BoundExpression InstrumentObjectCreationExpression(BoundObjectCreationExpression original, BoundExpression rewritten)
549public override BoundExpression InstrumentFunctionPointerInvocation(BoundFunctionPointerInvocation original, BoundExpression rewritten)
552private BoundExpression InstrumentCall(BoundExpression invocation, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds)
562var builder = ArrayBuilder<BoundExpression>.GetInstance();
583if (!TryGetLocalOrParameterInfo(arguments[i], out var targetSymbol, out var targetType, out var targetIndex))
Lowering\LocalRewriter\LocalRewriter.cs (32)
53private Dictionary<BoundValuePlaceholderBase, BoundExpression>? _placeholderReplacementMapDoNotUseDirectly;
211BoundExpression? expr = node as BoundExpression;
221private BoundExpression? VisitExpression(BoundExpression? node)
244private BoundExpression? VisitExpressionImpl(BoundExpression node)
262var result = MakeLiteral(node.Syntax, constantValue, type);
273var visited = (BoundExpression)VisitExpressionOrPatternWithStackGuard(node);
297private static BoundExpression RefAccessMustMakeCopy(BoundExpression visited)
307private static bool IsUnusedDeconstruction(BoundExpression node)
501private BoundExpression PlaceholderReplacement(BoundValuePlaceholderBase placeholder)
504var value = _placeholderReplacementMapDoNotUseDirectly[placeholder];
510private static void AssertPlaceholderReplacement(BoundValuePlaceholderBase placeholder, BoundExpression value)
531private void AddPlaceholderReplacement(BoundValuePlaceholderBase placeholder, BoundExpression value)
537_placeholderReplacementMapDoNotUseDirectly = new Dictionary<BoundValuePlaceholderBase, BoundExpression>();
575private static BoundExpression BadExpression(BoundExpression node)
581private static BoundExpression BadExpression(SyntaxNode syntax, TypeSymbol resultType, BoundExpression child)
586private static BoundExpression BadExpression(SyntaxNode syntax, TypeSymbol resultType, BoundExpression child1, BoundExpression child2)
591private static BoundExpression BadExpression(SyntaxNode syntax, TypeSymbol resultType, ImmutableArray<BoundExpression> children)
683var operand = this.VisitExpression(node.Operand);
930BoundExpression rhs = assignment.Right;
1011internal static bool CanBePassedByReference(BoundExpression expr)
1139private BoundExpression ConvertReceiverForExtensionMemberIfNeeded(Symbol member, BoundExpression receiver, bool markAsChecked)
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)
1002var whenExpressionMap = PooledDictionary<BoundExpression, (LabelSymbol LabelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> WhenNodes)>.GetInstance();
1008var whenExpression = whenNode.WhenExpression;
1056var whenExpression = whenNode.WhenExpression;
1079void lowerWhenExpressionIfShared(BoundExpression whenExpression, LabelSymbol labelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> whenNodes)
1123void addConditionalGoto(BoundExpression whenExpression, SyntaxNode whenClauseSyntax, LabelSymbol whenTrueLabel, ArrayBuilder<BoundStatement> sectionBuilder)
1137bool isSharedWhenExpression(BoundExpression? whenExpression)
1181BoundExpression left = _localRewriter.VisitExpression(binding.VariableAccess);
1185BoundExpression right = _tempAllocator.GetTemp(binding.TempContainingValue);
1205BoundExpression sideEffect = LowerEvaluation(evaluationNode.Evaluation);
1226BoundExpression test = base.LowerTest(testNode.Test);
Lowering\LocalRewriter\LocalRewriter.PatternLocalRewriter.cs (55)
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)
213BoundExpression output = _tempAllocator.GetTemp(outputTemp);
219BoundExpression evaluated;
250BoundExpression output = _tempAllocator.GetTemp(outputTemp);
260var indexerAccess = e.IndexerAccess;
266var placeholderValues = PooledDictionary<BoundEarlyValuePlaceholderBase, BoundExpression>.GetInstance();
272var access = (BoundExpression)_localRewriter.Visit(indexerAccess);
275BoundExpression output = _tempAllocator.GetTemp(outputTemp);
286var indexerAccess = e.IndexerAccess;
292var placeholderValues = PooledDictionary<BoundEarlyValuePlaceholderBase, BoundExpression>.GetInstance();
298var access = (BoundExpression)_localRewriter.Visit(indexerAccess);
301BoundExpression output = _tempAllocator.GetTemp(outputTemp);
310BoundExpression makeUnloweredIndexArgument(int index)
324BoundExpression makeUnloweredRangeArgument(BoundDagSliceEvaluation e)
340protected BoundExpression LowerTest(BoundDagTest test)
343BoundExpression input = _tempAllocator.GetTemp(test.Input);
371private BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
391protected BoundExpression MakeValueTest(SyntaxNode syntax, BoundExpression input, ConstantValue value)
405protected BoundExpression MakeRelationalTest(SyntaxNode syntax, BoundExpression input, BinaryOperatorKind operatorKind, ConstantValue value)
414BoundExpression literal = _localRewriter.MakeLiteral(syntax, value, input.Type);
435private BoundExpression MakeSpanStringTest(BoundExpression input, ConstantValue value)
465[NotNullWhen(true)] out BoundExpression sideEffect,
466[NotNullWhen(true)] out BoundExpression testExpression)
477BoundExpression input = _tempAllocator.GetTemp(test.Input);
478BoundExpression output = _tempAllocator.GetTemp(new BoundDagTemp(evaluation.Syntax, typeEvaluation1.Type, evaluation));
492BoundExpression input = _tempAllocator.GetTemp(test.Input);
494BoundExpression output = _tempAllocator.GetTemp(new BoundDagTemp(evaluation.Syntax, baseType, evaluation));
510BoundExpression loweredInput,
512Action<BoundExpression> addCode,
513out BoundExpression savedInputExpression)
571BoundExpression inputTemp = _tempAllocator.GetTemp(inputDagTemp);
616Action<BoundExpression> addCode,
618out BoundExpression savedInputExpression)
624var newArguments = ArrayBuilder<BoundExpression>.GetInstance(loweredInput.Arguments.Length);
629var expr = loweredInput.Arguments[i];
644void storeToTemp(BoundDagTemp temp, BoundExpression expr)
654var tempToHoldInput = _tempAllocator.GetTemp(temp);
Lowering\LocalRewriter\LocalRewriter_AssignmentOperator.cs (28)
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);
91private BoundExpression MakeAssignmentOperator(SyntaxNode syntax, BoundExpression rewrittenLeft, BoundExpression rewrittenRight,
139private BoundExpression MakeDynamicSetIndex(
141BoundExpression loweredReceiver,
142ImmutableArray<BoundExpression> loweredArguments,
145BoundExpression loweredRight,
166private BoundExpression MakeStaticAssignmentOperator(
168BoundExpression rewrittenLeft,
169BoundExpression rewrittenRight,
183BoundExpression? rewrittenReceiver = propertyAccess.ReceiverOpt;
190ImmutableArray<BoundExpression>.Empty,
202BoundExpression? rewrittenReceiver = indexerAccess.ReceiverOpt;
203ImmutableArray<BoundExpression> arguments = indexerAccess.Arguments;
267private BoundExpression MakePropertyAssignment(
269BoundExpression? rewrittenReceiver,
271ImmutableArray<BoundExpression> arguments,
275BoundExpression rewrittenRight,
327BoundExpression boundRhs = new BoundLocal(syntax, rhsTemp, null, exprType);
329BoundExpression rhsAssignment = new BoundAssignmentOperator(
335BoundExpression setterCall = BoundCall.Synthesized(
367ImmutableArray<BoundExpression>.Empty,
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,
544private BoundExpression RewriteLiftedBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, MethodSymbol? method, TypeSymbol? constrainedToTypeOpt)
561var result = operatorKind.IsComparison() ?
569BoundExpression? whenNullOpt = null;
597private BoundExpression UnconvertArrayLength(BoundArrayLength arrLength)
602private BoundExpression MakeDynamicLogicalBinaryOperator(
605BoundExpression loweredLeft,
606BoundExpression loweredRight,
652BoundExpression result;
673var op = _dynamicFactory.MakeDynamicBinaryOperator(operatorKind, loweredLeft, loweredRight, isCompoundAssignment, type).ToExpression();
687BoundExpression leftTest = MakeTruthTestForDynamicLogicalOperator(syntax, operatorKind, loweredLeft, boolean, leftTruthOperator, constrainedToTypeOpt, negative: isAnd);
703BoundExpression leftTest = MakeTruthTestForDynamicLogicalOperator(syntax, operatorKind, loweredLeft, boolean, leftTruthOperator, constrainedToTypeOpt, negative: isAnd);
704var convertedLeft = MakeConversionNode(loweredLeft, type, @checked: false);
712return _factory.Sequence(ImmutableArray.Create(temp.LocalSymbol), ImmutableArray.Create<BoundExpression>(tempAssignment), result);
718private static ConstantValue? UnboxConstant(BoundExpression expression)
732private BoundExpression MakeTruthTestForDynamicLogicalOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, TypeSymbol boolean, MethodSymbol? leftTruthOperator, TypeSymbol? constrainedToTypeOpt, bool negative)
753var converted = MakeConversionNode(loweredLeft, boolean, @checked: false, markAsChecked: true); // The conversion was checked in binding
785private BoundExpression LowerUserDefinedBinaryOperator(
788BoundExpression loweredLeft,
789BoundExpression loweredRight,
813private BoundExpression? TrivialLiftedComparisonOperatorOptimizations(
816BoundExpression left,
817BoundExpression right,
839BoundExpression? leftNonNull = NullableAlwaysHasValue(left);
840BoundExpression? rightNonNull = NullableAlwaysHasValue(right);
861BoundExpression result = MakeLiteral(syntax, ConstantValue.Create(operatorKind == BinaryOperatorKind.NotEqual), boolType);
863BoundExpression? nonNull = leftAlwaysNull ? rightNonNull : leftNonNull;
871sideEffects: ImmutableArray.Create<BoundExpression>(nonNull),
886BoundExpression maybeNull = leftAlwaysNull ? right : left;
890BoundExpression callHasValue = _factory.MakeNullableHasValue(syntax, maybeNull);
891BoundExpression result = operatorKind == BinaryOperatorKind.Equal ?
898BoundExpression falseExpr = MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NotEqual);
906private BoundExpression MakeOptimizedGetValueOrDefault(SyntaxNode syntax, BoundExpression expression)
924private BoundExpression MakeBooleanConstant(SyntaxNode syntax, bool value)
929private BoundExpression MakeOptimizedHasValue(SyntaxNode syntax, BoundExpression expression)
943private BoundExpression MakeNullableHasValue(SyntaxNode syntax, BoundExpression expression)
953private BoundExpression LowerLiftedBuiltInComparisonOperator(
956BoundExpression loweredLeft,
957BoundExpression loweredRight)
973BoundExpression? optimized = TrivialLiftedComparisonOperatorOptimizations(syntax, kind, loweredLeft, loweredRight, method: null, constrainedToTypeOpt: null);
1012BoundExpression? xNonNull = NullableAlwaysHasValue(loweredLeft);
1013BoundExpression? yNonNull = NullableAlwaysHasValue(loweredRight);
1050BoundExpression callX_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempX);
1051BoundExpression callY_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempY);
1052BoundExpression callX_HasValue = MakeOptimizedHasValue(syntax, boundTempX);
1053BoundExpression callY_HasValue = MakeOptimizedHasValue(syntax, boundTempY);
1073BoundExpression leftExpression = MakeBinaryOperator(
1083BoundExpression rightExpression = MakeBinaryOperator(
1094BoundExpression binaryExpression = MakeBinaryOperator(
1117sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1143private BoundExpression LowerLiftedUserDefinedComparisonOperator(
1146BoundExpression loweredLeft,
1147BoundExpression loweredRight,
1153BoundExpression? optimized = TrivialLiftedComparisonOperatorOptimizations(syntax, kind, loweredLeft, loweredRight, method, constrainedToTypeOpt);
1208BoundExpression? xNonNull = NullableAlwaysHasValue(loweredLeft);
1209BoundExpression? yNonNull = NullableAlwaysHasValue(loweredRight);
1223BoundExpression callX_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempX);
1224BoundExpression callY_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempY);
1225BoundExpression callX_HasValue = MakeOptimizedHasValue(syntax, boundTempX);
1226BoundExpression callY_HasValue = MakeOptimizedHasValue(syntax, boundTempY);
1244BoundExpression condition = MakeBinaryOperator(
1254BoundExpression unliftedOp = MakeBinaryOperator(
1263BoundExpression consequence;
1292BoundExpression alternative = MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NotEqual);
1294BoundExpression conditionalExpression = RewriteConditionalOperator(
1306sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1311private BoundExpression? TrivialLiftedBinaryArithmeticOptimizations(
1314BoundExpression left,
1315BoundExpression right,
1340BoundExpression? leftNonNull = NullableAlwaysHasValue(left);
1341BoundExpression? rightNonNull = NullableAlwaysHasValue(right);
1351private BoundExpression MakeLiftedBinaryOperatorConsequence(
1354BoundExpression left,
1355BoundExpression right,
1361BoundExpression unliftedOp = MakeBinaryOperator(
1377private static BoundExpression? OptimizeLiftedArithmeticOperatorOneNull(
1379BoundExpression left,
1380BoundExpression right,
1398BoundExpression notAlwaysNull = leftAlwaysNull ? right : left;
1399BoundExpression? neverNull = NullableAlwaysHasValue(notAlwaysNull);
1400BoundExpression sideEffect = neverNull ?? notAlwaysNull;
1415sideEffects: ImmutableArray.Create<BoundExpression>(sideEffect),
1420private BoundExpression LowerLiftedBinaryArithmeticOperator(
1423BoundExpression loweredLeft,
1424BoundExpression loweredRight,
1433BoundExpression? optimized = OptimizeLiftedBinaryArithmetic(syntax, kind, loweredLeft, loweredRight, type, method, constrainedToTypeOpt);
1457var sideeffects = ArrayBuilder<BoundExpression>.GetInstance();
1460BoundExpression? leftNeverNull = NullableAlwaysHasValue(loweredLeft);
1461BoundExpression? rightNeverNull = NullableAlwaysHasValue(loweredRight);
1463BoundExpression boundTempX = leftNeverNull ?? loweredLeft;
1466BoundExpression boundTempY = rightNeverNull ?? loweredRight;
1469BoundExpression callX_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempX);
1470BoundExpression callY_GetValueOrDefault = MakeOptimizedGetValueOrDefault(syntax, boundTempY);
1471BoundExpression callX_HasValue = MakeOptimizedHasValue(syntax, boundTempX);
1472BoundExpression callY_HasValue = MakeOptimizedHasValue(syntax, boundTempY);
1476BoundExpression condition = MakeBinaryOperator(syntax, BinaryOperatorKind.BoolAnd, callX_HasValue, callY_HasValue, boolType, method: null, constrainedToTypeOpt: null);
1479BoundExpression consequence = MakeLiftedBinaryOperatorConsequence(syntax, kind, callX_GetValueOrDefault, callY_GetValueOrDefault, type, method, constrainedToTypeOpt);
1482BoundExpression alternative = new BoundDefaultExpression(syntax, type);
1487BoundExpression conditionalExpression = RewriteConditionalOperator(
1504private BoundExpression CaptureExpressionInTempIfNeeded(
1505BoundExpression operand,
1506ArrayBuilder<BoundExpression> sideeffects,
1522private BoundExpression? OptimizeLiftedBinaryArithmetic(
1525BoundExpression left,
1526BoundExpression right,
1531BoundExpression? optimized = TrivialLiftedBinaryArithmeticOptimizations(syntax, kind, left, right, type, method, constrainedToTypeOpt);
1625BoundExpression? nonNullRight = NullableAlwaysHasValue(right);
1658private BoundExpression MakeNewNullableBoolean(SyntaxNode syntax, bool? value)
1673private BoundExpression? OptimizeLiftedBooleanOperatorOneNull(
1676BoundExpression left,
1677BoundExpression right)
1704BoundExpression alwaysNull = leftAlwaysNull ? left : right;
1705BoundExpression notAlwaysNull = leftAlwaysNull ? right : left;
1706BoundExpression? neverNull = NullableAlwaysHasValue(notAlwaysNull);
1708BoundExpression nullBool = new BoundDefaultExpression(syntax, alwaysNull.Type);
1712BoundExpression newNullBool = MakeNewNullableBoolean(syntax, kind == BinaryOperatorKind.LiftedBoolOr);
1738BoundExpression condition = MakeOptimizedGetValueOrDefault(syntax, boundTemp);
1739BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolAnd ? nullBool : boundTemp;
1740BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTemp : nullBool;
1741BoundExpression conditionalExpression = RewriteConditionalOperator(
1753sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
1758private BoundExpression? OptimizeLiftedBooleanOperatorOneNonNull(
1761BoundExpression left,
1762BoundExpression right)
1780BoundExpression? leftNonNull = NullableAlwaysHasValue(left);
1781BoundExpression? rightNonNull = NullableAlwaysHasValue(right);
1797BoundExpression nonNullTemp = leftNonNull == null ? boundTempY : boundTempX;
1798BoundExpression maybeNullTemp = leftNonNull == null ? boundTempX : boundTempY;
1799BoundExpression condition = nonNullTemp;
1800BoundExpression newNullBool = MakeNewNullableBoolean(syntax, kind == BinaryOperatorKind.LiftedBoolOr);
1801BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolOr ? newNullBool : maybeNullTemp;
1802BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolOr ? maybeNullTemp : newNullBool;
1803BoundExpression conditionalExpression = RewriteConditionalOperator(
1814sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1819private BoundExpression LowerLiftedBooleanOperator(
1822BoundExpression loweredLeft,
1823BoundExpression loweredRight)
1829BoundExpression? optimized = OptimizeLiftedBooleanOperatorOneNull(syntax, kind, loweredLeft, loweredRight);
1858BoundExpression callX_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTempX, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefaultX);
1860BoundExpression callY_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTempY, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefaultY);
1862BoundExpression callX_HasValue = _factory.MakeNullableHasValue(syntax, boundTempX);
1865BoundExpression innerOr = MakeBinaryOperator(
1875BoundExpression invert = MakeUnaryOperator(UnaryOperatorKind.BoolLogicalNegation, syntax, method: null, constrainedToTypeOpt: null, innerOr, boolType);
1878BoundExpression condition = MakeBinaryOperator(
1887BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTempY : boundTempX;
1888BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTempX : boundTempY;
1890BoundExpression conditionalExpression = RewriteConditionalOperator(
1902sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignmentX, tempAssignmentY),
1941private BoundExpression RewriteNullableNullEquality(
1944BoundExpression loweredLeft,
1945BoundExpression loweredRight,
1963BoundExpression nullable = loweredRight.IsLiteralNull() ? loweredLeft : loweredRight;
1972BoundExpression? nonNullValue = NullableAlwaysHasValue(nullable);
1983sideEffects: ImmutableArray.Create<BoundExpression>(nonNullValue),
1993BoundExpression whenNotNull = RewriteNullableNullEquality(
2000var whenNull = kind == BinaryOperatorKind.NullableNullEqual ? MakeBooleanConstant(syntax, true) : null;
2005BoundExpression call = MakeNullableHasValue(syntax, nullable);
2006BoundExpression result = kind == BinaryOperatorKind.NullableNullNotEqual ?
2013private BoundExpression RewriteStringEquality(BoundBinaryOperator? oldNode, SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2026private BoundExpression RewriteDelegateOperation(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2047BoundExpression call = _inExpressionLambda
2049: (BoundExpression)BoundCall.Synthesized(syntax, receiverOpt: null, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, method, loweredLeft, loweredRight);
2050BoundExpression result = method.ReturnType.SpecialType == SpecialType.System_Delegate ?
2056private BoundExpression RewriteDecimalBinaryOperation(SyntaxNode syntax, BoundExpression loweredLeft, BoundExpression loweredRight, BinaryOperatorKind operatorKind)
2087private BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
2144private BoundExpression RewriteBuiltInShiftOperation(
2148BoundExpression loweredLeft,
2149BoundExpression loweredRight,
2206private BoundExpression RewriteBuiltInNativeShiftOperation(
2210BoundExpression loweredLeft,
2211BoundExpression loweredRight,
2267private BoundExpression RewritePointerNumericOperator(
2270BoundExpression loweredLeft,
2271BoundExpression loweredRight,
2320private BoundExpression MakeSizeOfMultiplication(BoundExpression numericOperand, PointerTypeSymbol pointerType, bool isChecked)
2322var sizeOfExpression = _factory.Sizeof(pointerType.PointedAtType);
2464private BoundExpression RewritePointerSubtraction(
2466BoundExpression loweredLeft,
2467BoundExpression loweredRight,
2475var sizeOfExpression = _factory.Sizeof(pointerType.PointedAtType);
Lowering\LocalRewriter\LocalRewriter_Call.cs (81)
23public BoundExpression VisitDynamicInvocation(BoundDynamicInvocation node, bool resultDiscarded)
30BoundExpression loweredReceiver;
81var loweredExpression = VisitExpression(node.Expression);
97private void EmbedIfNeedTo(BoundExpression receiver, ImmutableArray<MethodSymbol> methods, SyntaxNode syntaxNode)
116private void EmbedIfNeedTo(BoundExpression receiver, ImmutableArray<PropertySymbol> properties, SyntaxNode syntaxNode)
137ref BoundExpression? receiverOpt,
138ref ImmutableArray<BoundExpression> arguments,
324BoundExpression rewrittenCall;
341BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
355BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
361BoundExpression visitArgumentsAndFinishRewrite(BoundCall node, BoundExpression? rewrittenReceiver)
366ImmutableArray<BoundExpression> arguments = node.Arguments;
370BoundExpression? firstRewrittenArgument = null;
406var rewrittenCall = MakeCall(node, node.Syntax, rewrittenReceiver, method, rewrittenArguments, argRefKindsOpt, node.ResultKind, temps.ToImmutableAndFree());
439private BoundExpression MakeCall(
442BoundExpression? rewrittenReceiver,
444ImmutableArray<BoundExpression> rewrittenArguments,
449BoundExpression rewrittenBoundCall;
516sideEffects: ImmutableArray<BoundExpression>.Empty,
524private BoundExpression MakeCall(SyntaxNode syntax, BoundExpression? rewrittenReceiver, MethodSymbol method, ImmutableArray<BoundExpression> rewrittenArguments)
537private static bool IsSafeForReordering(BoundExpression expression, RefKind kind)
544var current = expression;
623internal static bool IsCapturedPrimaryConstructorParameter(BoundExpression expression)
655private ImmutableArray<BoundExpression> VisitArgumentsAndCaptureReceiverIfNeeded(
656[NotNullIfNotNull(nameof(rewrittenReceiver))] ref BoundExpression? rewrittenReceiver,
658ImmutableArray<BoundExpression> arguments,
662ArrayBuilder<BoundExpression>? storesOpt,
664BoundExpression? firstRewrittenArgument = null)
723ImmutableArray<BoundExpression> rewrittenArguments;
732var visitedArgumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(arguments.Length);
741var argument = arguments[i];
810extraRefInitialization is object ? ImmutableArray.Create<BoundExpression>(extraRefInitialization, assignmentToTemp) : ImmutableArray.Create<BoundExpression>(assignmentToTemp),
829ArrayBuilder<BoundExpression> visitedArgumentsBuilder,
835var argument = arguments[argumentIndex];
886visitedArgumentsBuilder[argIndex] = _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, ImmutableArray.Create<BoundExpression>(store), local);
908static bool usesReceiver(BoundExpression argument)
966_factory.Sequence(new BoundExpression[] { _factory.AssignmentExpression(cache, intermediateRef) }, cache),
984_factory.Sequence(new BoundExpression[] { _factory.AssignmentExpression(cache, assignmentToTemp.Right) }, cache),
999private ImmutableArray<BoundExpression> MakeArguments(
1000ImmutableArray<BoundExpression> rewrittenArguments,
1019BoundExpression? optimized;
1085BoundExpression[] actualArguments = new BoundExpression[parameters.Length]; // The actual arguments that will be passed; one actual argument per formal parameter.
1132private bool TryOptimizeParamsArray(BoundExpression possibleParamsArray, [NotNullWhen(true)] out BoundExpression? optimized)
1212ImmutableArray<BoundExpression> rewrittenArguments,
1271private delegate BoundExpression ParamsArrayElementRewriter<TArg>(BoundExpression element, ref TArg arg);
1272private static BoundExpression RewriteParamsArray<TArg>(BoundExpression paramsArray, ParamsArrayElementRewriter<TArg> elementRewriter, ref TArg arg)
1278ArrayBuilder<BoundExpression>? elementsBuilder = null;
1282var element = elements[i];
1283var replacement = elementRewriter(element, ref arg);
1289elementsBuilder = ArrayBuilder<BoundExpression>.GetInstance(elements.Length);
1322ImmutableArray<BoundExpression> rewrittenArguments,
1324/* out */ BoundExpression[] arguments,
1335BoundExpression argument = rewrittenArguments[a];
1361static (BoundExpression element, ref (LocalRewriter rewriter, bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps) arg) =>
1391private BoundExpression StoreArgumentToTempIfNecessary(bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps, BoundExpression argument, RefKind argRefKind, RefKind paramRefKind)
1410bool isLambdaConversion(BoundExpression expr)
1414private BoundExpression CreateEmptyArray(SyntaxNode syntax, ArrayTypeSymbol arrayType)
1416BoundExpression? arrayEmpty = CreateArrayEmptyCallIfAvailable(syntax, arrayType.ElementType);
1424ImmutableArray.Create<BoundExpression>(
1434private BoundExpression? CreateArrayEmptyCallIfAvailable(SyntaxNode syntax, TypeSymbol elementType)
1456ImmutableArray<BoundExpression>.Empty,
1469BoundExpression[] arguments,
1499BoundExpression[] arguments,
1524var argument = arguments[a];
1531static (BoundExpression element, ref (ArrayBuilder<BoundAssignmentOperator> tempStores, int tempsRemainedInUse, int firstUnclaimedStore) arg) =>
1546static BoundExpression mergeArgumentAndSideEffect(BoundExpression argument, ArrayBuilder<BoundAssignmentOperator> tempStores, ref int tempsRemainedInUse, ref int firstUnclaimedStore)
1584var sideeffects = new BoundExpression[correspondingStore - firstUnclaimedStore];
1617BoundExpression[] actualArguments, //already re-ordered to match parameters
1641var argument = actualArguments[argIndex];
1660sideEffects: ImmutableArray.Create<BoundExpression>(boundAssignmentToTemp),
1679var loweredReceiver = VisitExpression(node.Receiver);
Lowering\LocalRewriter\LocalRewriter_CollectionExpression.cs (107)
31private BoundExpression RewriteCollectionExpressionConversion(Conversion conversion, BoundCollectionExpression node)
48if (TryRewriteSingleElementSpreadToList(node, listElementType, out var result))
116BoundExpression expr;
124expr = (BoundExpression)element;
138var iteratorBody = Binder.GetUnderlyingCollectionExpressionElement(node, ((BoundExpressionStatement)spreadElement.IteratorBody).Expression, throwOnErrors: true);
151var result = Binder.GetUnderlyingCollectionExpressionElement(node, (BoundExpression)element, throwOnErrors: true);
160private bool TryRewriteSingleElementSpreadToList(BoundCollectionExpression node, TypeWithAnnotations listElementType, [NotNullWhen(true)] out BoundExpression? result)
183var rewrittenSpreadExpression = VisitExpression(singleSpread.Expression);
217private static bool CanOptimizeSingleSpreadAsCollectionBuilderArgument(BoundCollectionExpression node, [NotNullWhen(true)] out BoundExpression? spreadExpression)
235private BoundExpression VisitImmutableArrayCollectionExpression(BoundCollectionExpression node, TypeWithAnnotations elementType, MethodSymbol asImmutableArray)
237var arrayCreation = VisitArrayOrSpanCollectionExpression(
246private BoundExpression VisitArrayOrSpanCollectionExpression(BoundCollectionExpression node, CollectionExpressionTypeKind collectionTypeKind, TypeSymbol collectionType, TypeWithAnnotations elementType)
280var rewrittenElements = elements.SelectAsArray(static (element, rewriter) => rewriter.VisitExpression((BoundExpression)element), this);
301BoundExpression array;
314var list = CreateAndPopulateList(node, elementType, elements);
332private BoundExpression VisitCollectionInitializerCollectionExpression(BoundCollectionExpression node, TypeSymbol collectionType)
337var rewrittenReceiver = VisitExpression(node.CollectionCreation);
344var sideEffects = ArrayBuilder<BoundExpression>.GetInstance(elements.Length + 1);
354var rewrittenElement = element is BoundCollectionExpressionSpreadElement spreadElement ?
361var rewrittenValue = rewriteCollectionInitializer(temp, ((BoundExpressionStatement)iteratorBody).Expression);
367rewriteCollectionInitializer(temp, (BoundExpression)element);
383BoundExpression? rewriteCollectionInitializer(BoundLocal rewrittenReceiver, BoundExpression expressionElement)
394private BoundExpression VisitListInterfaceCollectionExpression(BoundCollectionExpression node)
407BoundExpression arrayOrList;
437BoundExpression fieldValue = kind switch
440SynthesizedReadOnlyListKind.SingleElement => this.VisitExpression((BoundExpression)elements.Single()),
459BoundExpression createArray(BoundCollectionExpression node, ArrayTypeSymbol arrayType)
468private BoundExpression VisitCollectionBuilderCollectionExpression(BoundCollectionExpression node)
489BoundExpression span = CanOptimizeSingleSpreadAsCollectionBuilderArgument(node, out var spreadExpression)
511var result = VisitExpression(node.CollectionBuilderInvocationConversion);
530node.Elements.All(e => ((BoundExpression)e).ConstantValueOpt is { });
540private BoundExpression CreateAndPopulateSpanFromInlineArray(
547Debug.Assert(elements.All(e => e is BoundExpression));
564var element = VisitExpression((BoundExpression)elements[0]);
582var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
592var element = VisitExpression((BoundExpression)elements[i]);
657private BoundExpression? TryOptimizeSingleSpreadToArray(BoundCollectionExpression node, ArrayTypeSymbol arrayType)
670var rewrittenSpreadExpression = VisitExpression(spreadExpression);
694var rewrittenSpreadExpression = CallAsSpanMethod(VisitExpression(spreadExpression), asSpanMethod);
719private BoundExpression CreateAndPopulateArray(BoundCollectionExpression node, ArrayTypeSymbol arrayType)
745elements.SelectAsArray(static (element, rewriter) => rewriter.VisitExpression((BoundExpression)element), this));
748ImmutableArray.Create<BoundExpression>(
760var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
787addElement: (ArrayBuilder<BoundExpression> expressions, BoundExpression arrayTemp, BoundExpression rewrittenValue, bool isLastElement) =>
815tryOptimizeSpreadElement: (ArrayBuilder<BoundExpression> sideEffects, BoundExpression arrayTemp, BoundCollectionExpressionSpreadElement spreadElement, BoundExpression rewrittenSpreadOperand) =>
822if (!TryConvertToSpan(arrayTemp, writableOnly: true, out var targetSpan))
901private bool TryConvertToSpan(BoundExpression expression, bool writableOnly, [NotNullWhen(true)] out BoundExpression? span)
916private BoundExpression CallAsSpanMethod(BoundExpression spreadExpression, MethodSymbol? asSpanMethod)
940private (MethodSymbol spanSliceMethod, BoundExpression spreadElementAsSpan, MethodSymbol getLengthMethod, MethodSymbol copyToMethod)? PrepareCopyToOptimization(
942BoundExpression rewrittenSpreadOperand)
952if (!TryConvertToSpan(rewrittenSpreadOperand, writableOnly: false, out var spreadOperandAsSpan))
982ArrayBuilder<BoundExpression> sideEffects,
985BoundExpression spanTemp,
986BoundExpression rewrittenSpreadOperand,
988BoundExpression spreadOperandAsSpan,
1021private BoundExpression CreateAndPopulateList(BoundCollectionExpression node, TypeWithAnnotations elementType, ImmutableArray<BoundNode> elements)
1029var sideEffects = ArrayBuilder<BoundExpression>.GetInstance(elements.Length + 1);
1059var knownLengthExpression = GetKnownLengthExpression(elements, numberIncludingLastSpread, localsBuilder);
1071rewrittenReceiver = _factory.New(constructor, ImmutableArray.Create<BoundExpression>(knownLengthTemp));
1083rewrittenReceiver = _factory.New(constructor, ImmutableArray<BoundExpression>.Empty);
1123addElement: (ArrayBuilder<BoundExpression> expressions, BoundExpression spanTemp, BoundExpression rewrittenValue, bool isLastElement) =>
1151tryOptimizeSpreadElement: (ArrayBuilder<BoundExpression> sideEffects, BoundExpression spanTemp, BoundCollectionExpressionSpreadElement spreadElement, BoundExpression rewrittenSpreadOperand) =>
1170addElement: (ArrayBuilder<BoundExpression> expressions, BoundExpression listTemp, BoundExpression rewrittenValue, bool isLastElement) =>
1176tryOptimizeSpreadElement: (ArrayBuilder<BoundExpression> sideEffects, BoundExpression listTemp, BoundCollectionExpressionSpreadElement spreadElement, BoundExpression rewrittenSpreadOperand) =>
1204private BoundExpression RewriteCollectionExpressionElementExpression(BoundNode element)
1206var expression = element is BoundCollectionExpressionSpreadElement spreadElement ?
1208(BoundExpression)element;
1216ArrayBuilder<BoundExpression> sideEffects)
1220var rewrittenExpression = RewriteCollectionExpressionElementExpression(elements[i]);
1230BoundExpression rewrittenReceiver,
1233ArrayBuilder<BoundExpression> sideEffects,
1234Action<ArrayBuilder<BoundExpression>, BoundExpression, BoundExpression, bool> addElement,
1235Func<ArrayBuilder<BoundExpression>, BoundExpression, BoundCollectionExpressionSpreadElement, BoundExpression, bool> tryOptimizeSpreadElement)
1249var rewrittenElement = MakeCollectionExpressionSpreadElement(
1254var rewrittenValue = VisitExpression(((BoundExpressionStatement)iteratorBody).Expression);
1255var builder = ArrayBuilder<BoundExpression>.GetInstance();
1274private BoundExpression GetKnownLengthExpression(ImmutableArray<BoundNode> elements, int numberIncludingLastSpread, ArrayBuilder<BoundLocal> rewrittenExpressions)
1279BoundExpression? sum = null;
1289var lengthAccess = VisitExpression(spreadElement.LengthOrCount);
1314BoundExpression add(BoundExpression? sum, BoundExpression value)
1322private BoundExpression MakeCollectionExpressionSpreadElement(
1324BoundExpression rewrittenExpression,
Lowering\LocalRewriter\LocalRewriter_CompoundAssignmentOperator.cs (62)
22private BoundExpression VisitCompoundAssignmentOperator(BoundCompoundAssignmentOperator node, bool used)
36private BoundExpression VisitInstanceCompoundAssignmentOperator(BoundCompoundAssignmentOperator node, bool used)
68private BoundExpression VisitBuiltInOrStaticCompoundAssignmentOperator(BoundCompoundAssignmentOperator node, bool used)
72var stores = ArrayBuilder<BoundExpression>.GetInstance();
81BoundExpression transformedLHS = TransformCompoundAssignmentLHS(node.Left, isRegularCompoundAssignment: true, stores, temps, isDynamic);
82var lhsRead = MakeRValue(transformedLHS);
83BoundExpression rewrittenAssignment;
105var sequence = ArrayBuilder<BoundExpression>.GetInstance();
123BoundExpression loweredRight = VisitExpression(node.Right);
142var condition = _factory.Conditional(isEvent, invokeEventAccessor.ToExpression(), rewrittenAssignment, rewrittenAssignment.Type);
152BoundExpression result = (temps.Count == 0 && stores.Count == 0) ?
165BoundExpression rewriteAssignment(BoundExpression leftRead, BoundExpression right, bool rightIsVisited)
178BoundExpression opLHS = leftRead;
189BoundExpression operand;
198var loweredRight = rightIsVisited ? right : VisitExpression(right);
203BoundExpression opFinal = operand;
219private BoundExpression? TransformPropertyOrEventReceiver(Symbol propertyOrEvent, BoundExpression? receiverOpt, bool isRegularCompoundAssignment, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
249BoundExpression rewrittenReceiver = VisitExpression(receiverOpt);
285private BoundDynamicMemberAccess TransformDynamicMemberAccess(BoundDynamicMemberAccess memberAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
293var rewrittenReceiver = VisitExpression(memberAccess.Receiver);
302private BoundIndexerAccess TransformIndexerAccess(BoundIndexerAccess indexerAccess, bool isRegularCompoundAssignment, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
304var receiverOpt = indexerAccess.ReceiverOpt;
307BoundExpression transformedReceiver = VisitExpression(receiverOpt);
354ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
375BoundExpression transformedReceiver,
376ImmutableArray<BoundExpression> rewrittenArguments,
377ArrayBuilder<BoundExpression> stores,
388BoundExpression[] actualArguments = new BoundExpression[parameters.Length]; // The actual arguments that will be passed; one actual argument per formal parameter.
409if (TryOptimizeParamsArray(array, out BoundExpression? optimized))
463private BoundExpression TransformImplicitIndexerAccess(
466ArrayBuilder<BoundExpression> stores,
481private BoundExpression TransformIndexPatternIndexerAccess(BoundImplicitIndexerAccess implicitIndexerAccess, bool isRegularCompoundAssignment, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps, bool isDynamicAssignment)
484var access = GetUnderlyingIndexerOrSliceAccess(
517private bool TransformCompoundAssignmentFieldOrEventAccessReceiver(Symbol fieldOrEvent, ref BoundExpression? receiver, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
539BoundExpression rewrittenReceiver = VisitExpression(receiver);
560private BoundDynamicIndexerAccess TransformDynamicIndexerAccess(BoundDynamicIndexerAccess indexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
562BoundExpression loweredReceiver;
577var loweredArguments = new BoundExpression[arguments.Length];
619private BoundExpression TransformCompoundAssignmentLHS(BoundExpression originalLHS, bool isRegularCompoundAssignment, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps, bool isDynamicAssignment)
698BoundExpression? receiverOpt = fieldAccess.ReceiverOpt;
727var loweredArray = VisitExpression(arrayAccess.Expression);
751var result = VisitExpression(originalLHS);
781BoundExpression? receiverOpt = eventAccess.ReceiverOpt;
809BoundExpression rewrittenVariable = VisitExpression(originalLHS);
823private BoundExpression BoxReceiver(BoundExpression rewrittenReceiver, NamedTypeSymbol memberContainingType)
834private BoundExpression SpillArrayElementAccess(
835BoundExpression loweredExpression,
836ImmutableArray<BoundExpression> loweredIndices,
837ArrayBuilder<BoundExpression> stores,
846var boundTempIndices = new BoundExpression[loweredIndices.Length];
880BoundExpression expression,
928BoundExpression expression)
Lowering\LocalRewriter\LocalRewriter_Conversion.cs (81)
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();
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);
295private BoundExpression MakeConversionNodeCore(
298BoundExpression rewrittenOperand,
388BoundExpression? nullableValue = NullableAlwaysHasValue(rewrittenOperand);
461var operand = MakeConversionNode(
510var rewrittenNode = RewriteDecimalConversion(syntax, rewrittenOperand, rewrittenOperand.Type, underlyingTypeTo, @checked, isImplicit: false, constantValueOpt: constantValueOpt);
568var receiver = (!method.RequiresInstanceReceiver && !oldNodeOpt.IsExtensionMethod && !method.IsAbstract && !method.IsVirtual) ? _factory.Type(method.ContainingType) : mg.ReceiverOpt;
789private BoundExpression MakeConversionNode(BoundExpression rewrittenOperand, TypeSymbol rewrittenType, bool @checked, bool acceptFailingConversion = false, bool markAsChecked = false)
808BoundExpression rewrittenOperand,
838private BoundExpression MakeConversionNode(
840BoundExpression rewrittenOperand,
908BoundExpression userDefined = RewriteUserDefinedConversion(
948private BoundExpression RewriteTupleConversion(
950BoundExpression rewrittenOperand,
962var fieldAccessorsBuilder = ArrayBuilder<BoundExpression>.GetInstance(numElements);
971var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(savedTuple, syntax, srcElementFields[i]);
972var convertedFieldAccess = MakeConversionNode(syntax, fieldAccess, elementConversions[i], destElementTypes[i].Type, @checked, explicitCastInCode);
976var result = MakeTupleCreationExpression(syntax, rewrittenType, fieldAccessorsBuilder.ToImmutableAndFree());
980internal static bool NullableNeverHasValue(BoundExpression expression)
995internal static BoundExpression? NullableAlwaysHasValue(BoundExpression expression)
1035private BoundExpression RewriteNullableConversion(
1037BoundExpression rewrittenOperand,
1065BoundExpression rewrittenConversion = MakeConversionNode(syntax, rewrittenOperand, conversion.UnderlyingConversions[0], rewrittenType.GetNullableUnderlyingType(), @checked);
1077BoundExpression? value = NullableAlwaysHasValue(rewrittenOperand);
1091private BoundExpression RewriteLiftedConversionInExpressionTree(
1093BoundExpression rewrittenOperand,
1143private BoundExpression RewriteFullyLiftedBuiltInConversion(
1145BoundExpression operand,
1157BoundExpression? optimized = OptimizeLiftedBuiltInConversion(syntax, operand, conversion, @checked, type);
1176BoundExpression condition = MakeNullableHasValue(syntax, boundTemp);
1178BoundExpression consequence = new BoundObjectCreationExpression(
1187BoundExpression alternative = new BoundDefaultExpression(syntax, type);
1188BoundExpression conditionalExpression = RewriteConditionalOperator(
1200sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
1205private BoundExpression? OptimizeLiftedUserDefinedConversion(
1207BoundExpression operand,
1221BoundExpression? nonNullValue = NullableAlwaysHasValue(operand);
1237private BoundExpression? OptimizeLiftedBuiltInConversion(
1239BoundExpression operand,
1258BoundExpression? nonNullValue = NullableAlwaysHasValue(operand);
1277private BoundExpression? DistributeLiftedConversionIntoLiftedOperand(
1279BoundExpression operand,
1339private BoundExpression RewriteUserDefinedConversion(
1341BoundExpression rewrittenOperand,
1371BoundExpression result = BoundCall.Synthesized(
1381private BoundExpression MakeLiftedUserDefinedConversionConsequence(BoundCall call, TypeSymbol resultType)
1393private BoundExpression RewriteLiftedUserDefinedConversion(
1395BoundExpression rewrittenOperand,
1417BoundExpression? optimized = OptimizeLiftedUserDefinedConversion(syntax, rewrittenOperand, conversion, rewrittenType);
1440BoundExpression condition = _factory.MakeNullableHasValue(syntax, boundTemp);
1456BoundExpression consequence = MakeLiftedUserDefinedConversionConsequence(userDefinedCall, rewrittenType);
1459BoundExpression alternative = new BoundDefaultExpression(syntax, rewrittenType);
1462BoundExpression conditionalExpression = RewriteConditionalOperator(
1476sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
1481private BoundExpression RewriteIntPtrConversion(
1483BoundExpression rewrittenOperand,
1528var rewrittenCall = MakeCall(
1697private BoundExpression RewriteDecimalConversion(SyntaxNode syntax, BoundExpression operand, TypeSymbol fromType, TypeSymbol toType, bool @checked, bool isImplicit, ConstantValue? constantValueOpt)
1728private BoundExpression RewriteDecimalConversionCore(SyntaxNode syntax, BoundExpression operand, TypeSymbol fromType, TypeSymbol toType, bool isImplicit, ConstantValue? constantValueOpt)
Lowering\LocalRewriter\LocalRewriter_DeconstructionAssignmentOperator.cs (50)
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, isRegularCompoundAssignment: false,
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()
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;
310BoundExpression 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;
365var tempAssignment = factory.AssignmentExpression(
377var pointerValue = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, addr);
380BoundExpression pinAndGetPtr = factory.Sequence(
382sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
404sideEffects: ImmutableArray.Create<BoundExpression>(nullableTempAssignment),
444BoundExpression initializerExpr = VisitExpression(fixedInitializer.Expression);
465var addr = factory.Convert(
470var convertedStringTemp = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, addr);
475BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, factory.Local(localSymbol), BinaryOperatorKind.NotEqual);
476BoundExpression helperCall;
485helperCall = new BoundBadExpression(fixedInitializer.Syntax, LookupResultKind.NotInvocable, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, ErrorTypeSymbol.UnknownResultType);
488BoundExpression addition = factory.Binary(BinaryOperatorKind.PointerAndIntAddition, localType, factory.Local(localSymbol), helperCall);
513BoundExpression initializerExpr = VisitExpression(fixedInitializer.Expression);
526BoundExpression arrayTempInit = factory.AssignmentExpression(factory.Local(pinnedTemp), initializerExpr);
529BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, arrayTempInit, BinaryOperatorKind.NotEqual);
531BoundExpression lengthCall;
546lengthCall = new BoundBadExpression(fixedInitializer.Syntax, LookupResultKind.NotInvocable, ImmutableArray<Symbol?>.Empty, ImmutableArray.Create<BoundExpression>(factory.Local(pinnedTemp)), ErrorTypeSymbol.UnknownResultType);
552BoundExpression lengthCheck = factory.Binary(BinaryOperatorKind.IntNotEqual, factory.SpecialType(SpecialType.System_Boolean), lengthCall, factory.Literal(0));
555BoundExpression condition = factory.Binary(BinaryOperatorKind.LogicalBoolAnd, factory.SpecialType(SpecialType.System_Boolean), notNullCheck, lengthCheck);
558BoundExpression firstElement = factory.ArrayAccessFirstElement(factory.Local(pinnedTemp));
562BoundExpression firstElementAddress = new BoundAddressOfOperator(factory.Syntax, firstElement, type: new PointerTypeSymbol(arrayElementType));
563BoundExpression convertedFirstElementAddress = ApplyConversionIfNotIdentity(fixedInitializer.ElementPointerConversion, fixedInitializer.ElementPointerPlaceholder, firstElementAddress);
566BoundExpression consequenceAssignment = factory.AssignmentExpression(factory.Local(localSymbol), convertedFirstElementAddress);
569BoundExpression alternativeAssignment = factory.AssignmentExpression(factory.Local(localSymbol), factory.Null(localType));
Lowering\LocalRewriter\LocalRewriter_ForEachStatement.cs (52)
41BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
140BoundExpression? elementConversion,
151BoundExpression rewrittenExpression = VisitExpression(convertedCollection.Operand);
162var receiver = ConvertReceiverForInvocation(forEachSyntax, rewrittenExpression, getEnumeratorInfo.Method, convertedCollection.Conversion, enumeratorInfo.CollectionType);
163BoundExpression? firstRewrittenArgument = null;
169var builder = ArrayBuilder<BoundExpression>.GetInstance(getEnumeratorInfo.Arguments.Length);
183BoundExpression enumeratorVarInitValue = MakeCall(getEnumeratorInfo, forEachSyntax, receiver,
192BoundExpression iterationVarAssignValue = ApplyConversionIfNotIdentity(
217BoundExpression rewrittenCondition = MakeCall(
356BoundExpression receiver;
357BoundExpression disposeCall;
433BoundExpression disposableVarInitValue = new BoundAsOperator(forEachSyntax,
444BoundExpression disposeCall = BoundCall.Synthesized(syntax: forEachSyntax, receiverOpt: boundDisposableVar, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, method: disposeMethod);
474private BoundStatement WrapWithAwait(SyntaxNode forEachSyntax, BoundExpression disposeCall, BoundAwaitableInfo disposeAwaitableInfoOpt)
478var awaitExpr = RewriteAwaitExpression(forEachSyntax, disposeCall, disposeAwaitableInfoOpt, awaitExpressionType, debugInfo, used: false);
494private BoundExpression ConvertReceiverForInvocation(CSharpSyntaxNode syntax, BoundExpression receiver, MethodSymbol method, Conversion receiverConversion, TypeSymbol convertedReceiverType)
556BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
585BoundExpression collectionExpression,
588BoundExpression? elementConversion,
601BoundExpression rewrittenExpression = VisitExpression(collectionExpression);
635BoundExpression iterationVarInitValue = ApplyConversionIfNotIdentity(
649BoundExpression arrayLength = getLength(this, forEachSyntax, boundArrayVar, arg);
652BoundExpression exitCondition = new BoundBinaryOperator(
693private delegate BoundStatement? GetForEachStatementAsForPreamble(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind);
694private delegate BoundExpression GetForEachStatementAsForItem<TArg>(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, BoundLocal boundArrayVar, BoundLocal boundPositionVar, TArg arg);
695private delegate BoundExpression GetForEachStatementAsForLength<TArg>(LocalRewriter rewriter, SyntaxNode syntax, BoundLocal boundArrayVar, TArg arg);
732return static (LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind) =>
783BoundExpression arrayLength = rewriter._factory.Literal(length);
799BoundExpression iterationVarValue)
815BoundExpression loweredAssignment = VisitExpression(assignment);
862BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
882BoundExpression collectionExpression,
884BoundExpression? elementConversion,
896BoundExpression rewrittenExpression = VisitExpression(collectionExpression);
924BoundExpression iterationVarInitValue = ApplyConversionIfNotIdentity(
930indices: ImmutableArray.Create<BoundExpression>(boundPositionVar),
942BoundExpression arrayLength = new BoundArrayLength(
948BoundExpression exitCondition = new BoundBinaryOperator(
1011BoundExpression collectionExpression = GetUnconvertedCollectionExpression(node, out _);
1031BoundExpression collectionExpression,
1033BoundExpression? elementConversion,
1056BoundExpression rewrittenExpression = VisitExpression(collectionExpression);
1082ImmutableArray<BoundExpression> dimensionArgument = ImmutableArray.Create(
1088BoundExpression currentDimensionUpperBound = BoundCall.Synthesized(forEachSyntax, boundArrayVar, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getUpperBoundMethod, dimensionArgument);
1104BoundExpression iterationVarInitValue = ApplyConversionIfNotIdentity(
1109indices: ImmutableArray.Create((BoundExpression[])boundPositionVar),
1136ImmutableArray<BoundExpression> dimensionArgument = ImmutableArray.Create(
1142BoundExpression currentDimensionLowerBound = BoundCall.Synthesized(forEachSyntax, boundArrayVar, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getLowerBoundMethod, dimensionArgument);
1152BoundExpression exitCondition = new BoundBinaryOperator(
1211private static BoundExpression GetUnconvertedCollectionExpression(BoundForEachStatement node, out Conversion collectionConversion)
1226private 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 (81)
16private BoundExpression MakeDynamicIndexerAccessReceiver(BoundDynamicIndexerAccess indexerAccess, BoundExpression loweredReceiver)
18BoundExpression result;
41var loweredReceiver = VisitExpression(node.Receiver);
49private BoundExpression MakeDynamicGetIndex(
51BoundExpression loweredReceiver,
52ImmutableArray<BoundExpression> loweredArguments,
76private BoundExpression VisitIndexerAccess(BoundIndexerAccess node, bool isLeftOfAssignment)
84BoundExpression? rewrittenReceiver = VisitExpression(node.ReceiverOpt);
101private BoundExpression MakeIndexerAccess(
103BoundExpression rewrittenReceiver,
105ImmutableArray<BoundExpression> arguments,
111BoundExpression oldNode,
160ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
178BoundExpression call = MakePropertyGetAccess(syntax, rewrittenReceiver, indexer, rewrittenArguments, argumentRefKindsOpt, getMethod);
192ImmutableArray<BoundExpression>.Empty,
206var rewrittenReceiver = VisitExpression(node.Expression);
218BoundExpression result;
231BoundExpression makeOffsetInput = DetermineMakePatternIndexOffsetExpressionStrategy(node.Argument, out PatternIndexOffsetLoweringStrategy strategy);
232BoundExpression integerArgument = makePatternIndexOffsetExpression(makeOffsetInput, length, strategy);
247BoundExpression? startMakeOffsetInput, endMakeOffsetInput, rewrittenRangeArg;
252var sideEffectsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
254BoundExpression startExpr;
255BoundExpression rangeSizeExpr;
260BoundExpression endExpr = makePatternIndexOffsetExpression(endMakeOffsetInput, length, endStrategy);
269BoundExpression possiblyRefCapturedReceiver = rewrittenReceiver;
298ImmutableArray.Create((BoundExpression)receiverStore),
304BoundExpression makePatternIndexOffsetExpression(BoundExpression? makeOffsetInput, int length, PatternIndexOffsetLoweringStrategy strategy)
306BoundExpression integerArgument;
338BoundExpression getElementRef(BoundInlineArrayAccess node, BoundExpression rewrittenReceiver, BoundExpression index, MethodSymbol getItemOrSliceHelper, int length)
433private BoundExpression VisitImplicitIndexerAccess(BoundImplicitIndexerAccess node, bool isLeftOfAssignment)
454private BoundExpression VisitIndexPatternIndexerAccess(BoundImplicitIndexerAccess node, bool isLeftOfAssignment)
457var sideeffects = ArrayBuilder<BoundExpression>.GetInstance(2);
459BoundExpression rewrittenIndexerAccess = GetUnderlyingIndexerOrSliceAccess(
471private BoundExpression GetUnderlyingIndexerOrSliceAccess(
476ArrayBuilder<BoundExpression> sideeffects,
488BoundExpression makeOffsetInput = DetermineMakePatternIndexOffsetExpressionStrategy(node.Argument, out PatternIndexOffsetLoweringStrategy strategy);
490var receiver = VisitExpression(node.Receiver);
531BoundExpression integerArgument;
536BoundExpression lengthAccess = VisitExpression(node.LengthOrCountAccess);
565BoundExpression rewrittenIndexerAccess;
576ImmutableArray<BoundExpression> rewrittenArguments = VisitArgumentsAndCaptureReceiverIfNeeded(
622rewrittenIndexerAccess = (BoundExpression)VisitArrayAccess((BoundArrayAccess)node.IndexerOrSliceAccess);
642private BoundExpression MakePatternIndexOffsetExpression(
643BoundExpression? loweredExpr,
644BoundExpression? lengthAccess,
705private BoundExpression DetermineMakePatternIndexOffsetExpressionStrategy(
706BoundExpression unloweredExpr,
755private BoundExpression VisitRangePatternIndexerAccess(BoundImplicitIndexerAccess node)
759var sideEffectsBuilder = ArrayBuilder<BoundExpression>.GetInstance();
761var rewrittenIndexerAccess = VisitRangePatternIndexerAccess(node, localsBuilder, sideEffectsBuilder, cacheAllArgumentsOnly: false);
769private BoundExpression VisitRangePatternIndexerAccess(BoundImplicitIndexerAccess node, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder, bool cacheAllArgumentsOnly)
789var receiver = VisitExpression(node.Receiver);
790var rangeArg = node.Argument;
793BoundExpression? startMakeOffsetInput, endMakeOffsetInput, rewrittenRangeArg;
815var argumentsBuilder = ArrayBuilder<BoundExpression>.GetInstance(2);
851BoundExpression startExpr;
852BoundExpression rangeSizeExpr;
943BoundExpression? lengthAccess = null;
960BoundExpression endExpr = MakePatternIndexOffsetExpression(endMakeOffsetInput, lengthAccess, endStrategy);
987var rewrittenIndexerAccess = VisitExpression(sliceCall);
996private BoundExpression MakeRangeSize(ref BoundExpression startExpr, BoundExpression endExpr, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder)
1000BoundExpression rangeSizeExpr;
1027private void DeconstructRange(BoundExpression rewrittenRangeArg, BoundExpression lengthAccess, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder, out BoundExpression startExpr, out BoundExpression rangeSizeExpr)
1068private void RewriteRangeParts(BoundExpression rangeArg, out BoundRangeExpression? rangeExpr, out BoundExpression? startMakeOffsetInput, out PatternIndexOffsetLoweringStrategy startStrategy, out BoundExpression? endMakeOffsetInput, out PatternIndexOffsetLoweringStrategy endStrategy, out BoundExpression? rewrittenRangeArg)
1091if (rangeExpr.LeftOperandOpt is BoundExpression left)
1101if (rangeExpr.RightOperandOpt is BoundExpression right)
Lowering\LocalRewriter\LocalRewriter_NullCoalescingAssignmentOperator.cs (13)
19var stores = ArrayBuilder<BoundExpression>.GetInstance();
23BoundExpression transformedLHS = TransformCompoundAssignmentLHS(node.LeftOperand, isRegularCompoundAssignment: false, stores, temps, node.LeftOperand.HasDynamicType());
25var lhsRead = MakeRValue(transformedLHS);
26BoundExpression loweredRight = VisitExpression(node.RightOperand);
32BoundExpression rewriteNullCoalscingAssignmentStandard()
42BoundExpression assignment = MakeAssignmentOperator(syntax, transformedLHS, loweredRight, used: true, isChecked: false, isCompoundAssignment: false);
46BoundExpression conditionalExpression = MakeNullCoalescingOperator(syntax, lhsRead, assignment, leftPlaceholder: leftPlaceholder, leftConversion: leftPlaceholder, BoundNullCoalescingOperatorResultKind.LeftType, node.LeftOperand.Type);
61BoundExpression rewriteNullCoalescingAssignmentForValueType()
70var leftOperand = node.LeftOperand;
110var tmpAssignment = MakeAssignmentOperator(node.Syntax, tmp, loweredRight, used: true, isChecked: false, isCompoundAssignment: false);
116var transformedLhsAssignment =
129var alternative = _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, ImmutableArray.Create(tmpAssignment, transformedLhsAssignment), tmp);
132var 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;
199ImmutableArray<BoundExpression> getAnonymousTypeValues(BoundWithExpression withExpr, BoundExpression oldValue, AnonymousTypeManager.AnonymousTypePublicSymbol anonymousType,
200ArrayBuilder<BoundExpression> sideEffects, ArrayBuilder<LocalSymbol> temps)
203var valueTemps = ArrayBuilder<BoundExpression?>.GetInstance(anonymousType.Properties.Length, fillWithValue: null);
205foreach (BoundExpression initializer in withExpr.InitializerExpression.Initializers)
212var rewrittenRight = VisitExpression(assignment.Right);
222var builder = ArrayBuilder<BoundExpression>.GetInstance(anonymousType.Properties.Length);
225if (valueTemps[property.MemberIndexOpt!.Value] is BoundExpression initializerValue)
255private BoundExpression MakeExpressionWithInitializer(
257BoundExpression rewrittenExpression,
258BoundExpression initializerExpression,
269ArrayBuilder<BoundExpression>? dynamicSiteInitializers = null;
271ArrayBuilder<BoundExpression>? loweredInitializers = ArrayBuilder<BoundExpression>.GetInstance();
276var sideEffects = ArrayBuilder<BoundExpression>.GetInstance(1 + dynamicSiteCount + loweredInitializers.Count);
314var rewrittenNewT = MakeNewT(node.Syntax, (TypeParameterSymbol)node.Type);
323private BoundExpression MakeNewT(SyntaxNode syntax, TypeParameterSymbol typeParameter)
350ImmutableArray<BoundExpression>.Empty,
380BoundExpression newGuid;
389newGuid = new BoundBadExpression(node.Syntax, LookupResultKind.NotCreatable, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, ErrorTypeSymbol.UnknownResultType);
399BoundExpression callGetTypeFromCLSID;
407callGetTypeFromCLSID = new BoundBadExpression(node.Syntax, LookupResultKind.OverloadResolutionFailure, ImmutableArray<Symbol?>.Empty, ImmutableArray<BoundExpression>.Empty, ErrorTypeSymbol.UnknownResultType);
411BoundExpression rewrittenObjectCreation;
419rewrittenObjectCreation = 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 (34)
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)
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();
229static void pushArguments(LocalRewriter self, BoundBinaryOperator binaryOperator, ArrayBuilder<BoundExpression> arguments, ref WellKnownConcatRelatedMethods concatMethods)
253static bool shouldRecurse(BoundExpression expr, [NotNullWhen(true)] out BoundBinaryOperator? binaryOperator)
278private void VisitAndAddConcatArgumentInReverseOrder(BoundExpression argument, bool argumentAlreadyVisited, ArrayBuilder<BoundExpression> finalArguments, ref WellKnownConcatRelatedMethods wellKnownConcatOptimizationMethods)
301else if (wellKnownConcatOptimizationMethods.IsCharToString(call, out var charExpression))
366public bool IsWellKnownConcatMethod(BoundCall call, out ImmutableArray<BoundExpression> arguments)
394public bool IsCharToString(BoundCall call, [NotNullWhen(true)] out BoundExpression? charExpression)
416private readonly bool IsConcatNonArray(BoundCall call, ref MethodSymbol? concatMethod, SpecialMember concatSpecialMember, out ImmutableArray<BoundExpression> arguments)
461private static BoundExpression RewriteStringConcatenationWithSpanBasedConcat(
467ArrayBuilder<BoundExpression> args)
473BoundExpression? arg = args[i];
529private BoundExpression RewriteStringConcatInExpressionLambda(BoundBinaryOperator original)
550BoundExpression currentResult = VisitExpression(stack.Peek().Left);
554var right = VisitExpression(current.Right);
574private BoundExpression ConvertConcatExprToString(BoundExpression expr)
687ImmutableArray.Create<BoundExpression>(store),
691BoundExpression makeConditionalAccess(BoundExpression receiver)
710static bool isFieldOfMarshalByRef(BoundExpression expr, CSharpCompilation compilation)
Lowering\LocalRewriter\LocalRewriter_StringInterpolation.cs (20)
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;
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];
98private BoundExpression PushDownImplicitTupleConversion(
99BoundExpression expr,
100ArrayBuilder<BoundExpression> initEffects,
112var fieldAccessorsBuilder = ArrayBuilder<BoundExpression>.GetInstance(numElements);
113var savedTuple = DeferSideEffectingArgumentToTempForTupleEquality(LowerConversions(boundConversion.Operand), initEffects, temps);
119var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(savedTuple, syntax, srcElementFields[i]);
138private BoundExpression ReplaceTerminalElementsWithTemps(
139BoundExpression expr,
141ArrayBuilder<BoundExpression> initEffects,
152var builder = ArrayBuilder<BoundExpression>.GetInstance(tuple.Arguments.Length);
155var argument = tuple.Arguments[i];
156var newArgument = ReplaceTerminalElementsWithTemps(argument, multiple.Operators[i], initEffects, temps);
177/// That resulting expression must be passed through <see cref="LowerConversions(BoundExpression)"/> to
180private BoundExpression DeferSideEffectingArgumentToTempForTupleEquality(
181BoundExpression expr,
182ArrayBuilder<BoundExpression> effects,
202var deferredOperand = DeferSideEffectingArgumentToTempForTupleEquality(conv.Operand, effects, temps, conv.ExplicitCastInCode || enclosingConversionWasExplicit);
209var deferredOperand = DeferSideEffectingArgumentToTempForTupleEquality(
245private BoundExpression RewriteTupleOperator(TupleBinaryOperatorInfo @operator,
246BoundExpression left, BoundExpression right, TypeSymbol boolType,
266private BoundExpression RewriteTupleNestedOperators(TupleBinaryOperatorInfo.Multiple operators, BoundExpression left, BoundExpression right,
288var outerEffects = ArrayBuilder<BoundExpression>.GetInstance();
289var innerEffects = ArrayBuilder<BoundExpression>.GetInstance();
291BoundExpression leftHasValue, leftValue;
295BoundExpression rightHasValue, rightValue;
302BoundExpression logicalExpression = RewriteNonNullableNestedTupleOperators(operators, leftValue, rightValue, boolType, temps, operatorKind);
308BoundExpression innerSequence = _factory.Sequence(locals: ImmutableArray<LocalSymbol>.Empty, innerEffects.ToImmutableAndFree(), logicalExpression);
338BoundExpression outerSequence =
353private void MakeNullableParts(BoundExpression expr, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> innerEffects,
354ArrayBuilder<BoundExpression> outerEffects, bool saveHasValue, out BoundExpression hasValue, out BoundExpression value, out bool isNullable)
376if (NullableAlwaysHasValue(expr) is BoundExpression knownValue)
395BoundExpression makeNullableHasValue(BoundExpression expr)
416private BoundLocal MakeTemp(BoundExpression loweredExpression, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> effects)
427private BoundExpression MakeValueOrDefaultTemp(
428BoundExpression expr,
430ArrayBuilder<BoundExpression> effects)
442var operand = MakeValueOrDefaultTemp(o, temps, effects);
449var argumentBuilder = ArrayBuilder<BoundExpression>.GetInstance(tupleCardinality);
467BoundExpression valueOrDefaultCall = MakeOptimizedGetValueOrDefault(expr.Syntax, expr);
472BoundExpression MakeBoundConversion(BoundExpression expr, Conversion conversion, TypeWithAnnotations type, BoundConversion enclosing)
484private BoundExpression RewriteNonNullableNestedTupleOperators(TupleBinaryOperatorInfo.Multiple operators,
485BoundExpression left, BoundExpression right, TypeSymbol type,
490BoundExpression? currentResult = null;
493BoundExpression leftElement = GetTuplePart(left, i);
494BoundExpression rightElement = GetTuplePart(right, i);
495BoundExpression nextLogicalOperand = RewriteTupleOperator(nestedOperators[i], leftElement, rightElement, type, temps, operatorKind);
515private BoundExpression GetTuplePart(BoundExpression tuple, int i)
541private BoundExpression RewriteTupleSingleOperator(TupleBinaryOperatorInfo.Single single,
542BoundExpression left, BoundExpression right, TypeSymbol boolType, BinaryOperatorKind operatorKind)
555BoundExpression dynamicResult = _dynamicFactory.MakeDynamicBinaryOperator(single.Kind, left, right, isCompoundAssignment: false, _compilation.DynamicType).ToExpression();
572BoundExpression binary = MakeBinaryOperator(_factory.Syntax, single.Kind, left, right, single.MethodSymbolOpt?.ReturnType ?? boolType, single.MethodSymbolOpt, single.ConstrainedToTypeOpt);
575BoundExpression result;
576BoundExpression convertedBinary = ApplyConversionIfNotIdentity(single.ConversionForBool, single.ConversionForBoolPlaceholder, binary);
606private 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 (98)
58BoundExpression loweredOperand = VisitExpression(node.Operand);
62private BoundExpression MakeUnaryOperator(
67BoundExpression loweredOperand,
73private BoundExpression MakeUnaryOperator(
79BoundExpression loweredOperand,
139var newOperand = MakeConversionNode(loweredOperand, upconvertType, false);
178private BoundExpression LowerLiftedUnaryOperator(
183BoundExpression loweredOperand,
189BoundExpression? optimized = OptimizeLiftedUnaryOperator(kind, syntax, method, constrainedToTypeOpt, loweredOperand, type);
207BoundExpression condition = _factory.MakeNullableHasValue(syntax, boundTemp);
210BoundExpression call_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTemp, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefault);
213BoundExpression consequence = GetLiftedUnaryOperatorConsequence(kind, syntax, method, constrainedToTypeOpt, type, call_GetValueOrDefault);
216BoundExpression alternative = new BoundDefaultExpression(syntax, type);
221BoundExpression conditionalExpression = RewriteConditionalOperator(
237sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
242private BoundExpression? OptimizeLiftedUnaryOperator(
247BoundExpression loweredOperand,
259BoundExpression? neverNull = NullableAlwaysHasValue(loweredOperand);
275var result = LowerLiftedUnaryOperator(operatorKind, syntax, method, constrainedToTypeOpt, conditionalLeft!.WhenNotNull, type);
353private BoundExpression GetLiftedUnaryOperatorConsequence(UnaryOperatorKind kind, SyntaxNode syntax, MethodSymbol? method, TypeSymbol? constrainedToTypeOpt, TypeSymbol type, BoundExpression nonNullOperand)
358BoundExpression unliftedOp = MakeUnaryOperator(
368BoundExpression consequence = new BoundObjectCreationExpression(
392private BoundExpression VisitIncrementOperator(BoundIncrementOperator node, bool used)
404private BoundExpression VisitInstanceIncrementOperator(BoundIncrementOperator node, bool used)
442private BoundExpression MakeInstanceCompoundAssignmentOperatorResult(SyntaxNode syntax, BoundExpression left, BoundExpression? rightOpt, MethodSymbol operatorMethod, bool isChecked)
448ArrayBuilder<BoundExpression> tempInitializers = ArrayBuilder<BoundExpression>.GetInstance();
452BoundExpression transformedLHS = TransformCompoundAssignmentLHS(left, isRegularCompoundAssignment: true, tempInitializers, tempSymbols, isDynamicAssignment: false);
468BoundExpression assignBack = makeAssignmentBack(syntax, transformedLHS, boundTemp, isChecked);
484BoundExpression assignBack = makeAssignmentBack(syntax, transformedLHS, boundTemp, isChecked);
487var isNotClass = _factory.IsNotNullReference(_factory.Default(operandType));
509static BoundCall makeIncrementCall(SyntaxNode syntax, BoundLocal boundTemp, BoundExpression? rightOpt, MethodSymbol operatorMethod)
514BoundExpression makeAssignmentBack(SyntaxNode syntax, BoundExpression transformedLHS, BoundLocal boundTemp, bool isChecked)
558public BoundExpression VisitBuiltInOrStaticIncrementOperator(BoundIncrementOperator node)
565ArrayBuilder<BoundExpression> tempInitializers = ArrayBuilder<BoundExpression>.GetInstance();
571BoundExpression transformedLHS = TransformCompoundAssignmentLHS(node.Operand, isRegularCompoundAssignment: true, tempInitializers, tempSymbols, isDynamic);
580BoundExpression boundTemp = new BoundLocal(
588var newValue = makeBuiltInOrStaticIncrementOperator(node, rewrittenValueToIncrement: (isPrefix ? MakeRValue(transformedLHS) : boundTemp));
617static bool isIndirectOrInstanceField(BoundExpression expression)
635BoundExpression rewriteWithNotRefOperand(
639ArrayBuilder<BoundExpression> tempInitializers,
641BoundExpression transformedLHS,
642BoundExpression boundTemp,
643BoundExpression newValue)
649ImmutableArray<BoundExpression> assignments = ImmutableArray.Create<BoundExpression>(
663BoundExpression rewriteWithRefOperand(
667ArrayBuilder<BoundExpression> tempInitializers,
669BoundExpression operand,
670BoundExpression boundTemp,
671BoundExpression newValue)
675var tempValue = isPrefix ? newValue : MakeRValue(operand);
677var tempAssignment = MakeAssignmentOperator(syntax, boundTemp, tempValue, used: false, isChecked: isChecked, isCompoundAssignment: false);
679var operandValue = isPrefix ? boundTemp : newValue;
683ImmutableArray.Create<BoundExpression>(tempAssignment),
689BoundExpression operandAssignment = MakeAssignmentOperator(syntax, operand, tempAssignedAndOperandValue, used: false, isChecked: isChecked, isCompoundAssignment: false);
702BoundExpression makeBuiltInOrStaticIncrementOperator(BoundIncrementOperator node, BoundExpression rewrittenValueToIncrement)
709BoundExpression result;
728private BoundExpression ApplyConversionIfNotIdentity(BoundExpression? conversion, BoundValuePlaceholder? placeholder, BoundExpression replacement)
739static bool hasNonIdentityConversion([NotNullWhen(true)] BoundExpression? expression)
755private BoundExpression ApplyConversion(BoundExpression conversion, BoundValuePlaceholder placeholder, BoundExpression replacement)
763private BoundExpression MakeUserDefinedStaticIncrementOperator(BoundIncrementOperator node, BoundExpression rewrittenValueToIncrement)
780BoundExpression rewrittenArgument = ApplyConversionIfNotIdentity(node.OperandConversion, node.OperandPlaceholder, rewrittenValueToIncrement);
808BoundExpression condition = _factory.MakeNullableHasValue(node.Syntax, boundTemp);
811BoundExpression call_GetValueOrDefault = BoundCall.Synthesized(syntax, boundTemp, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefault);
814BoundExpression userDefinedCall = BoundCall.Synthesized(
822BoundExpression consequence = new BoundObjectCreationExpression(syntax, ctor, userDefinedCall);
825BoundExpression alternative = new BoundDefaultExpression(syntax, type);
830BoundExpression conditionalExpression = RewriteConditionalOperator(
846sideEffects: ImmutableArray.Create<BoundExpression>(tempAssignment),
851private BoundExpression MakeBuiltInIncrementOperator(BoundIncrementOperator node, BoundExpression rewrittenValueToIncrement)
853BoundExpression result;
880BoundExpression boundOne = MakeLiteral(
893BoundExpression binaryOperand = rewrittenValueToIncrement;
919BoundExpression binOp;
957private BoundExpression MakeDecimalIncDecOperator(SyntaxNode syntax, BinaryOperatorKind oper, BoundExpression operand)
964private BoundExpression MakeLiftedDecimalIncDecOperator(SyntaxNode syntax, BinaryOperatorKind oper, BoundExpression operand)
974BoundExpression condition = _factory.MakeNullableHasValue(syntax, operand);
976BoundExpression getValueCall = BoundCall.Synthesized(syntax, operand, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, getValueOrDefault);
978BoundExpression methodCall = BoundCall.Synthesized(syntax, receiverOpt: null, initialBindingReceiverIsSubjectToCloning: ThreeState.Unknown, method, getValueCall);
980BoundExpression consequence = new BoundObjectCreationExpression(syntax, ctor, methodCall);
982BoundExpression alternative = new BoundDefaultExpression(syntax, operand.Type);
993private BoundExpression MakeRValue(BoundExpression transformedExpression)
Lowering\LocalRewriter\LoweredDynamicOperationFactory.cs (67)
73BoundExpression loweredOperand,
99var binderConstruction = MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__Convert, new[]
116BoundExpression loweredOperand,
132var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__UnaryOperation, new[]
152BoundExpression loweredLeft,
153BoundExpression loweredRight,
172var loweredArguments = ImmutableArray.Create<BoundExpression>(loweredLeft, loweredRight);
175var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__BinaryOperation, new[]
195BoundExpression loweredReceiver,
197ImmutableArray<BoundExpression> loweredArguments,
238var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__InvokeMember, new[]
263BoundExpression loweredReceiver,
264BoundExpression loweredHandler)
270var loweredArguments = ImmutableArray<BoundExpression>.Empty;
274var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__InvokeMember, new[]
296BoundExpression loweredReceiver,
297ImmutableArray<BoundExpression> loweredArguments,
317var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__Invoke, new[]
335ImmutableArray<BoundExpression> loweredArguments,
341var loweredReceiver = _factory.Typeof(type, _factory.WellKnownType(WellKnownType.System_Type));
344var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__InvokeConstructor, new[]
360BoundExpression loweredReceiver,
372var loweredArguments = ImmutableArray<BoundExpression>.Empty;
376var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__GetMember, new[]
395BoundExpression loweredReceiver,
397BoundExpression loweredRight,
414var loweredArguments = ImmutableArray<BoundExpression>.Empty;
417var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__SetMember, new[]
436BoundExpression loweredReceiver,
437ImmutableArray<BoundExpression> loweredArguments,
446var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__GetIndex, new[]
462BoundExpression loweredReceiver,
463ImmutableArray<BoundExpression> loweredArguments,
466BoundExpression loweredRight,
485var binderConstruction = ((object)argumentInfoFactory != null) ? MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__SetIndex, new[]
500internal LoweredDynamicOperation MakeDynamicIsEventTest(string name, BoundExpression loweredReceiver)
504var binderConstruction = MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__IsEvent, new[]
516return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, ImmutableArray<BoundExpression>.Empty, default(ImmutableArray<RefKind>), null, resultType);
524private BoundExpression? MakeBinderConstruction(WellKnownMember factoryMethod, BoundExpression[] args)
542internal RefKind GetReceiverRefKind(BoundExpression loweredReceiver)
558internal BoundExpression MakeCallSiteArgumentInfos(
560ImmutableArray<BoundExpression> loweredArguments,
563BoundExpression? loweredReceiver = null,
566BoundExpression? loweredRight = null)
573var infos = new BoundExpression[(loweredReceiver != null ? 1 : 0) + loweredArguments.Length + (loweredRight != null ? 1 : 0)];
599BoundExpression? binderConstruction,
600BoundExpression? loweredReceiver,
602ImmutableArray<BoundExpression> loweredArguments,
604BoundExpression? loweredRight,
649var nullCallSite = _factory.Null(callSiteField.Type);
651var siteInitialization = _factory.Conditional(
670private ImmutableArray<LocalSymbol> MakeTempsForDiscardArguments(ref ImmutableArray<BoundExpression> loweredArguments)
719BoundExpression? loweredReceiver,
721ImmutableArray<BoundExpression> loweredArguments,
723BoundExpression? loweredRight,
798private BoundExpression GetArgumentInfo(
800BoundExpression boundArgument,
873private static ImmutableArray<BoundExpression> GetCallSiteArguments(BoundExpression callSiteFieldAccess, BoundExpression? receiver, ImmutableArray<BoundExpression> arguments, BoundExpression? right)
875var result = new BoundExpression[1 + (receiver != null ? 1 : 0) + arguments.Length + (right != null ? 1 : 0)];
896private 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)
583private ImmutableArray<BoundExpression> VisitExpressionList(
585ImmutableArray<BoundExpression> args,
629var result = ArrayBuilder<BoundExpression>.GetInstance(newList.Length);
635var replacement = Spill(builder, newList[i], refKind, sideEffectsOnly);
666var expression = VisitExpression(ref builder, node.Expression);
673BoundExpression expression = VisitExpression(ref builder, node.ExpressionOpt);
680BoundExpression expr = VisitExpression(ref builder, node.Expression);
689var condition = VisitExpression(ref builder, node.Condition);
696var expression = VisitExpression(ref builder, node.ExpressionOpt);
703var expression = VisitExpression(ref builder, node.Expression);
709BoundExpression exceptionSourceOpt = (BoundExpression)this.Visit(node.ExceptionSourceOpt);
715var exceptionFilterOpt = VisitExpression(ref builder, node.ExceptionFilterOpt);
745var expr = VisitExpression(ref builder, node.Expression);
758var value = VisitExpression(ref builder, node.Value);
765var expr = VisitExpression(ref builder, node.Operand);
779var expression = VisitExpression(ref builder, node.Expression);
809ImmutableArray<BoundExpression> bounds;
836BoundExpression count = VisitExpression(ref builder, node.Count);
844var expression = VisitExpression(ref builder, node.Expression);
851var operand = VisitExpression(ref builder, node.Operand);
860var right = VisitExpression(ref builder, node.Right);
862BoundExpression left = node.Left;
891var expression = VisitExpression(ref leftBuilder, arrayAccess.Expression);
917BoundExpression fieldWithSpilledReceiver(BoundFieldAccess field, ref BoundSpillSequenceBuilder leftBuilder, bool isAssignmentTarget)
923BoundExpression receiver;
938var expression = VisitExpression(ref leftBuilder, arrayAccess.Expression);
983var right = VisitExpression(ref builder, node.Right);
984BoundExpression left;
1021BoundExpression receiver = null;
1071private static RefKind ReceiverSpillRefKind(BoundExpression receiver)
1087BoundExpression invokedExpression;
1107var condition = VisitExpression(ref conditionBuilder, node.Condition);
1110var consequence = VisitExpression(ref consequenceBuilder, node.Consequence);
1113var alternative = VisitExpression(ref alternativeBuilder, node.Alternative);
1183var operand = VisitExpression(ref builder, node.Operand);
1192var expression = VisitExpression(ref builder, node.Expression);
1208var argument = VisitExpression(ref builder, node.Argument);
1215var receiver = VisitExpression(ref builder, node.ReceiverOpt);
1222var operand = VisitExpression(ref builder, node.Operand);
1229var operand = VisitExpression(ref builder, node.Operand);
1238var right = VisitExpression(ref builder, node.RightOperand);
1239BoundExpression left;
1268var receiver = VisitExpression(ref receiverBuilder, node.Receiver);
1271var whenNotNull = VisitExpression(ref whenNotNullBuilder, node.WhenNotNull);
1274var whenNullOpt = VisitExpression(ref whenNullBuilder, node.WhenNullOpt);
1285BoundExpression condition;
1310var isNotClass = _F.IsNotNullReference(_F.Default(receiver.Type));
1354private readonly BoundExpression _receiver;
1362private ConditionalReceiverReplacer(BoundExpression receiver, int receiverId, int recursionDepth)
1369public static BoundStatement Replace(BoundNode node, BoundExpression receiver, int receiverID, int recursionDepth)
1423var index = VisitExpression(ref builder, node.Index);
1424BoundExpression expression;
1444var operand = VisitExpression(ref builder, node.Operand);
1451var value = VisitExpression(ref valueBuilder, node.Value);
1477BoundExpression operand = VisitExpression(ref builder, node.Expression);
1507BoundExpression operand = VisitExpression(ref builder, node.Operand);
1514BoundExpression operand = VisitExpression(ref builder, node.Operand);
1521BoundExpression 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);
67private readonly BoundExpression _replacement;
70public CapturedToExpressionSymbolReplacement(BoundExpression replacement, ImmutableArray<StateMachineFieldSymbol> hoistedFields, bool isReusable)
77public override BoundExpression Replacement<TArg>(SyntaxNode node, Func<NamedTypeSymbol, TArg, BoundExpression> makeFrame, TArg arg)
Lowering\StateMachineRewriter\MethodToStateMachineRewriter.cs (20)
149BoundExpression thisProxyReplacement = thisProxy.Replacement(F.Syntax, static (frameType, F) => F.This(), F);
204protected override BoundExpression FramePointer(SyntaxNode syntax, NamedTypeSymbol frameClass)
344var variableCleanup = ArrayBuilder<BoundExpression>.GetInstance();
434private void AddVariableCleanup(ArrayBuilder<BoundExpression> cleanup, FieldSymbol field)
448var variableCleanup = ArrayBuilder<BoundExpression>.GetInstance();
508private BoundExpression HoistRefInitialization(LocalSymbol local, BoundAssignmentOperator node)
529var right = (BoundExpression)Visit(node.Right);
531var sideEffects = ArrayBuilder<BoundExpression>.GetInstance();
558var replacement = HoistExpression(right, awaitSyntaxOpt, syntaxOffset, local.RefKind, sideEffects, hoistedFields, ref needsSacrificialEvaluation);
581private BoundExpression HoistExpression(
582BoundExpression expr,
586ArrayBuilder<BoundExpression> sideEffects,
595BoundExpression expression = HoistExpression(array.Expression, awaitSyntaxOpt, syntaxOffset, RefKind.None, sideEffects, hoistedFields, ref needsSacrificialEvaluation);
596var indices = ArrayBuilder<BoundExpression>.GetInstance();
597foreach (var index in array.Indices)
623var receiver = HoistExpression(field.ReceiverOpt, awaitSyntaxOpt, syntaxOffset,
830BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
954var fetchThis = proxy.Replacement(F.Syntax, static (frameType, F) => F.This(), F);
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)
642public BoundBinaryOperator Binary(BinaryOperatorKind kind, TypeSymbol type, BoundExpression left, BoundExpression right)
647public BoundAsOperator As(BoundExpression operand, TypeSymbol type)
652public BoundIsOperator Is(BoundExpression operand, TypeSymbol type)
661public BoundBinaryOperator LogicalAnd(BoundExpression left, BoundExpression right)
668public BoundBinaryOperator LogicalOr(BoundExpression left, BoundExpression right)
675public BoundBinaryOperator IntEqual(BoundExpression left, BoundExpression right)
680public BoundBinaryOperator ObjectEqual(BoundExpression left, BoundExpression right)
685public BoundExpression IsNotNullReference(BoundExpression value)
691public BoundBinaryOperator ObjectNotEqual(BoundExpression left, BoundExpression right)
696public BoundBinaryOperator IntNotEqual(BoundExpression left, BoundExpression right)
701public BoundBinaryOperator IntLessThan(BoundExpression left, BoundExpression right)
706public BoundBinaryOperator IntGreaterThanOrEqual(BoundExpression left, BoundExpression right)
711public BoundBinaryOperator IntSubtract(BoundExpression left, BoundExpression right)
716public BoundBinaryOperator IntMultiply(BoundExpression left, BoundExpression right)
744public BoundObjectCreationExpression New(NamedTypeSymbol type, params BoundExpression[] args)
750public BoundObjectCreationExpression New(MethodSymbol ctor, params BoundExpression[] args)
753public BoundObjectCreationExpression New(NamedTypeSymbol type, ImmutableArray<BoundExpression> args)
759public BoundObjectCreationExpression New(MethodSymbol ctor, ImmutableArray<BoundExpression> args)
762public BoundObjectCreationExpression New(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKinds)
777public BoundObjectCreationExpression New(WellKnownMember wm, ImmutableArray<BoundExpression> args)
783public BoundExpression MakeIsNotANumberTest(BoundExpression input)
798public BoundExpression StaticCall(TypeSymbol receiver, MethodSymbol method, params BoundExpression[] args)
808public BoundExpression StaticCall(MethodSymbol method, ImmutableArray<BoundExpression> args)
811public BoundExpression StaticCall(WellKnownMember method, params BoundExpression[] args)
819public BoundExpression StaticCall(WellKnownMember method, ImmutableArray<TypeSymbol> typeArgs, params BoundExpression[] args)
830public BoundExpression StaticCall(SpecialMember method, params BoundExpression[] args)
837public BoundCall Call(BoundExpression? receiver, MethodSymbol method)
839return Call(receiver, method, ImmutableArray<BoundExpression>.Empty);
842public BoundCall Call(BoundExpression? receiver, MethodSymbol method, BoundExpression arg0, bool useStrictArgumentRefKinds = false)
847public BoundCall Call(BoundExpression? receiver, MethodSymbol method, BoundExpression arg0, BoundExpression arg1, bool useStrictArgumentRefKinds = false)
852public BoundCall Call(BoundExpression? receiver, MethodSymbol method, params BoundExpression[] args)
854return Call(receiver, method, ImmutableArray.Create<BoundExpression>(args));
857public BoundCall Call(BoundExpression? receiver, WellKnownMember method, BoundExpression arg0)
860public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<BoundExpression> args, bool useStrictArgumentRefKinds = false)
902public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<RefKind> refKinds, ImmutableArray<BoundExpression> args)
912public BoundExpression Conditional(BoundExpression condition, BoundExpression consequence, BoundExpression alternative, TypeSymbol type, bool isRef = false)
917public BoundComplexConditionalReceiver ComplexConditionalReceiver(BoundExpression valueTypeReceiver, BoundExpression referenceTypeReceiver)
924public BoundExpression Coalesce(BoundExpression left, BoundExpression right)
932public BoundStatement If(BoundExpression condition, BoundStatement thenClause, BoundStatement? elseClauseOpt = null)
937public BoundStatement ConditionalGoto(BoundExpression condition, LabelSymbol label, bool jumpIfTrue)
942public BoundStatement If(BoundExpression condition, ImmutableArray<LocalSymbol> locals, BoundStatement thenClause, BoundStatement? elseClauseOpt = null)
993public BoundThrowStatement Throw(BoundExpression e)
1003public BoundExpression MakeSequence(LocalSymbol temp, params BoundExpression[] parts)
1008public BoundExpression MakeSequence(params BoundExpression[] parts)
1013public BoundExpression MakeSequence(ImmutableArray<LocalSymbol> locals, params BoundExpression[] parts)
1015var builder = ArrayBuilder<BoundExpression>.GetInstance();
1018var part = parts[i];
1024var lastExpression = parts[parts.Length - 1];
1035public BoundSequence Sequence(BoundExpression[] sideEffects, BoundExpression result, TypeSymbol? type = null)
1042public BoundExpression Sequence(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression result)
1051public BoundSpillSequence SpillSequence(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression result)
1081public BoundStatement Switch(BoundExpression ex, ImmutableArray<SyntheticSwitchSection> sections)
1176public BoundArrayLength ArrayLength(BoundExpression array)
1182public BoundArrayAccess ArrayAccessFirstElement(BoundExpression array)
1186ImmutableArray<BoundExpression> firstElementIndices = ArrayBuilder<BoundExpression>.GetInstance(rank, Literal(0)).ToImmutableAndFree();
1190public BoundArrayAccess ArrayAccess(BoundExpression array, params BoundExpression[] indices)
1195public BoundArrayAccess ArrayAccess(BoundExpression array, ImmutableArray<BoundExpression> indices)
1230public BoundExpression ThrowExpression(BoundExpression thrown, TypeSymbol type)
1235public BoundExpression Null(TypeSymbol type)
1241public BoundExpression NullRef(TypeWithAnnotations type)
1247public static BoundExpression Null(TypeSymbol type, SyntaxNode syntax)
1250BoundExpression nullLiteral = new BoundLiteral(syntax, ConstantValue.Null, type) { WasCompilerGenerated = true };
1261public BoundExpression Typeof(WellKnownType type, TypeSymbol systemType)
1266public BoundExpression Typeof(TypeSymbol type, TypeSymbol systemType)
1292public BoundExpression Typeof(TypeWithAnnotations type, TypeSymbol systemType)
1297public ImmutableArray<BoundExpression> TypeOfs(ImmutableArray<TypeWithAnnotations> typeArguments, TypeSymbol systemType)
1302public BoundExpression TypeofDynamicOperationContextType()
1308public BoundExpression Sizeof(TypeSymbol type)
1313internal BoundExpression ConstructorInfo(MethodSymbol ctor)
1331public BoundExpression MethodDefIndex(MethodSymbol method)
1340public BoundExpression LocalId(LocalSymbol symbol)
1350public BoundExpression ParameterId(ParameterSymbol symbol)
1360public BoundExpression StateMachineInstanceId()
1372public BoundExpression ModuleVersionId()
1377public BoundExpression ModuleVersionIdString()
1382public BoundExpression InstrumentationPayloadRoot(int analysisKind, TypeSymbol payloadType)
1387public BoundExpression ThrowIfModuleCancellationRequested()
1390public BoundExpression ModuleCancellationToken()
1393public BoundExpression MaximumMethodDefIndex()
1404public BoundExpression SourceDocumentIndex(Cci.DebugSourceDocument document)
1413public BoundExpression MethodInfo(MethodSymbol method, TypeSymbol systemReflectionMethodInfo)
1438public BoundExpression FieldInfo(FieldSymbol field)
1480public BoundExpression Convert(TypeSymbol type, BoundExpression arg, bool allowBoxingByRefLikeTypeParametersToObject = false)
1510public BoundExpression Convert(TypeSymbol type, BoundExpression arg, Conversion conversion, bool isChecked = false)
1537public BoundExpression ArrayOrEmpty(TypeSymbol elementType, BoundExpression[] elements)
1549public BoundExpression ArrayOrEmpty(TypeSymbol elementType, ImmutableArray<BoundExpression> elements)
1564public BoundExpression Array(TypeSymbol elementType, ImmutableArray<BoundExpression> elements)
1568ImmutableArray.Create<BoundExpression>(Literal(elements.Length)),
1573public BoundExpression Array(TypeSymbol elementType, BoundExpression length)
1577ImmutableArray.Create<BoundExpression>(length),
1583internal BoundExpression Default(TypeSymbol type)
1588internal static BoundExpression Default(TypeSymbol type, SyntaxNode syntax)
1617BoundExpression source,
1628internal BoundExpression NullOrDefault(TypeSymbol typeSymbol)
1633internal static BoundExpression NullOrDefault(TypeSymbol typeSymbol, SyntaxNode syntax)
1638internal BoundExpression Not(BoundExpression expression)
1649BoundExpression argument,
1744internal ImmutableArray<BoundExpression> MakeTempsForDiscardArguments(ImmutableArray<BoundExpression> arguments, ArrayBuilder<LocalSymbol> builder)
1759internal BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
1811internal BoundExpression MakeNullableHasValue(SyntaxNode syntax, BoundExpression expression)
1821internal BoundExpression RewriteNullableNullEquality(
1824BoundExpression loweredLeft,
1825BoundExpression loweredRight,
1843BoundExpression nullable = loweredRight.IsLiteralNull() ? loweredLeft : loweredRight;
1852BoundExpression nonNullValue = LocalRewriter.NullableAlwaysHasValue(nullable);
1863sideEffects: ImmutableArray.Create<BoundExpression>(nonNullValue),
1873BoundExpression whenNotNull = RewriteNullableNullEquality(
1885BoundExpression call = MakeNullableHasValue(syntax, nullable);
1886BoundExpression result = kind == BinaryOperatorKind.NullableNullNotEqual ?
Operations\CSharpOperationFactory.cs (42)
307ConstantValue? constantValue = (boundNode as BoundExpression)?.ConstantValueOpt;
322BoundExpression boundExpr => boundExpr.GetPublicTypeSymbol(),
461private static TypeParameterSymbol? GetConstrainedToType(Symbol targetMember, BoundExpression? receiverOpt)
528return CreateFromArray<BoundExpression, IOperation>(declaredTypeOpt.BoundDimensionsOpt);
534ImmutableArray<BoundExpression> dimensions;
543dimensions = ImmutableArray<BoundExpression>.Empty;
545return CreateFromArray<BoundExpression, IOperation>(dimensions);
750ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundDynamicObjectCreationExpression.Arguments);
779ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundDynamicInvocation.Arguments);
788internal IOperation CreateBoundDynamicIndexerAccessExpressionReceiver(BoundExpression indexer)
803internal ImmutableArray<IOperation> CreateBoundDynamicIndexerAccessArguments(BoundExpression indexer)
808return CreateFromArray<BoundExpression, IOperation>(boundDynamicAccess.Arguments);
812return CreateFromArray<BoundExpression, IOperation>(boundObjectInitializerMember.Arguments);
833ImmutableArray<IOperation> initializers = CreateFromArray<BoundExpression, IOperation>(BoundObjectCreationExpression.GetChildInitializers(boundObjectInitializerExpression));
842ImmutableArray<IOperation> initializers = CreateFromArray<BoundExpression, IOperation>(BoundObjectCreationExpression.GetChildInitializers(boundCollectionInitializerExpression));
950BoundExpression? receiver,
977ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundCollectionElementInitializer.Arguments);
1019BoundExpression boundOperand = boundConversion.Operand;
1099BoundExpression nestedOperand = nestedConversion.Operand;
1206ImmutableArray<IOperation> dimensionSizes = CreateFromArray<BoundExpression, IOperation>(boundArrayCreation.Bounds);
1217ImmutableArray<IOperation> elementValues = CreateFromArray<BoundExpression, IOperation>(boundArrayInitialization.Initializers);
1262Create(Binder.GetUnderlyingCollectionExpressionElement(expr, (BoundExpression)element, throwOnErrors: false));
1267var iteratorItem = element.IteratorBody is { } iteratorBody ?
1296ConstantValue? constantValue = ((BoundExpression)boundDefaultExpression).ConstantValueOpt;
1409var children = CreateFromArray<BoundExpression, IOperation>(boundBadExpression.ChildBoundNodes);
1627ImmutableArray<IOperation> indices = CreateFromArray<BoundExpression, IOperation>(boundArrayAccess.Indices);
1978boundForEachStatement.Expression is not BoundConversion { Conversion.IsIdentity: true, ExplicitCastInCode: false, Operand: BoundExpression operand } ?
2250ImmutableArray<IOperation> elements = CreateFromArray<BoundExpression, IOperation>(boundTupleExpression.Arguments);
2271internal ImmutableArray<IInterpolatedStringContentOperation> CreateBoundInterpolatedStringContentOperation(ImmutableArray<BoundExpression> parts, ImmutableArray<(bool IsLiteral, bool HasAlignment, bool HasFormat)>? positionInfo)
2278foreach (var part in parts)
2304var part = parts[i];
2307BoundExpression value;
2308BoundExpression? alignment;
2309BoundExpression? format;
2377static (BoundExpression Value, BoundExpression? Alignment, BoundExpression? Format) getCallInfo(ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, (bool IsLiteral, bool HasAlignment, bool HasFormat) currentPosition)
2379BoundExpression value = arguments[0];
2389BoundExpression? alignment = alignmentIndex == -1 ? null : arguments[alignmentIndex];
2391BoundExpression? format = formatIndex == -1 ? null : arguments[formatIndex];
2435IOperation 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,