src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\CodeGenerationSymbolFactory.cs (10)
48RefKind refKind,
79ITypeSymbol type, RefKind refKind, ImmutableArray<IPropertySymbol> explicitInterfaceImplementations, string name,
153RefKind refKind,
175RefKind refKind,
265=> CreateParameterSymbol(RefKind.None, type, name);
267public static IParameterSymbol CreateParameterSymbol(RefKind refKind, ITypeSymbol type, string name)
277ImmutableArray<AttributeData> attributes, RefKind refKind, bool isParams, ITypeSymbol type, string name, bool isOptional = false, bool hasDefaultValue = false, object? defaultValue = null)
288RefKind? refKind = null,
392refKind: RefKind.None,
464RefKind refKind,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\CodeGenerationSymbolFactory.cs (10)
48RefKind refKind,
79ITypeSymbol type, RefKind refKind, ImmutableArray<IPropertySymbol> explicitInterfaceImplementations, string name,
153RefKind refKind,
175RefKind refKind,
265=> CreateParameterSymbol(RefKind.None, type, name);
267public static IParameterSymbol CreateParameterSymbol(RefKind refKind, ITypeSymbol type, string name)
277ImmutableArray<AttributeData> attributes, RefKind refKind, bool isParams, ITypeSymbol type, string name, bool isOptional = false, bool hasDefaultValue = false, object? defaultValue = null)
288RefKind? refKind = null,
392refKind: RefKind.None,
464RefKind refKind,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateDeconstructMethodService.State.cs (1)
76refKind: RefKind.None,
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateMethodService.State.cs (1)
254refKind: RefKind.None,
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.cs (8)
147document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None));
161document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None));
175document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None));
223parameter.RefKind is RefKind.Out ||
248private static RefKind GetRefKindFromContext(State state)
252return RefKind.Ref;
256return RefKind.RefReadOnly;
260return RefKind.None;
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.GenerateParameterCodeAction.cs (1)
49RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\CodeGenerationSymbolFactory.cs (10)
48RefKind refKind,
79ITypeSymbol type, RefKind refKind, ImmutableArray<IPropertySymbol> explicitInterfaceImplementations, string name,
153RefKind refKind,
175RefKind refKind,
265=> CreateParameterSymbol(RefKind.None, type, name);
267public static IParameterSymbol CreateParameterSymbol(RefKind refKind, ITypeSymbol type, string name)
277ImmutableArray<AttributeData> attributes, RefKind refKind, bool isParams, ITypeSymbol type, string name, bool isOptional = false, bool hasDefaultValue = false, object? defaultValue = null)
288RefKind? refKind = null,
392refKind: RefKind.None,
464RefKind refKind,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
Binder\Binder.ValueChecks.cs (121)
53Method is { RefKind: not RefKind.None, ReturnType: { } returnType } &&
129public ImmutableArray<RefKind> ArgumentRefKindsOpt;
263public static MethodInvocationInfo FromInlineArrayConversion(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
309public static MethodInvocationInfo FromInlineArrayAccess(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
406internal RefKind RefKind { get; }
408internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
416public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
615if (indexerAccess.Indexer.RefKind != RefKind.None)
638var useSetAccessor = coreValueKind == BindValueKind.Assignable && indexerAccess.Indexer.RefKind != RefKind.Ref;
647ArrayBuilder<RefKind>? refKindsBuilderOpt;
650refKindsBuilderOpt = ArrayBuilder<RefKind>.GetInstance(accessorForDefaultArguments.ParameterCount);
1334if (localSymbol.RefKind == RefKind.RefReadOnly ||
1335(localSymbol.RefKind == RefKind.None && !localSymbol.IsWritableVariable))
1343if (localSymbol.RefKind == RefKind.None)
1375if (localSymbol.RefKind == RefKind.None)
1416if (parameterSymbol.RefKind is RefKind.In or RefKind.RefReadOnlyParameter && RequiresAssignableVariable(valueKind))
1421else if (parameterSymbol.RefKind == RefKind.None && RequiresRefAssignableVariable(valueKind))
1427Debug.Assert(parameterSymbol.RefKind != RefKind.None || !RequiresRefAssignableVariable(valueKind));
1431if (parameterSymbol.RefKind == RefKind.None &&
1435Debug.Assert(backingField.RefKind == RefKind.None);
1440Debug.Assert(backingField.RefKind == RefKind.None);
1530{ RefKind: RefKind.Out, UseUpdatedEscapeRules: true } => SafeContext.ReturnOnly,
1542{ RefKind: RefKind.None } => SafeContext.CurrentMethod,
1544{ HasUnscopedRefAttribute: true, UseUpdatedEscapeRules: true, RefKind: RefKind.Out } => SafeContext.ReturnOnly,
1577Debug.Assert(parameterSymbol.RefKind == RefKind.None || isRefScoped || refSafeToEscape.IsReturnOnly);
1627if ((fieldSymbol.RefKind == RefKind.None ? RequiresAssignableVariable(valueKind) : RequiresRefAssignableVariable(valueKind)) &&
1639case RefKind.None:
1641case RefKind.Ref:
1643case RefKind.RefReadOnly:
1663case RefKind.None:
1666case RefKind.Ref:
1667case RefKind.RefReadOnly:
1687case RefKind.None:
1689case RefKind.Ref:
1690case RefKind.RefReadOnly:
1790if (fieldSymbol.RefKind != RefKind.None)
1814if (fieldSymbol.RefKind != RefKind.None)
1958if (RequiresVariable(valueKind) && methodSymbol.RefKind == RefKind.None)
1973if (RequiresAssignableVariable(valueKind) && methodSymbol.RefKind == RefKind.RefReadOnly)
2004propertySymbol.RefKind == RefKind.None)
2028if (RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.RefReadOnly)
2034var requiresSet = RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.None;
2104var requiresGet = !RequiresAssignmentOnly(valueKind) || propertySymbol.RefKind != RefKind.None;
2369(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2448result.ArgumentRefKindsOpt = [RefKind.None, .. methodInvocationInfo.ArgumentRefKindsOpt];
2535var valid = effectiveRefKind != RefKind.None && isRefEscape ?
2597(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2728var refKind = parameter?.RefKind ?? RefKind.None;
2733if (refKind == RefKind.None &&
2734parameter?.RefKind is RefKind.In or RefKind.RefReadOnlyParameter)
2769if (getArgument.RefKind == RefKind.Ref)
2775if (setArgument.RefKind == RefKind.Ref)
2791return new EscapeArgument(parameter: null, receiver, RefKind.None);
2794var refKind = RefKind.None;
2814ImmutableArray<RefKind> argRefKindsOpt,
2821var refKind = argRefKindsOpt.IsDefault ? RefKind.None : argRefKindsOpt[argIndex];
2824if (refKind == RefKind.Ref && mixableArguments is not null)
2963return parameter.RefKind == RefKind.Ref &&
3034if (refKind != RefKind.None)
3047if (parameter.Type.IsRefLikeOrAllowsRefLikeType() && parameter.RefKind != RefKind.Out && GetParameterValEscapeLevel(parameter) is { } valEscapeLevel)
3054if (parameter.RefKind != RefKind.None && GetParameterRefEscapeLevel(parameter) is { } refEscapeLevel)
3118if (parameter.RefKind != RefKind.None && !parameter.IsThis)
3388Debug.Assert(underlyingParameter.RefKind != RefKind.Out); // Shouldn't get here for a constructor
3398public override RefKind RefKind
3402if (_underlyingParameter.RefKind is not RefKind.None and var underlyingRefKind)
3409return RefKind.None;
3414return RefKind.Ref;
3624Debug.Assert(field.RefKind == RefKind.None ? RequiresAssignableVariable(kind) : RequiresRefAssignableVariable(kind));
3826if (methodSymbol.RefKind == RefKind.None)
3841if (methodSymbol.RefKind == RefKind.None)
3886if (methodSymbol.RefKind == RefKind.None)
3906Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
3911ImmutableArray<RefKind> refKinds;
3914Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
3945conversion.Conversion.Method.RefKind == RefKind.None));
3952unaryMethod.RefKind == RefKind.None));
3959binaryMethod.RefKind == RefKind.None));
3965logicalOperator.LogicalOperator.RefKind == RefKind.None));
3972compoundMethod.RefKind == RefKind.None));
3979incrementMethod.RefKind == RefKind.None));
4112if (methodSymbol.RefKind == RefKind.None)
4131if (indexerSymbol.RefKind == RefKind.None)
4155if (indexerSymbol.RefKind == RefKind.None)
4179if (methodSymbol.RefKind == RefKind.None)
4203Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
4208ImmutableArray<RefKind> refKinds;
4211Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
4226if (signature.RefKind == RefKind.None)
4243if (propertySymbol.RefKind == RefKind.None)
4283conversion.Conversion.Method.RefKind == RefKind.None);
4290unaryMethod.RefKind == RefKind.None));
4297binaryMethod.RefKind == RefKind.None));
4303logicalOperator.LogicalOperator.RefKind == RefKind.None));
4310compoundMethod.RefKind == RefKind.None));
4317incrementMethod.RefKind == RefKind.None));
4539ImmutableArray<RefKind> refKinds;
4622ImmutableArray<RefKind> refKinds;
5015var accessorKind = property.RefKind == RefKind.None ? AccessorKind.Set : AccessorKind.Get;
5278ImmutableArray<RefKind> refKinds;
5403ImmutableArray<RefKind> refKinds;
5710private SignatureOnlyMethodSymbol GetInlineArrayAccessEquivalentSignatureMethod(BoundInlineArrayAccess elementAccess, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5712RefKind resultRefKind;
5713RefKind parameterRefKind;
5724resultRefKind = RefKind.None;
5725parameterRefKind = RefKind.None;
5729resultRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__get_Item ? RefKind.In : RefKind.Ref;
5738resultRefKind = RefKind.None;
5739parameterRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__Slice_Int_Int ? RefKind.In : RefKind.Ref;
5772private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundConversion conversion, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5778private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundExpression inlineArray, TypeSymbol resultType, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5784RefKind parameterRefKind = resultType.OriginalDefinition.Equals(_compilation.GetWellKnownType(WellKnownType.System_ReadOnlySpan_T), TypeCompareKind.AllIgnoreOptions) ? RefKind.In : RefKind.Ref;
5799RefKind.None,
Binder\Binder_Expressions.cs (65)
491if (field is { IsStatic: false, RefKind: RefKind.None, ContainingSymbol: SourceMemberContainerTypeSymbol { PrimaryConstructor: { } primaryConstructor } } &&
503RefKind refKind,
2038private bool IsBadLocalOrParameterCapture(Symbol symbol, TypeSymbol type, RefKind refKind)
2040if (refKind != RefKind.None || type.IsRestrictedType())
2122if (parameter.RefKind != RefKind.None)
2142(parameter.RefKind != RefKind.None || parameter.Type.IsRestrictedType()) &&
2145if (parameter.RefKind != RefKind.None)
2159else if (primaryCtor is { ThisParameter.RefKind: not RefKind.None } &&
2312if (localSymbol.RefKind == RefKind.None && type.IsRestrictedType(ignoreSpanLikeTypes: true))
2618if (thisSymbol is not null && thisSymbol.ContainingSymbol != ContainingMemberOrLambda && thisSymbol.RefKind != RefKind.None)
3172RefKind origRefKind = argumentSyntax.RefOrOutKeyword.Kind().GetRefKind();
3176RefKind refKind = origRefKind == RefKind.None || RefMustBeObeyed(isDelegateCreation, argumentSyntax) ? origRefKind : RefKind.None;
3189if (!hadError && isDelegateCreation && origRefKind != RefKind.None && result.Arguments.Count == 1)
3196var requiredValueKind = origRefKind == RefKind.In ? BindValueKind.ReadonlyRef : BindValueKind.RefOrOut;
3208private BoundExpression BindArgumentValue(BindingDiagnosticBag diagnostics, ArgumentSyntax argumentSyntax, bool allowArglist, RefKind refKind)
3409RefKind refKind)
3417if (refKind != RefKind.None)
3427result.RefKinds.Add(RefKind.None);
3475private BoundExpression BindArgumentExpression(BindingDiagnosticBag diagnostics, ExpressionSyntax argumentExpression, RefKind refKind, bool allowArglist)
3478refKind == RefKind.None ?
3480refKind == RefKind.In ?
3851var argumentRefKindsBuilder = ArrayBuilder<RefKind>.GetInstance(handlerArgumentIndexes.Length);
3861RefKind refKind;
3867refKind = RefKind.None;
3953argumentRefKindsBuilder.Add(refKind == RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
3977private void CheckArgumentRefKind(RefKind argRefKind, BoundExpression argument, int arg, ParameterSymbol parameter,
3989if (argRefKind is RefKind.None or RefKind.In && parameter.RefKind == RefKind.RefReadOnlyParameter)
4001if (argRefKind == RefKind.Ref)
4003if (parameter.RefKind == RefKind.In)
4013else if (argRefKind == RefKind.None && parameter.RefKind == RefKind.RefReadOnlyParameter)
5120if (analyzedArguments.RefKind(i) is (RefKind.Ref or RefKind.Out))
5719ArrayBuilder<RefKind> refKinds,
5892var rhsExpr = initializer.Right.CheckAndUnwrapRefExpression(diagnostics, out RefKind refKind);
5893bool isRef = refKind == RefKind.Ref;
6064ImmutableArray<RefKind> argumentRefKindsOpt = default;
8597extensionMethodArguments.RefKinds.Add(RefKind.None);
8748RefKind returnRefKind,
8832RefKind returnRefKind,
8950RefKind returnRefKind,
9213fieldSymbol.RefKind != RefKind.None)
10218RefKind refKind = analyzedArguments.RefKind(i);
10219if (refKind != RefKind.None)
10318default(ImmutableArray<RefKind>),
10436ImmutableArray<RefKind> argumentRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
10689original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None })
10790original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None } &&
10791original.Parameters[1] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None };
10854getMethod.RefKind == RefKind.None &&
10898RefKind returnRefKind = default,
10922RefKind returnRefKind = default,
10954RefKind returnRefKind = default,
11025RefKind returnRefKind = default,
11491RefKind? returnRefKindOverride = null,
11498var returnRefKind = returnRefKindOverride ?? methodSymbol.RefKind;
11516if (returnsVoid && returnRefKind != RefKind.None)
11530returnRefKind == RefKind.None &&
11532(parameterRefKinds.IsDefault || parameterRefKinds.All(refKind => refKind == RefKind.None)) &&
11566parameterRefKinds.IsDefault ? RefKind.None : parameterRefKinds[i],
Binder\Binder_Query.cs (3)
701return lambdaBodyBinder.CreateBlockFromExpression(node, ImmutableArray<LocalSymbol>.Empty, RefKind.None, construction, null, d);
781return this.CreateBlockFromExpression(expression, locals, RefKind.None, result, expression, diagnostics);
823new AnonymousTypeField(fieldName, fieldValue.Syntax.Location, TypeWithAnnotations.Create(TypeOrError(fieldValue)), RefKind.None, ScopedKind.None);
Binder\Binder_Statements.cs (48)
868internal BoundExpression BindInferredVariableInitializer(BindingDiagnosticBag diagnostics, RefKind refKind, EqualsValueClauseSyntax initializer,
917RefKind variableRefKind,
922RefKind expressionRefKind = RefKind.None;
924if (variableRefKind == RefKind.None)
927if (expressionRefKind == RefKind.Ref)
935valueKind = variableRefKind == RefKind.RefReadOnly
944else if (expressionRefKind != RefKind.Ref)
1005if (localSymbol.RefKind != RefKind.None)
1071localSymbol.RefKind != RefKind.None ? ConversionForAssignmentFlags.RefAssignment : ConversionForAssignmentFlags.None);
1421var rhsExpr = node.Right.CheckAndUnwrapRefExpression(diagnostics, out var refKind);
1422var isRef = refKind == RefKind.Ref;
1451var lhsRefKind = boundLeft.GetRefKind();
1452if (lhsRefKind is RefKind.Ref or RefKind.Out)
2185var delegateRefKind = delegateParameters[i].RefKind;
2186var lambdaRefKind = anonymousFunction.RefKind(i);
2194if (delegateRefKind == RefKind.None)
2243var lambdaRefKind = anonymousFunction.RefKind(i);
2245var delegateRefKind = delegateParameters[i].RefKind;
3015protected virtual TypeSymbol GetCurrentReturnType(out RefKind refKind)
3032refKind = RefKind.None;
3038var refKind = RefKind.None;
3056RefKind sigRefKind;
3067if (refKind != RefKind.None)
3079else if ((object)retType != null && (refKind != RefKind.None) != (sigRefKind != RefKind.None))
3081var errorCode = refKind != RefKind.None
3179RefKind returnRefKind,
3190Debug.Assert(returnRefKind == RefKind.None);
3212if (returnRefKind != RefKind.None)
3228RefKind unusedRefKind;
3513internal BoundBlock CreateBlockFromExpression(CSharpSyntaxNode node, ImmutableArray<LocalSymbol> locals, RefKind refKind, BoundExpression expression, ExpressionSyntax expressionSyntax, BindingDiagnosticBag diagnostics)
3515RefKind returnRefKind;
3520if (IsInAsyncMethod() && refKind != RefKind.None)
3529if ((refKind != RefKind.None) != (returnRefKind != RefKind.None) && expression.Kind != BoundKind.ThrowExpression)
3531var errorCode = refKind != RefKind.None
3536statement = new BoundReturnStatement(syntax, RefKind.None, expression, @checked: CheckOverflowAtRuntime) { WasCompilerGenerated = true };
3640RefKind refKind;
3656RefKind refKind;
3669return bodyBinder.CreateBlockFromExpression(body, bodyBinder.GetDeclaredLocalsForScope(body), RefKind.None, expression, body, diagnostics);
3672private BindValueKind GetRequiredReturnValueKind(RefKind refKind)
3675if (refKind != RefKind.None)
3677GetCurrentReturnType(out var sigRefKind);
3678requiredValueKind = sigRefKind == RefKind.Ref ?
4041argumentRefKindsOpt: ImmutableArray<RefKind>.Empty,
Binder\Semantics\OverloadResolution\OverloadResolution.cs (83)
145RefKind returnRefKind = default,
193RefKind returnRefKind = default,
434RefKind returnRefKind,
852RefKind? returnRefKind,
877else if (returnRefKind == RefKind.None)
2186var type1 = getParameterTypeAndRefKind(i, m1.Result, m1LeastOverriddenParameters, m1.Result.ParamsElementTypeOpt, m1.LeastOverriddenMember, out RefKind parameter1RefKind);
2188var type2 = getParameterTypeAndRefKind(i, m2.Result, m2LeastOverriddenParameters, m2.Result.ParamsElementTypeOpt, m2.LeastOverriddenMember, out RefKind parameter2RefKind);
2578TypeWithAnnotations paramsElementTypeOpt, TMember member, out RefKind parameterRefKind)
2643RefKind refKind1 = GetParameterBetternessRefKind(p1, m1.Member);
2644RefKind refKind2 = GetParameterBetternessRefKind(p2, m2.Member);
2646if (refKind1 == RefKind.None && isAcceptableRefMismatch(refKind2, isInterpolatedStringHandlerConversion))
2657else if (refKind2 == RefKind.None && isAcceptableRefMismatch(refKind1, isInterpolatedStringHandlerConversion))
2674static bool isAcceptableRefMismatch(RefKind refKind, bool isInterpolatedStringHandlerConversion)
2678RefKind.In or RefKind.RefReadOnlyParameter => true,
2679RefKind.Ref when isInterpolatedStringHandlerConversion => true,
2685private static RefKind GetParameterBetternessRefKind<TMember>(ParameterSymbol parameter, TMember member) where TMember : Symbol
2692return isExtensionParameterOfStaticExtensionMember ? RefKind.None : parameter.RefKind;
2890RefKind refKind1,
2893RefKind refKind2,
2918Debug.Assert(refKind1 == RefKind.None || refKind1 == RefKind.Ref);
2919Debug.Assert(refKind2 == RefKind.None || refKind2 == RefKind.Ref);
2923if (refKind1 == RefKind.None)
2932else if (refKind1 == RefKind.Ref)
3856ArrayBuilder<RefKind> argumentRefKinds,
3862out ImmutableArray<RefKind> parameterRefKinds)
3878internal readonly ImmutableArray<RefKind> ParameterRefKinds;
3881internal EffectiveParameters(ImmutableArray<TypeWithAnnotations> types, ImmutableArray<RefKind> refKinds, int firstParamsElementIndex)
3895ArrayBuilder<RefKind> argumentRefKinds,
3916hasSomeRefKinds |= member.ContainingType.ExtensionParameter.RefKind != RefKind.None;
3927ArrayBuilder<RefKind> refs = null;
3941RefKind argRefKind = hasAnyRefArg ? argumentRefKinds[arg] : RefKind.None;
3942RefKind paramRefKind = GetEffectiveParameterRefKind(parameter, argRefKind, options, binder, ref hasAnyRefOmittedArgument);
3946if (paramRefKind != RefKind.None)
3948refs = ArrayBuilder<RefKind>.GetInstance(arg, RefKind.None);
3958var refKinds = refs != null ? refs.ToImmutableAndFree() : default(ImmutableArray<RefKind>);
3962private static RefKind GetEffectiveParameterRefKind(
3964RefKind argRefKind,
3969var paramRefKind = parameter.RefKind;
3978if (paramRefKind == RefKind.In)
3980if (argRefKind == RefKind.None)
3982return RefKind.None;
3985if (argRefKind == RefKind.Ref && binder.Compilation.IsFeatureEnabled(MessageID.IDS_FeatureRefReadonlyParameters))
3987return RefKind.Ref;
3990else if (paramRefKind == RefKind.RefReadOnlyParameter && argRefKind is RefKind.None or RefKind.Ref or RefKind.In)
4003if ((options & Options.AllowRefOmittedArguments) != 0 && paramRefKind == RefKind.Ref && argRefKind == RefKind.None && !binder.InAttributeArgument)
4006return RefKind.None;
4015internal static bool AreRefsCompatibleForMethodConversion(RefKind candidateMethodParameterRefKind, RefKind delegateParameterRefKind, CSharpCompilation compilation)
4025(RefKind.RefReadOnlyParameter, RefKind.Ref) or
4026(RefKind.RefReadOnlyParameter, RefKind.In) or
4027(RefKind.In, RefKind.RefReadOnlyParameter))
4033(candidateMethodParameterRefKind, delegateParameterRefKind) is (RefKind.In, RefKind.Ref))
4045ArrayBuilder<RefKind> argumentRefKinds,
4056ArrayBuilder<RefKind> argumentRefKinds,
4064var refs = ArrayBuilder<RefKind>.GetInstance();
4094var argRefKind = hasAnyRefArg ? argumentRefKinds[arg] : RefKind.None;
4095var paramRefKind = GetEffectiveParameterRefKind(parameter, argRefKind, options, binder, ref hasAnyRefOmittedArgument);
4098if (paramRefKind != RefKind.None)
4104var refKinds = anyRef ? refs.ToImmutable() : default(ImmutableArray<RefKind>);
4576RefKind argumentRefKind = arguments.RefKind(argumentPosition);
4577RefKind parameterRefKind = parameters.ParameterRefKinds.IsDefault ? RefKind.None : parameters.ParameterRefKinds[argumentPosition];
4582if (argumentRefKind == RefKind.None)
4584if (parameterRefKind == RefKind.Ref)
4603&& parameterRefKind == RefKind.Ref
4699RefKind argRefKind,
4701RefKind parRefKind,
4738Debug.Assert(argRefKind != RefKind.None);
4744if (argRefKind == RefKind.None || hasInterpolatedStringRefMismatch)
BoundTree\BoundObjectCreationExpression.cs (3)
13ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt,
18public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded,
25ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt,
BoundTree\Constructors.cs (28)
63fieldSymbol.RefKind != RefKind.None ||
93ImmutableArray<RefKind> argumentRefKindsOpt,
111ImmutableArray<RefKind> argumentRefKindsOpt,
127ImmutableArray<RefKind> refKinds,
190public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt = default)
199var parameterRefKind = method.ParameterRefKinds.IsDefault ? RefKind.None : method.ParameterRefKinds[i];
200var argumentRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
201Debug.Assert(argumentRefKind is RefKind.None or RefKind.Ref or RefKind.In or RefKind.Out or RefKindExtensions.StrictIn &&
205RefKind.In => argumentRefKind == RefKindExtensions.StrictIn,
206RefKind.RefReadOnlyParameter => argumentRefKind is RefKind.In or RefKindExtensions.StrictIn,
237static ImmutableArray<RefKind> getArgumentRefKinds(MethodSymbol method)
241if (!result.IsDefaultOrEmpty && result.Contains(RefKind.RefReadOnlyParameter))
243var builder = ArrayBuilder<RefKind>.GetInstance(result.Length);
245foreach (var refKind in result)
247builder.Add(refKind == RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
261: this(syntax, constructor, ImmutableArray.Create<BoundExpression>(arguments), default(ImmutableArray<string?>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), default(BitVector), null, null, constructor.ContainingType)
265: this(syntax, constructor, arguments, default(ImmutableArray<string?>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), default(BitVector), null, null, constructor.ContainingType)
278ImmutableArray<RefKind> refKinds,
304ImmutableArray<RefKind> argumentRefKindsOpt,
319ImmutableArray<RefKind> argumentRefKindsOpt,
572public static BoundReturnStatement Synthesized(SyntaxNode syntax, RefKind refKind, BoundExpression expression, bool hasErrors = false)
BoundTree\UnboundLambda.cs (52)
43internal readonly RefKind RefKind;
54RefKind refKind,
181ImmutableArray<RefKind> parameterRefKinds,
182RefKind refKind,
188parameterRefKinds.IsDefault ? Enumerable.Repeat(RefKind.None, parameterTypes.Length).ToImmutableArray() : parameterRefKinds,
219RefKind refKind = RefKind.None;
222RefKind rk = returnStatement.RefKind;
223if (rk != RefKind.None)
244Debug.Assert(refKind != RefKind.RefReadOnly);
410RefKind returnRefKind,
414ImmutableArray<RefKind> refKinds,
480public bool HasExplicitReturnType(out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers, out TypeWithAnnotations returnType)
505public RefKind RefKind(int index) { return Data.RefKind(index); }
595public abstract bool HasExplicitReturnType(out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers, out TypeWithAnnotations returnType);
602public abstract RefKind RefKind(int index);
677private static TypeWithAnnotations DelegateReturnTypeWithAnnotations(MethodSymbol? invokeMethod, out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers)
681refKind = CodeAnalysis.RefKind.None;
690internal (ImmutableArray<RefKind>, ArrayBuilder<ScopedKind>, ImmutableArray<TypeWithAnnotations>, bool) CollectParameterProperties()
692var parameterRefKindsBuilder = ArrayBuilder<RefKind>.GetInstance(ParameterCount);
699var refKind = RefKind(i);
757if (!HasExplicitReturnType(out var returnRefKind, refCustomModifiers: out _, out var returnType))
823var returnType = DelegateReturnTypeWithAnnotations(invokeMethod, out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers);
847refKind == CodeAnalysis.RefKind.None &&
869if (lambdaSymbol.RefKind == CodeAnalysis.RefKind.RefReadOnly)
936ImmutableArray<RefKind> parameterRefKinds,
937RefKind refKind,
953var returnType = DelegateReturnTypeWithAnnotations(invokeMethod, out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers);
986ImmutableArray<RefKind> parameterRefKinds)
988bool hasExplicitReturnType = HasExplicitReturnType(out var refKind, out ImmutableArray<CustomModifier> refCustomModifiers, out var returnType);
1016Debug.Assert(refKind != CodeAnalysis.RefKind.RefReadOnly);
1042Debug.Assert(refKind != CodeAnalysis.RefKind.RefReadOnly);
1052ImmutableArray<RefKind> parameterRefKinds,
1054RefKind refKind,
1091public readonly ImmutableArray<RefKind> ParameterRefKinds;
1094public static readonly ReturnInferenceCacheKey Empty = new ReturnInferenceCacheKey(ImmutableArray<TypeWithAnnotations>.Empty, ImmutableArray<RefKind>.Empty, null);
1096private ReturnInferenceCacheKey(ImmutableArray<TypeWithAnnotations> parameterTypes, ImmutableArray<RefKind> parameterRefKinds, NamedTypeSymbol? taskLikeReturnTypeOpt)
1157out ImmutableArray<RefKind> parameterRefKinds,
1163parameterRefKinds = ImmutableArray<RefKind>.Empty;
1172var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameterCount);
1248?? rebind(ReallyInferReturnType(delegateType: null, ImmutableArray<TypeWithAnnotations>.Empty, ImmutableArray<RefKind>.Empty));
1265ImmutableArray<RefKind> parameterRefKinds)
1268var refKind = inferredReturnType.RefKind;
1282refKind = CodeAnalysis.RefKind.None;
1496private readonly RefKind _returnRefKind;
1503private readonly ImmutableArray<RefKind> _parameterRefKinds;
1512RefKind returnRefKind,
1519ImmutableArray<RefKind> parameterRefKinds,
1545public override bool HasExplicitReturnType(out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers, out TypeWithAnnotations returnType)
1606public override RefKind RefKind(int index)
1609return _parameterRefKinds.IsDefault ? Microsoft.CodeAnalysis.RefKind.None : _parameterRefKinds[index];
1643statements[0] is BoundReturnStatement { RefKind: Microsoft.CodeAnalysis.RefKind.None, ExpressionOpt: BoundExpression expr })
CodeGen\CodeGenerator_RefSafety.cs (7)
12/// <inheritdoc cref="MightEscapeTemporaryRefs(bool, TypeSymbol, RefKind, ParameterSymbol?, ImmutableArray{ParameterSymbol})"/>
23/// <inheritdoc cref="MightEscapeTemporaryRefs(bool, TypeSymbol, RefKind, ParameterSymbol?, ImmutableArray{ParameterSymbol})"/>
29returnRefKind: RefKind.None,
34/// <inheritdoc cref="MightEscapeTemporaryRefs(bool, TypeSymbol, RefKind, ParameterSymbol?, ImmutableArray{ParameterSymbol})"/>
64RefKind returnRefKind,
73if (used && (returnRefKind != RefKind.None || returnType.IsRefLikeOrAllowsRefLikeType()))
105else if (parameter.RefKind != RefKind.None && parameter.EffectiveScope == ScopedKind.None)
CodeGen\EmitExpression.cs (59)
710RefKind refKind = expression.ArgumentRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : expression.ArgumentRefKindsOpt[i];
715private void EmitArgument(BoundExpression argument, RefKind refKind)
719case RefKind.None:
724Debug.Assert(refKind is RefKind.In or RefKind.Ref or RefKind.Out or RefKindExtensions.StrictIn);
730Debug.Assert(refKind is RefKind.In || argument.Type.IsDynamic() || argument is BoundFieldAccess { FieldSymbol.RefKind: not RefKind.None }, "passing args byref should not clone them into temps");
738internal static AddressKind GetArgumentAddressKind(RefKind refKind)
742case RefKind.None:
745case RefKind.In:
749Debug.Assert(refKind is RefKind.Ref or RefKind.Out or RefKindExtensions.StrictIn);
790if (expression.RefKind == RefKind.None)
957private void EmitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
962Debug.Assert(parameters.All(p => p.RefKind == RefKind.None) || !argRefKindsOpt.IsDefault, "there are nontrivial parameters, so we must have argRefKinds");
969RefKind argRefKind = GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
978internal static RefKind GetArgumentRefKind(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt, int i)
980RefKind argRefKind;
991RefKind.In => argRefKind == RefKindExtensions.StrictIn,
992RefKind.RefReadOnlyParameter => argRefKind is RefKind.In or RefKindExtensions.StrictIn,
999Debug.Assert(parameters[i].RefKind != RefKind.RefReadOnlyParameter,
1005RefKind.RefReadOnlyParameter => RefKind.In, // should not happen, asserted above
1014argRefKind = RefKind.None;
1143if (!field.IsVolatile && !field.IsStatic && fieldAccess.ReceiverOpt.Type.IsVerifierValue() && field.RefKind == RefKind.None)
1155if (field.RefKind != RefKind.None)
1299return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
1303return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
1312if (field.IsStatic || field.RefKind != RefKind.None)
1403bool isRefLocal = local.LocalSymbol.RefKind != RefKind.None;
1435if (parameter.ParameterSymbol.RefKind != RefKind.None)
1758var methodRefKind = call.Method.RefKind;
2246return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
2249return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
2252return ((BoundCall)receiver).Method.RefKind != RefKind.None;
2255return ((BoundFunctionPointerInvocation)receiver).FunctionPointer.Signature.RefKind != RefKind.None;
2258return ((BoundDup)receiver).RefKind != RefKind.None;
2670if (System.Linq.ImmutableArrayExtensions.All(ctor.Parameters, p => p.RefKind == RefKind.None) &&
2801return ((BoundParameter)left).ParameterSymbol.RefKind == RefKind.None;
2806return ((BoundLocal)left).LocalSymbol.RefKind == RefKind.None;
2826if (left.FieldSymbol.RefKind != RefKind.None &&
2844if (left.ParameterSymbol.RefKind != RefKind.None &&
2876if (left.LocalSymbol.RefKind != RefKind.None && !assignmentOperator.IsRef)
2975Debug.Assert(left.Method.RefKind != RefKind.None);
2986Debug.Assert(left.FunctionPointer.Signature.RefKind != RefKind.None);
3038LocalDefinition temp = EmitAddress(assignmentOperator.Right, lhs.GetRefKind() is RefKind.RefReadOnly or RefKindExtensions.StrictIn or RefKind.RefReadOnlyParameter ? AddressKind.ReadOnlyStrict : AddressKind.Writeable);
3121if (local.LocalSymbol.RefKind != RefKind.None && !assignment.IsRef)
3154Debug.Assert(((BoundDup)expression).RefKind != RefKind.None);
3177Debug.Assert(((BoundCall)expression).Method.RefKind != RefKind.None);
3182Debug.Assert(((BoundFunctionPointerInvocation)expression).FunctionPointer.Signature.RefKind != RefKind.None);
3326if (field.RefKind != RefKind.None && !refAssign)
3341if (parameter.ParameterSymbol.RefKind != RefKind.None && !refAssign)
4138if (useKind == UseKind.UsedAsValue && method.RefKind != RefKind.None)
4144Debug.Assert(method.RefKind != RefKind.None);
CodeGen\Optimizer.cs (24)
857if (node.LocalSymbol.RefKind != RefKind.None)
877if (node.LocalSymbol.RefKind != RefKind.None)
985if (localSymbol.RefKind is RefKind.RefReadOnly or RefKindExtensions.StrictIn &&
1004else if (localSymbol.RefKind != RefKind.None &&
1040(lhs.Kind is BoundKind.Local or BoundKind.Parameter or BoundKind.FieldAccess && lhs.GetRefKind() != RefKind.None),
1050if (((BoundParameter)lhs).ParameterSymbol.RefKind != RefKind.None)
1058if (((BoundLocal)lhs).LocalSymbol.RefKind != RefKind.None)
1066Debug.Assert(((BoundCall)lhs).Method.RefKind == RefKind.Ref, "only ref returning methods are assignable");
1070Debug.Assert(((BoundFunctionPointerInvocation)lhs).FunctionPointer.Signature.RefKind == RefKind.Ref, "only ref returning function pointers are assignable");
1230if (unwrappedSequence is BoundLocal { LocalSymbol: { RefKind: not RefKind.None } localSymbol })
1264private ImmutableArray<BoundExpression> VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
1274RefKind argRefKind = CodeGenerator.GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
1281private void VisitArgument(ImmutableArray<BoundExpression> arguments, ref ArrayBuilder<BoundExpression> rewrittenArguments, int i, RefKind argRefKind)
1283ExprContext context = (argRefKind == RefKind.None) ? ExprContext.Value : ExprContext.Address;
1305ImmutableArray<RefKind> argRefKindsOpt = node.ArgumentRefKindsOpt;
1309RefKind refKind = argRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : argRefKindsOpt[i];
1437if (localSym.RefKind == RefKind.None)
1885Debug.Assert(local.RefKind == RefKind.None, "cannot take a ref of a ref");
1946return top.Item2 == (local.RefKind == RefKind.None ? ExprContext.Value : ExprContext.Address) &&
2221var isIndirectLocalStore = left.LocalSymbol.RefKind != RefKind.None && !node.IsRef;
2250left.LocalSymbol.RefKind == RefKind.Ref &&
2487public override RefKind RefKind
2489get { return RefKind.None; }
Compiler\MethodBodySynthesizer.cs (5)
50argumentRefKindsOpt: ImmutableArray<RefKind>.Empty,
195statement = new BoundReturnStatement(accessor.SyntaxNode, RefKind.None, fieldAccess, @checked: false);
313BoundStatement returnStatement = BoundReturnStatement.Synthesized(syntax, RefKind.None, processHandlerCall);
323BoundStatement returnStatement = new BoundReturnStatement(syntax, RefKind.None, expressionOpt: null, @checked: false);
360refKind: RefKind.None,
FlowAnalysis\AbstractFlowPass.cs (37)
1132VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), null, default, false);
1293VisitRvalue(node.InitializerOpt, isKnownToBeAnLvalue: node.LocalSymbol.RefKind != RefKind.None);
1296if (node.LocalSymbol.RefKind != RefKind.None)
1437WriteArgument(receiverOpt, RefKind.Ref, method: null);
1443var thisRefKind = thisParameter.RefKind;
1517protected virtual void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1524private void VisitArgumentsBeforeCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt)
1529RefKind refKind = GetRefKind(refKindsOpt, i);
1530if (refKind != RefKind.Out)
1532VisitRvalue(arguments[i], isKnownToBeAnLvalue: refKind != RefKind.None);
1545private void VisitArgumentsAfterCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol? method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1549RefKind refKind = GetRefKind(refKindsOpt, i);
1552case RefKind.None:
1553case RefKind.In:
1554case RefKind.RefReadOnlyParameter:
1557case RefKind.Ref:
1560goto case RefKind.Out;
1563case RefKind.Out:
1574protected static RefKind GetRefKind(ImmutableArray<RefKind> refKindsOpt, int index)
1576return refKindsOpt.IsDefault || refKindsOpt.Length <= index ? RefKind.None : refKindsOpt[index];
1579protected virtual void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2033VisitRvalue(node.ExpressionOpt, isKnownToBeAnLvalue: node.RefKind != RefKind.None);
2036if (node.RefKind != RefKind.None)
2147if (property.RefKind == RefKind.None)
2165var refKind = node.Left.Kind == BoundKind.BadExpression
2166? RefKind.Ref
2202if (property.RefKind == RefKind.None)
2221if (property.RefKind == RefKind.None)
2838if (property.RefKind == RefKind.None)
3340WriteArgument(operand, RefKind.Ref, method: null);
3526this.WriteArgument(operand, RefKind.Out, null); //Out because we know it will definitely be assigned.
3567VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.Constructor, default, false);
3651VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod, node.ArgsToParamsOpt, node.Expanded);
3657VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod, node.ArgsToParamsOpt, node.Expanded);
3665VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), method: null, default, false);
3757property.RefKind == RefKind.None)
FlowAnalysis\DefiniteAssignment.cs (21)
350NoteWrite(parameter, value: null, read: true, isRef: parameter.RefKind != RefKind.None);
811write: field.RefKind == RefKind.None || isRef);
924write: field.RefKind == RefKind.None || isRef);
1187((ParameterSymbol)symbol).RefKind == RefKind.Out)
1287if (fieldSymbol.RefKind != RefKind.None)
1471if (!isRef && node is BoundFieldAccess { FieldSymbol.RefKind: not RefKind.None } fieldAccess)
1524if (local.LocalSymbol.RefKind != RefKind.None && !isRef)
1575if (isRef && param.RefKind == RefKind.Out)
1593write: field.RefKind == RefKind.None || isRef);
1767if (parameter.RefKind != RefKind.Out)
1779if (thisParameter.RefKind != RefKind.Out)
1791if (extensionParameter.RefKind != RefKind.Out)
1814if (current is not MethodSymbol && parameter.RefKind == RefKind.Out)
1844if (parameter.RefKind == RefKind.Out && !(this.CurrentSymbol is MethodSymbol currentMethod && currentMethod.IsAsync)) // out parameters not allowed in async
1852NoteWrite(parameter, value: null, read: true, isRef: parameter.RefKind != RefKind.None);
1910if (!parameter.IsThis && parameter.RefKind != RefKind.Out && parameter.ContainingSymbol is SynthesizedPrimaryConstructor primaryCtor)
1922if (parameter.RefKind != RefKind.None)
2524protected override void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2526if (refKind == RefKind.Ref)
2540if (refKind != RefKind.None && ((object)method == null || method.IsExtern) && arg.Type is TypeSymbol type)
2732NoteWrite(iterationVariable, null, read: true, isRef: iterationVariable.RefKind != RefKind.None);
FlowAnalysis\NullableWalker.cs (71)
1384var refKind = parameter.RefKind;
1385if (refKind != RefKind.Out && refKind != RefKind.Ref)
2529RefKind refKind,
2539if (refKind == RefKind.Ref)
2542return AreParameterAnnotationsCompatible(RefKind.None, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations, forRef: true) &&
2543AreParameterAnnotationsCompatible(RefKind.Out, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations);
2546if (refKind is RefKind.None or RefKind.In or RefKind.RefReadOnlyParameter)
2576if (refKind == RefKind.Out)
3041if (parameter.RefKind != RefKind.Out)
3114if (node.RefKind == RefKind.None &&
3123if (node.RefKind == RefKind.None)
4602ImmutableArray<RefKind> refKindsOpt = objectInitializer.ArgumentRefKindsOpt;
6847var refKind = isExtensionBlockMethod ? GetExtensionReceiverRefKind(node.Method) : GetRefKind(node.ArgumentRefKindsOpt, 0);
6983ImmutableArray<RefKind> refKindsOpt,
7040internal static ImmutableArray<RefKind> AdjustArgumentRefKindsIfNeeded(ImmutableArray<RefKind> argumentRefKindsOpt, bool adjustForExtensionBlockMethod,
7049RefKind receiverRefKind = GetExtensionReceiverRefKind(member);
7053if (receiverRefKind == RefKind.None)
7058var builder = ArrayBuilder<RefKind>.GetInstance(argumentCount + 1, fillWithValue: RefKind.None);
7066private static RefKind GetExtensionReceiverRefKind(Symbol member)
7073return extensionParameter.RefKind == RefKind.Ref ? RefKind.Ref : RefKind.None;
7506protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7516ImmutableArray<RefKind> refKindsOpt,
7531ImmutableArray<RefKind> refKindsOpt,
7560ImmutableArray<RefKind> refKindsOpt,
7603ImmutableArray<RefKind> refKindsOpt,
7795ImmutableArray<RefKind> refKindsOpt,
7814static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7874var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(refKindsOpt.Length + elements.Length - 1);
7876refKindsBuilder.AddMany(RefKind.None, elements.Length);
8067ImmutableArray<RefKind> refKindsOpt,
8128private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8140private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8146case RefKind.Ref:
8149case RefKind.None:
8150case RefKind.In:
8172case RefKind.Out:
8195RefKind refKind,
8210case RefKind.None:
8211case RefKind.In:
8249case RefKind.Ref:
8269case RefKind.Out:
8333RefKind refKind,
8346case RefKind.None:
8347case RefKind.In:
8353case RefKind.Ref:
8380case RefKind.Out:
8448void trackNullableStateForAssignment(TypeSymbol? receiverType, BoundExpression parameterValue, TypeWithAnnotations lValueType, int targetSlot, TypeWithState parameterWithState, bool isSuppressed, FlowAnalysisAnnotations parameterAnnotations, RefKind refKind, ParameterSymbol parameter)
8473static bool hasConditionalPostCondition(TypeSymbol? receiverType, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8484static bool isUnionTryGetValueValue(TypeSymbol? receiverType, RefKind refKind, ParameterSymbol parameter)
8486if (refKind == RefKind.Out &&
8515static TypeWithState applyPostConditionsWhenTrue(TypeSymbol? receiverType, TypeWithState typeWithState, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8605ImmutableArray<RefKind> refKindsOpt)
8616RefKind refKind = GetRefKind(refKindsOpt, i);
8619if (refKind == RefKind.None)
8687ImmutableArray<RefKind> argumentRefKindsOpt,
8697var refKinds = ArrayBuilder<RefKind>.GetInstance();
8718parameterRefKinds: out ImmutableArray<RefKind> parameterRefKinds);
11374case BoundLocal { LocalSymbol.RefKind: RefKind.None }:
11375case BoundParameter { ParameterSymbol: { RefKind: RefKind.None } parameter } when
12117ImmutableArray<RefKind> refKindsOpt = extensionParameter.RefKind == RefKind.Ref ? [RefKind.Ref] : default;
13606TypeWithAnnotations elementType = InMethodBinder.GetIteratorElementTypeFromReturnType(compilation, RefKind.None,
13648VisitArguments(node, receiverType: null, node.ConstructorArguments, ImmutableArray<RefKind>.Empty, node.Constructor, argsToParamsOpt: node.ConstructorArgumentsToParamsOpt, defaultArguments: node.ConstructorDefaultArguments,
Generated\BoundNodes.xml.Generated.cs (40)
933public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type, bool hasErrors)
939public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type)
945public RefKind RefKind { get; }
950public BoundDup Update(RefKind refKind, TypeSymbol? type)
1473public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1490public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
1496public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
3119public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3131public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
3136public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3625public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3637public RefKind RefKind { get; }
3644public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
5983public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5999public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6005public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6233public BoundCall(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool isDelegateCall, bool expanded, bool invokedAsExtensionMethod, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalMethodsOpt, TypeSymbol type, bool hasErrors = false)
6266public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6278public BoundCall Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, MethodSymbol method, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool isDelegateCall, bool expanded, bool invokedAsExtensionMethod, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalMethodsOpt, TypeSymbol type)
6376public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6393public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6400public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6435public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
6461public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6472public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<MethodSymbol> constructorsGroup, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ConstantValue? constantValueOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, bool wasTargetTyped, TypeSymbol type)
6533public BoundUnconvertedWithElement(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool hasErrors = false)
6546public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6551public BoundUnconvertedWithElement Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt)
6757public BoundDynamicObjectCreationExpression(SyntaxNode syntax, string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type, bool hasErrors = false)
6778public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6786public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6879public BoundObjectInitializerMember(SyntaxNode syntax, Symbol? memberSymbol, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, AccessorKind accessorKind, TypeSymbol receiverType, TypeSymbol type, bool hasErrors = false)
6903public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6914public BoundObjectInitializerMember Update(Symbol? memberSymbol, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, LookupResultKind resultKind, AccessorKind accessorKind, TypeSymbol receiverType, TypeSymbol type)
7547public BoundIndexerAccess(SyntaxNode syntax, BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol indexer, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, AccessorKind accessorKind, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ImmutableArray<PropertySymbol> originalIndexersOpt, TypeSymbol type, bool hasErrors = false)
7574public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7584public BoundIndexerAccess Update(BoundExpression? receiverOpt, ThreeState initialBindingReceiverIsSubjectToCloning, PropertySymbol indexer, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, AccessorKind accessorKind, ImmutableArray<int> argsToParamsOpt, BitVector defaultArguments, ImmutableArray<PropertySymbol> originalIndexersOpt, TypeSymbol type)
7688public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7708public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7714public BoundDynamicIndexerAccess Update(BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type)
Lowering\LocalRewriter\LocalRewriter_Call.cs (88)
140ref ImmutableArray<RefKind> argumentRefKindsOpt,
300var thisRefKind = methodThisParameter.RefKind;
303if (thisRefKind != RefKind.None
306thisRefKind == RefKind.Ref ? CodeGenerator.AddressKind.Writeable : CodeGenerator.AddressKind.ReadOnlyStrict,
320if (argumentRefKindsOpt.IsDefault && thisRefKind != RefKind.None)
381ImmutableArray<RefKind> argRefKindsOpt = node.ArgumentRefKindsOpt;
461ImmutableArray<RefKind> argumentRefKinds,
548argumentRefKinds: default(ImmutableArray<RefKind>),
553private static bool IsSafeForReordering(BoundExpression expression, RefKind kind)
579return kind != RefKind.None;
671ImmutableArray<RefKind> argumentRefKindsOpt,
692RefKind refKind;
710refKind = rewrittenReceiver.Type.IsValueType || rewrittenReceiver.Type.Kind == SymbolKind.TypeParameter ? RefKind.Ref : RefKind.None;
716refKind = RefKind.None;
722if (refKind == RefKind.None &&
729refKind = RefKind.Ref;
735receiverTemp = _factory.StoreToTemp(rewrittenReceiver, out assignmentToTemp, refKind is RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
902RefKind argRefKind = argumentRefKindsOpt.RefKinds(argIndex);
903RefKind paramRefKind = parameters[paramIndex].RefKind;
905local = _factory.StoreToTemp(visitedArgument, out var store, refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter ? RefKind.In : argRefKind);
953private RefKind GetExtensionBlockMemberReceiverCaptureRefKind(BoundExpression rewrittenReceiver, Symbol methodOrIndexer)
958RefKind receiverRefKind = methodOrIndexer.ContainingType.ExtensionParameter.RefKind;
959bool isReceiverTakenByValue = receiverRefKind == RefKind.None;
964return RefKind.None;
978return RefKind.None;
981RefKind refKind = ExtensionMethodReferenceRewriter.ReceiverArgumentRefKindFromReceiverRefKind(receiverRefKind);
992return RefKind.None;
1067ref ImmutableArray<RefKind> argumentRefKindsOpt,
1150ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
1220private static ImmutableArray<RefKind> GetEffectiveArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters)
1222ArrayBuilder<RefKind>? refKindsBuilder = null;
1225var paramRefKind = parameters[i].RefKind;
1226var currentArgRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
1227var effectiveArgRefKind = GetEffectiveRefKind(paramRefKind, currentArgRefKind, parameters[i].Type, comRefKindMismatchPossible: false);
1245static void fillRefKindsBuilder(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters, [NotNull] ref ArrayBuilder<RefKind>? refKindsBuilder)
1252refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length);
1257refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length, fillWithValue: RefKind.None);
1263internal static RefKind GetEffectiveRefKind(RefKind paramRefKind, RefKind initialArgRefKind, TypeSymbol paramType, bool comRefKindMismatchPossible)
1271if (paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter)
1273Debug.Assert(initialArgRefKind is RefKind.None or RefKind.In or RefKind.Ref);
1274return initialArgRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn;
1276else if (paramRefKind == RefKind.Ref && initialArgRefKind == RefKind.None)
1282return RefKind.Ref;
1344private static ImmutableArray<RefKind> GetRefKindsOrNull(ArrayBuilder<RefKind> refKinds)
1346foreach (var refKind in refKinds)
1348if (refKind != RefKind.None)
1353return default(ImmutableArray<RefKind>);
1406ImmutableArray<RefKind> argumentRefKinds,
1410/* out */ ArrayBuilder<RefKind> refKinds,
1422RefKind argRefKind = argumentRefKinds.RefKinds(a);
1423RefKind paramRefKind = parameters[p].RefKind;
1431Debug.Assert(argRefKind == RefKind.None);
1447arg.rewriter.StoreArgumentToTempIfNecessary(arg.forceLambdaSpilling, arg.storesToTemps, element, RefKind.None, RefKind.None),
1463private BoundExpression StoreArgumentToTempIfNecessary(bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps, BoundExpression argument, RefKind argRefKind, RefKind paramRefKind)
1475refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter
1476? (argRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn)
1530default(ImmutableArray<RefKind>),
1690ArrayBuilder<RefKind> argsRefKindsBuilder,
1703RefKind paramRefKind = parameters[argIndex].RefKind;
1704RefKind argRefKind = argsRefKindsBuilder[argIndex];
1708if (argRefKind != RefKind.None || paramRefKind != RefKind.Ref)
1716var localRefKind = ((BoundLocal)argument).LocalSymbol.RefKind;
1717if (localRefKind == RefKind.Ref)
1723Debug.Assert(localRefKind == RefKind.None);
1735argsRefKindsBuilder[argIndex] = RefKind.Ref;
Lowering\LocalRewriter\LocalRewriter_CompoundAssignmentOperator.cs (26)
233BoundLocal binaryResult = _factory.StoreToTemp(opFinal, out BoundAssignmentOperator assignmentToTemp, refKind: RefKind.None);
258return symbol.IsExtensionBlockMember() && !symbol.IsStatic && symbol.ContainingType.ExtensionParameter is { RefKind: RefKind.None, Type.IsReferenceType: false };
295RefKind refKind;
313refKind = variableRepresentsLocation ? RefKind.Ref : RefKind.None;
326refKind: refKind is RefKind.RefReadOnlyParameter ? RefKind.In : refKind,
444ImmutableArray<RefKind> argumentRefKinds = indexerAccess.ArgumentRefKindsOpt;
476ref ImmutableArray<RefKind> argumentRefKinds,
483ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
556Debug.Assert(implicitIndexerAccess.IndexerOrSliceAccess.GetRefKind() == RefKind.None);
579var variableTemp = _factory.StoreToTemp(arrayAccess, out assignmentToTemp, refKind: RefKind.Ref);
657var temp = _factory.StoreToTemp(VisitExpression(arguments[i]), out assignmentToTemp, indexerAccess.ArgumentRefKindsOpt.RefKinds(i) != RefKind.None ? RefKind.Ref : RefKind.None);
728if (propertyAccess.PropertySymbol.RefKind == RefKind.None)
743if (indexerAccess.GetRefKind() == RefKind.None)
756if (implicitIndexerAccess.GetRefKind() == RefKind.None)
809Debug.Assert(originalLHS.GetRefKind() == RefKind.Ref);
830Debug.Assert(((BoundCall)originalLHS).Method.RefKind != RefKind.None);
834Debug.Assert(((BoundFunctionPointerInvocation)originalLHS).FunctionPointer.Signature.RefKind != RefKind.None);
885var variableTemp = _factory.StoreToTemp(rewrittenVariable, out assignmentToTemp2, refKind: RefKind.Ref);
985((BoundParameter)expression).ParameterSymbol.RefKind != RefKind.None ||
989return localsMayBeAssignedOrCaptured || ((BoundLocal)expression).LocalSymbol.RefKind != RefKind.None;
Lowering\LocalRewriter\LocalRewriter_ForEachStatement.cs (5)
618RefKind collectionTempRefKind = RefKind.None;
706private delegate BoundStatement? GetForEachStatementAsForPreamble(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind);
745return static (LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind) =>
759collectionTempRefKind = enumeratorInfo.InlineArraySpanType == WellKnownType.System_Span_T ? RefKind.Ref : RefKindExtensions.StrictIn;
Lowering\LocalRewriter\LocalRewriter_ObjectOrCollectionInitializerExpression.cs (13)
171default(ImmutableArray<RefKind>),
186.All(p => p.RefKind is RefKind.None or RefKind.In or RefKind.RefReadOnlyParameter));
202var argumentRefKindsOpt = default(ImmutableArray<RefKind>);
203if (initializer.InvokedAsExtensionMethod && addMethod.Parameters[0].RefKind == RefKind.Ref)
208var builder = ArrayBuilder<RefKind>.GetInstance(addMethod.Parameters.Length, RefKind.None);
209builder[0] = RefKind.Ref;
340memberInit.MemberSymbol?.GetParameterRefKinds() ?? default(ImmutableArray<RefKind>),
622ImmutableArray<RefKind> paramRefKindsOpt,
642elementArg.rewriter.EvaluateSideEffects(element, RefKind.None, elementArg.sideeffects, ref elementArg.temps),
670private BoundExpression EvaluateSideEffects(BoundExpression arg, RefKind refKind, ArrayBuilder<BoundExpression> sideeffects, ref ArrayBuilder<LocalSymbol>? temps)
Lowering\LocalRewriter\LoweredDynamicOperationFactory.cs (54)
112return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
148return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
191return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
200ImmutableArray<RefKind> refKinds,
224RefKind receiverRefKind;
229receiverRefKind = RefKind.None;
293return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredHandler, resultType);
300ImmutableArray<RefKind> refKinds,
330return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
338ImmutableArray<RefKind> refKinds)
357return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, type);
392return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
433return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredRight, AssemblySymbol.DynamicType);
440ImmutableArray<RefKind> refKinds)
459return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
466ImmutableArray<RefKind> refKinds,
482var loweredReceiverRefKind = GetReceiverRefKind(loweredReceiver);
517return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, ImmutableArray<BoundExpression>.Empty, default(ImmutableArray<RefKind>), null, resultType);
543internal RefKind GetReceiverRefKind(BoundExpression loweredReceiver)
548return RefKind.None;
556return hasHome ? RefKind.Ref : RefKind.None;
563ImmutableArray<RefKind> refKinds = default(ImmutableArray<RefKind>),
565RefKind receiverRefKind = RefKind.None,
572Debug.Assert(!receiverIsStaticType || receiverRefKind == RefKind.None);
587refKinds.IsDefault ? RefKind.None : refKinds[i],
593infos[j++] = GetArgumentInfo(argumentInfoFactory, loweredRight, NoName, RefKind.None, isStaticType: false);
602RefKind receiverRefKind,
604ImmutableArray<RefKind> refKinds,
721RefKind receiverRefKind,
723ImmutableArray<RefKind> refKinds,
737bool hasByRefs = receiverRefKind != RefKind.None || !refKinds.IsDefaultOrEmpty;
777byRefs[j++] = RefKind.None;
792static RefKind getRefKind(RefKind refKind)
794Debug.Assert(refKind != RefKind.RefReadOnlyParameter);
795return refKind == RefKind.None ? RefKind.None : RefKind.Ref;
803RefKind refKind,
818Debug.Assert(refKind == RefKind.None || refKind == RefKind.Ref || refKind == RefKind.Out, "unexpected refKind in dynamic");
821if (refKind == RefKind.Out)
825else if (refKind == RefKind.Ref)
Lowering\SpillSequenceSpiller.cs (42)
305RefKind refKind = RefKind.None,
317Debug.Assert(refKind == RefKind.None);
324Debug.Assert(refKind == RefKind.None);
337if (refKind != RefKind.None || expression.Type?.IsRefLikeOrAllowsRefLikeType() == true)
370var left = Spill(builder, assignment.Left, RefKind.Ref);
371var right = Spill(builder, assignment.Right, RefKind.Ref);
380if (refKind != RefKind.None || expression.Type.IsReferenceType)
388if (refKind != RefKind.None)
397if (local.LocalSymbol.SynthesizedKind == SynthesizedLocalKind.Spill || refKind != RefKind.None)
410if (refKind != RefKind.None || fieldSymbol.IsReadOnly)
417if (refKind == RefKind.None) goto default;
419var receiver = Spill(builder, field.ReceiverOpt, fieldSymbol.ContainingType.IsValueType ? refKind : RefKind.None);
437if (refKind != RefKind.None)
482if (refKind == RefKind.None &&
489[Spill(builder, objectCreationExpression.Arguments[0], argRefKinds.IsDefault ? RefKind.None : argRefKinds[0])],
538Left: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: not RefKind.None } receiverRefLocal },
541ValueTypeReceiver: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: not RefKind.None } } valueTypeReceiver,
550Left: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.None } referenceTypeClone },
551Right: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: not RefKind.None } originalReceiverReference }
554Value: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.None } } referenceTypeReceiver
587ImmutableArray<RefKind> refKinds = default(ImmutableArray<RefKind>),
635var refKind = refKinds.IsDefault ? RefKind.None : refKinds[i];
904expression = Spill(leftBuilder, expression, RefKind.None);
919left = Spill(leftBuilder, VisitExpression(ref leftBuilder, left), RefKind.Ref);
951expression = Spill(leftBuilder, expression, RefKind.None);
966receiver = Spill(leftBuilder, VisitExpression(ref leftBuilder, field.ReceiverOpt), RefKind.Ref);
1046RefKind refKind = ReceiverSpillRefKind(receiver);
1048Debug.Assert(refKind == RefKind.None || !receiver.Type.IsReferenceType);
1052if (refKind != RefKind.None &&
1085private static RefKind ReceiverSpillRefKind(BoundExpression receiver)
1087var result = RefKind.None;
1090result = receiver.Type.IsReadOnly ? RefKind.In : RefKind.Ref;
1279var receiverRefKind = ReceiverSpillRefKind(node.Receiver);
1300if (receiver.Type.IsReferenceType || receiver.Type.IsValueType || receiverRefKind == RefKind.None)
1303receiver = Spill(receiverBuilder, receiver, RefKind.None);
1318receiver = Spill(receiverBuilder, receiver, RefKind.Ref);
1320var clone = _F.SynthesizedLocal(receiver.Type, _F.Syntax, refKind: RefKind.None, kind: SynthesizedLocalKind.Spill);
Lowering\SyntheticBoundNodeFactory.cs (30)
580Debug.Assert(CurrentFunction.RefKind == RefKind.None);
585return new BoundReturnStatement(Syntax, CurrentFunction.RefKind != RefKind.None ? RefKind.Ref : RefKind.None, expression, @checked: false) { WasCompilerGenerated = true };
605RefKind refKind = RefKind.None,
645return SynthesizedParameterSymbol.Create(container, TypeWithAnnotations.Create(type), ordinal, RefKind.None, name);
783public BoundObjectCreationExpression New(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKinds)
893public static ImmutableArray<RefKind> ArgumentRefKindsFromParameterRefKinds(MethodSymbol method, bool useStrictArgumentRefKinds)
897if (!result.IsDefaultOrEmpty && (result.Contains(RefKind.RefReadOnlyParameter) ||
898(useStrictArgumentRefKinds && result.Contains(RefKind.In))))
900var builder = ArrayBuilder<RefKind>.GetInstance(result.Length);
902foreach (var refKind in result)
913public static RefKind ArgumentRefKindFromParameterRefKind(RefKind refKind, bool useStrictArgumentRefKinds)
917RefKind.In or RefKind.RefReadOnlyParameter when useStrictArgumentRefKinds => RefKindExtensions.StrictIn,
918RefKind.RefReadOnlyParameter => RefKind.In,
923public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<RefKind> refKinds, ImmutableArray<BoundExpression> args)
1652RefKind refKind = RefKind.None,
1669case RefKind.Out:
1670refKind = RefKind.Ref;
1673case RefKind.In:
1682Debug.Assert(argument.GetRefKind() != RefKind.In);
1683refKind = RefKind.None;
1687case RefKind.None:
1688case RefKind.Ref:
1719isRef: refKind != RefKind.None);
Symbols\Compilation_WellKnownMembers.cs (13)
817internal SynthesizedAttributeData? SynthesizeDynamicAttribute(TypeSymbol type, int customModifiersCount, RefKind refKindOpt = RefKind.None)
822if (type.IsDynamic() && refKindOpt == RefKind.None && customModifiersCount == 0)
931internal static ImmutableArray<TypedConstant> Encode(TypeSymbol type, RefKind refKind, int customModifiersCount, TypeSymbol booleanType)
943internal static ImmutableArray<bool> Encode(TypeSymbol type, RefKind refKind, int customModifiersCount)
950internal static ImmutableArray<bool> EncodeWithoutCustomModifierFlags(TypeSymbol type, RefKind refKind)
957internal static void Encode(TypeSymbol type, int customModifiersCount, RefKind refKind, ArrayBuilder<bool> transformFlagsBuilder, bool addCustomModifierFlags)
961if (refKind != RefKind.None)
1052void handle(RefKind refKind, ImmutableArray<CustomModifier> customModifiers, TypeWithAnnotations twa)
1059if (refKind != RefKind.None)
1214return parameter.RefKind != RefKind.None;
1219return method.RefKind != RefKind.None;
1224return property.RefKind != RefKind.None;
Symbols\FunctionPointers\FunctionPointerMethodSymbol.cs (48)
28RefKind refKind = RefKind.None;
44case SyntaxKind.RefKeyword when refKind == RefKind.None:
48refKind = RefKind.RefReadOnly;
53refKind = RefKind.Ref;
59Debug.Assert(refKind != RefKind.None);
73if (returnType.IsVoidType() && refKind != RefKind.None)
88if (refKind != RefKind.None)
247RefKind returnRefKind,
250ImmutableArray<RefKind> parameterRefKinds,
271RefKind returnRefKind,
273ImmutableArray<RefKind> parameterRefKinds,
285if (returnRefKind == RefKind.None)
310private static CustomModifier? GetCustomModifierForRefKind(RefKind refKind, CSharpCompilation compilation)
312Debug.Assert(refKind is RefKind.None or RefKind.In or RefKind.Ref or RefKind.Out);
316RefKind.In => compilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_InAttribute),
317RefKind.Out => compilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_OutAttribute),
323Debug.Assert(refKind != RefKind.Out && refKind != RefKind.In);
351var returnVariance = RefKind == RefKind.None ? variance : VarianceKind.None;
366(VarianceKind.In, RefKind.None) => VarianceKind.Out,
367(VarianceKind.Out, RefKind.None) => VarianceKind.In,
443RefKind refKind,
488RefKind refKind,
493ImmutableArray<RefKind> parameterRefKinds,
496Debug.Assert(refKind != RefKind.Out);
497Debug.Assert(refCustomModifiers.IsDefaultOrEmpty || refKind != RefKind.None);
509Debug.Assert(refCustomModifiers.IsEmpty || refKind != RefKind.None);
513static ImmutableArray<CustomModifier> getCustomModifierArrayForRefKind(RefKind refKind, CSharpCompilation compilation)
519RefKind refKind,
553RefKind = getRefKind(retInfo, RefCustomModifiers, RefKind.RefReadOnly, RefKind.Ref, requiresLocationAllowed: false);
554Debug.Assert(RefKind != RefKind.Out);
569RefKind paramRefKind = getRefKind(param, paramRefCustomMods, RefKind.In, RefKind.Out, requiresLocationAllowed: true);
581static RefKind getRefKind(ParamInfo<TypeSymbol> param, ImmutableArray<CustomModifier> paramRefCustomMods, RefKind hasInRefKind, RefKind hasOutRefKind, bool requiresLocationAllowed)
585false => RefKind.None,
588true when requiresLocationAllowed && CustomModifierUtils.HasRequiresLocationAttributeModifier(paramRefCustomMods) => RefKind.RefReadOnlyParameter,
589true => RefKind.Ref,
648var modifiersToSearch = RefKind != RefKind.None ? RefCustomModifiers : ReturnTypeWithAnnotations.CustomModifiers;
671var modifiersToSearch = RefKind != RefKind.None ? RefCustomModifiers : ReturnTypeWithAnnotations.CustomModifiers;
767public override RefKind RefKind { get; }
Symbols\Source\ParameterHelpers.cs (36)
42ParameterSyntax syntax, RefKind refKind, int ordinal,
71ParameterSyntax syntax, RefKind refKind, int ordinal,
134FunctionPointerParameterSyntax syntax, RefKind refKind, int ordinal,
144RefKind.In => CreateInModifiers(binder, diagnostics, syntax),
145RefKind.RefReadOnlyParameter => CreateRefReadonlyParameterModifiers(binder, diagnostics, syntax),
146RefKind.Out => CreateOutModifiers(binder, diagnostics, syntax),
177Func<Binder, TOwningSymbol, TypeWithAnnotations, TParameterSyntax, RefKind, int, SyntaxToken, SyntaxToken, bool, ScopedKind, BindingDiagnosticBag, TParameterSymbol> parameterCreationFunc,
257Func<Binder, TOwningSymbol, TypeWithAnnotations, TParameterSyntax, RefKind, int, SyntaxToken, SyntaxToken, bool, ScopedKind, BindingDiagnosticBag, TParameterSymbol> parameterCreationFunc,
269var refKind = GetModifiers(parameterSyntax.Modifiers, ignoreParams: inExtension, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out ScopedKind scope);
310if (!allowRefOrOut && (refKind == RefKind.Ref || refKind == RefKind.Out))
348if (parameter.RefKind == RefKind.In)
359else if (parameter.RefKind == RefKind.RefReadOnlyParameter)
452internal static bool IsRefScopedByDefault(bool useUpdatedEscapeRules, RefKind refKind)
454return useUpdatedEscapeRules && refKind == RefKind.Out;
847RefKind refKind,
894else if (refKind != RefKind.None &&
951var refKind = GetModifiers(parameterSyntax.Modifiers, ignoreParams: inExtension, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out _);
957if (refKind == RefKind.Ref || refKind == RefKind.Out)
1067if (refKind == RefKind.RefReadOnlyParameter)
1133internal static RefKind GetModifiers(SyntaxTokenList modifiers, bool ignoreParams, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out ScopedKind scope)
1135var refKind = RefKind.None;
1147if (refKind == RefKind.None)
1150refKind = RefKind.Out;
1154if (refKind == RefKind.None)
1157refKind = RefKind.Ref;
1161if (refKind == RefKind.None)
1164refKind = RefKind.In;
1180if (refKind == RefKind.Ref && refnessKeyword.GetNextToken() == modifier)
1182refKind = RefKind.RefReadOnlyParameter;
1190scope = (refKind == RefKind.None) ? ScopedKind.ScopedValue : ScopedKind.ScopedRef;
1200internal static ImmutableArray<CustomModifier> ConditionallyCreateInModifiers(RefKind refKind, bool addRefReadOnlyModifier, Binder binder, BindingDiagnosticBag diagnostics, SyntaxNode syntax)
1202if (addRefReadOnlyModifier && refKind is RefKind.In or RefKind.RefReadOnlyParameter)
Symbols\Source\SourceDelegateMethodSymbol.cs (13)
28RefKind refKind,
56returnTypeSyntax = returnTypeSyntax.SkipScoped(out _).SkipRefInLocalOrReturn(diagnostics, out RefKind refKind);
222: base(delegateType, voidType, syntax, MethodKind.Constructor, RefKind.None, DeclarationModifiers.Public)
225SynthesizedParameterSymbol.Create(this, objectType, 0, RefKind.None, "object"),
226SynthesizedParameterSymbol.Create(this, intPtrType, 1, RefKind.None, "method")));
264RefKind refKind,
287if (this.RefKind == RefKind.RefReadOnly)
326if (this.RefKind == RefKind.RefReadOnly)
362: base((SourceNamedTypeSymbol)invoke.ContainingType, iAsyncResultType, syntax, MethodKind.Ordinary, RefKind.None, DeclarationModifiers.Virtual | DeclarationModifiers.Public)
372parameters.Add(SynthesizedParameterSymbol.Create(this, asyncCallbackType, paramCount, RefKind.None, GetUniqueParameterName(parameters, "callback")));
373parameters.Add(SynthesizedParameterSymbol.Create(this, objectType, paramCount + 1, RefKind.None, GetUniqueParameterName(parameters, "object")));
411if (p.RefKind != RefKind.None)
418parameters.Add(SynthesizedParameterSymbol.Create(this, iAsyncResultType, ordinal++, RefKind.None, GetUniqueParameterName(parameters, "result")));
Symbols\Source\SourceMemberContainerSymbol.cs (18)
2375var refKind1 = method1.Parameters[i].RefKind;
2376var refKind2 = method2.Parameters[i].RefKind;
4639if (methodParam.RefKind != RefKind.None)
4662methodParams[0].RefKind == RefKind.None &&
5147RefKind.Out
5149RefKind.None,
5195RefKind.None
5197RefKind.None,
5248RefKind.None)),
5249RefKind.None,
5304RefKind.None,
5383RefKind.None,
5478RefKind.None,
5509RefKind.None,
5575RefKind.None
5577RefKind.None,
5778_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);
5785var modifiers = SourceMemberFieldSymbol.MakeModifiers(this, fieldSyntax.Declaration.Variables[0].Identifier, fieldSyntax.Modifiers, isRefField: refKind != RefKind.None, diagnostics, out modifierErrors);
Symbols\Synthesized\Records\SynthesizedPrimaryConstructor.cs (1)
44RefKind.None,
Symbols\Synthesized\Records\SynthesizedRecordDeconstruct.cs (1)
41RefKind.Out,
Symbols\Synthesized\Records\SynthesizedRecordEqualityContractProperty.cs (1)
41RefKind.None,
Symbols\Synthesized\Records\SynthesizedRecordPropertySymbol.cs (1)
40RefKind.None,
Symbols\Synthesized\RefKindVector.cs (11)
39internal RefKind this[int index]
46(false, false, false) => RefKind.None,
47(false, false, true) => RefKind.Ref,
48(false, true, false) => RefKind.Out,
49(false, true, true) => RefKind.RefReadOnly,
50(true, false, false) => RefKind.RefReadOnlyParameter,
59RefKind.None => (false, false, false),
60RefKind.Ref => (false, false, true),
61RefKind.Out => (false, true, false),
62RefKind.RefReadOnly => (false, true, true),
63RefKind.RefReadOnlyParameter => (true, false, false),
Symbols\Synthesized\SynthesizedDelegateSymbol.cs (7)
21SynthesizedParameterSymbol.Create(this, TypeWithAnnotations.Create(objectType), 0, RefKind.None, "object"),
22SynthesizedParameterSymbol.Create(this, TypeWithAnnotations.Create(intPtrType), 1, RefKind.None, "method"));
35internal ParameterDescription(TypeWithAnnotations type, RefKind refKind, ScopedKind scope, ConstantValue? defaultValue, bool isParams, bool hasUnscopedRefAttribute)
46internal readonly RefKind RefKind;
59RefKind refKind)
68RefCustomModifiers = refKind == RefKind.RefReadOnly ?
166public override RefKind RefKind { get; }
Symbols\Synthesized\SynthesizedEntryPointSymbol.cs (11)
115public override RefKind RefKind
117get { return RefKind.None; }
304default(ImmutableArray<RefKind>),
372argumentRefKindsOpt: default(ImmutableArray<RefKind>),
398argumentRefKindsOpt: default(ImmutableArray<RefKind>),
451refKind: RefKind.None,
469refKind: RefKind.None,
563RefKind.None,
582TypeWithAnnotations.Create(submissionArrayType), 0, RefKind.None, "submissionArray"));
633argumentRefKindsOpt: default(ImmutableArray<RefKind>),
654RefKind.None,
Symbols\Synthesized\SynthesizedUnionValuePropertySymbol.cs (1)
35RefKind.None,
InitializeParameter\CSharpInitializeMemberFromPrimaryConstructorParameterCodeRefactoringProvider.cs (1)
250RefKind.None,
src\roslyn\src\Analyzers\CSharp\CodeFixes\GenerateConstructor\CSharpGenerateConstructorService.cs (1)
74refKind: RefKind.None,
src\roslyn\src\Analyzers\CSharp\CodeFixes\GenerateParameterizedMember\CSharpGenerateConversionService.cs (1)
209refKind: RefKind.None,
src\roslyn\src\Analyzers\CSharp\CodeFixes\MakeLocalFunctionStatic\MakeLocalFunctionStaticCodeFixHelper.cs (1)
215refKind: RefKind.None,
InitializeParameter\AbstractInitializeMemberFromParameterCodeRefactoringProviderMemberCreation.cs (1)
342RefKind.None,
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateDeconstructMethodService.State.cs (1)
76refKind: RefKind.None,
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateMethodService.State.cs (1)
254refKind: RefKind.None,
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.cs (8)
147document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None));
161document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None));
175document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None));
223parameter.RefKind is RefKind.Out ||
248private static RefKind GetRefKindFromContext(State state)
252return RefKind.Ref;
256return RefKind.RefReadOnly;
260return RefKind.None;
src\roslyn\src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.GenerateParameterCodeAction.cs (1)
49RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\CodeGenerationSymbolFactory.cs (10)
48RefKind refKind,
79ITypeSymbol type, RefKind refKind, ImmutableArray<IPropertySymbol> explicitInterfaceImplementations, string name,
153RefKind refKind,
175RefKind refKind,
265=> CreateParameterSymbol(RefKind.None, type, name);
267public static IParameterSymbol CreateParameterSymbol(RefKind refKind, ITypeSymbol type, string name)
277ImmutableArray<AttributeData> attributes, RefKind refKind, bool isParams, ITypeSymbol type, string name, bool isOptional = false, bool hasDefaultValue = false, object? defaultValue = null)
288RefKind? refKind = null,
392refKind: RefKind.None,
464RefKind refKind,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
AbstractDoNotCopyValue.cs (70)
399var parameterRefKind = operation.Parameter.RefKind;
400var sourceRefKind = Acquire(operation.Value);
502if (!operation.IsRef && Acquire(operation) != RefKind.None)
575case RefKind.None:
576case RefKind.Ref or RefKind.RefReadOnly or RefKindEx.RefReadOnlyParameter when operation.Conversion.IsIdentity:
864&& Acquire(instance) is RefKind.In or RefKindEx.RefReadOnlyParameter)
1023if (Acquire(operation) != RefKind.None)
1031&& Acquire(instance) is RefKind.In or RefKindEx.RefReadOnlyParameter)
1097if (returnedValue is not null && Acquire(returnedValue) != RefKind.None)
1103else if (returnedValue is IParameterReferenceOperation { Parameter.RefKind: RefKind.None })
1107else if (operation.GetRefKind(_context.OwningSymbol) == RefKind.None && Cache.IsNonCopyableType(returnedValue.Type))
1124var sourceRefKind = Acquire(value);
1128&& sourceRefKind != RefKind.None)
1265if (Acquire(resource) != RefKind.None)
1283var localRefKind = symbol.RefKind;
1284var sourceRefKind = Acquire(operation.Initializer?.Value);
1309var localRefKind = operation.Symbol.RefKind;
1310var sourceRefKind = Acquire(operation.Initializer?.Value);
1350private static bool CanAssign(RefKind sourceRefKind, RefKind targetRefKind)
1354(RefKind.None, _) => true,
1355(RefKind.Ref, RefKind.Ref or RefKind.RefReadOnly or RefKindEx.RefReadOnlyParameter) => true,
1356(RefKind.RefReadOnly or RefKindEx.RefReadOnlyParameter, RefKind.RefReadOnly or RefKindEx.RefReadOnlyParameter) => true,
1361protected RefKind Acquire(IOperation? operation)
1364return RefKind.RefReadOnly;
1369return RefKind.Ref;
1376=> RefKind.None,
1389{ ReturnsByRefReadonly: true } => RefKind.RefReadOnly,
1390{ ReturnsByRef: true } => RefKind.Ref,
1391_ => RefKind.None,
1395return RefKind.None;
1399return field.IsReadOnly ? RefKind.RefReadOnly : RefKind.Ref;
1402return _context.OwningSymbol.IsReadOnly() ? RefKind.RefReadOnly : RefKind.Ref;
1407{ ReturnsByRefReadonly: true } => RefKind.RefReadOnly,
1408{ ReturnsByRef: true } => RefKind.Ref,
1409_ => RefKind.None,
1413return RefKind.None;
1417return local.RefKind == RefKind.RefReadOnly ? RefKind.RefReadOnly : RefKind.Ref;
1420return RefKind.None;
1424return parameter.RefKind is RefKind.In or RefKindEx.RefReadOnlyParameter ? parameter.RefKind : RefKind.Ref;
1433{ ReturnsByRefReadonly: true } => RefKind.RefReadOnly,
1434{ ReturnsByRef: true } => RefKind.Ref,
1435_ => RefKind.None,
1439return RefKind.None;
1442return RefKind.None;
1445return RefKind.RefReadOnly;
1449static RefKind CombineRestrictions(RefKind first, RefKind second)
1453(RefKind.RefReadOnly or RefKindEx.RefReadOnlyParameter, _) => RefKind.RefReadOnly,
1454(_, RefKind.RefReadOnly or RefKindEx.RefReadOnlyParameter) => RefKind.RefReadOnly,
1455(RefKind.Out, _) => RefKind.Out,
1456(_, RefKind.Out) => RefKind.Out,
1457(RefKind.None, RefKind.None) => RefKind.None,
1458_ => RefKind.Ref,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\CodeGenerationSymbolFactory.cs (10)
48RefKind refKind,
79ITypeSymbol type, RefKind refKind, ImmutableArray<IPropertySymbol> explicitInterfaceImplementations, string name,
153RefKind refKind,
175RefKind refKind,
265=> CreateParameterSymbol(RefKind.None, type, name);
267public static IParameterSymbol CreateParameterSymbol(RefKind refKind, ITypeSymbol type, string name)
277ImmutableArray<AttributeData> attributes, RefKind refKind, bool isParams, ITypeSymbol type, string name, bool isOptional = false, bool hasDefaultValue = false, object? defaultValue = null)
288RefKind? refKind = null,
392refKind: RefKind.None,
464RefKind refKind,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\roslyn\src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,