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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
src\Analyzers\Core\Analyzers\RemoveUnusedParametersAndValues\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (2)
544case RefKind.Out:
551case RefKind.Ref:
src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateDeconstructMethodService.State.cs (1)
76refKind: RefKind.None,
src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateMethodService.State.cs (1)
254refKind: RefKind.None,
src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.cs (8)
144document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None));
158document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None));
172document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None));
220parameter.RefKind is RefKind.Out ||
245private static RefKind GetRefKindFromContext(State state)
249return RefKind.Ref;
253return RefKind.RefReadOnly;
257return RefKind.None;
src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.GenerateParameterCodeAction.cs (1)
49RefKind.None,
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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
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)
405internal RefKind RefKind { get; }
407internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
415public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
614if (indexerAccess.Indexer.RefKind != RefKind.None)
637var useSetAccessor = coreValueKind == BindValueKind.Assignable && indexerAccess.Indexer.RefKind != RefKind.Ref;
646ArrayBuilder<RefKind>? refKindsBuilderOpt;
649refKindsBuilderOpt = ArrayBuilder<RefKind>.GetInstance(accessorForDefaultArguments.ParameterCount);
1333if (localSymbol.RefKind == RefKind.RefReadOnly ||
1334(localSymbol.RefKind == RefKind.None && !localSymbol.IsWritableVariable))
1342if (localSymbol.RefKind == RefKind.None)
1374if (localSymbol.RefKind == RefKind.None)
1415if (parameterSymbol.RefKind is RefKind.In or RefKind.RefReadOnlyParameter && RequiresAssignableVariable(valueKind))
1420else if (parameterSymbol.RefKind == RefKind.None && RequiresRefAssignableVariable(valueKind))
1426Debug.Assert(parameterSymbol.RefKind != RefKind.None || !RequiresRefAssignableVariable(valueKind));
1430if (parameterSymbol.RefKind == RefKind.None &&
1434Debug.Assert(backingField.RefKind == RefKind.None);
1439Debug.Assert(backingField.RefKind == RefKind.None);
1529{ RefKind: RefKind.Out, UseUpdatedEscapeRules: true } => SafeContext.ReturnOnly,
1541{ RefKind: RefKind.None } => SafeContext.CurrentMethod,
1543{ HasUnscopedRefAttribute: true, UseUpdatedEscapeRules: true, RefKind: RefKind.Out } => SafeContext.ReturnOnly,
1576Debug.Assert(parameterSymbol.RefKind == RefKind.None || isRefScoped || refSafeToEscape.IsReturnOnly);
1626if ((fieldSymbol.RefKind == RefKind.None ? RequiresAssignableVariable(valueKind) : RequiresRefAssignableVariable(valueKind)) &&
1638case RefKind.None:
1640case RefKind.Ref:
1642case RefKind.RefReadOnly:
1662case RefKind.None:
1665case RefKind.Ref:
1666case RefKind.RefReadOnly:
1686case RefKind.None:
1688case RefKind.Ref:
1689case RefKind.RefReadOnly:
1789if (fieldSymbol.RefKind != RefKind.None)
1813if (fieldSymbol.RefKind != RefKind.None)
1949if (RequiresVariable(valueKind) && methodSymbol.RefKind == RefKind.None)
1964if (RequiresAssignableVariable(valueKind) && methodSymbol.RefKind == RefKind.RefReadOnly)
1995propertySymbol.RefKind == RefKind.None)
2019if (RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.RefReadOnly)
2025var requiresSet = RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.None;
2094var requiresGet = !RequiresAssignmentOnly(valueKind) || propertySymbol.RefKind != RefKind.None;
2358(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2437result.ArgumentRefKindsOpt = [RefKind.None, .. methodInvocationInfo.ArgumentRefKindsOpt];
2524var valid = effectiveRefKind != RefKind.None && isRefEscape ?
2586(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2717var refKind = parameter?.RefKind ?? RefKind.None;
2722if (refKind == RefKind.None &&
2723parameter?.RefKind is RefKind.In or RefKind.RefReadOnlyParameter)
2758if (getArgument.RefKind == RefKind.Ref)
2764if (setArgument.RefKind == RefKind.Ref)
2780return new EscapeArgument(parameter: null, receiver, RefKind.None);
2783var refKind = RefKind.None;
2803ImmutableArray<RefKind> argRefKindsOpt,
2810var refKind = argRefKindsOpt.IsDefault ? RefKind.None : argRefKindsOpt[argIndex];
2813if (refKind == RefKind.Ref && mixableArguments is not null)
2952return parameter.RefKind == RefKind.Ref &&
3023if (refKind != RefKind.None)
3036if (parameter.Type.IsRefLikeOrAllowsRefLikeType() && parameter.RefKind != RefKind.Out && GetParameterValEscapeLevel(parameter) is { } valEscapeLevel)
3043if (parameter.RefKind != RefKind.None && GetParameterRefEscapeLevel(parameter) is { } refEscapeLevel)
3107if (parameter.RefKind != RefKind.None && !parameter.IsThis)
3377Debug.Assert(underlyingParameter.RefKind != RefKind.Out); // Shouldn't get here for a constructor
3387public override RefKind RefKind
3391if (_underlyingParameter.RefKind is not RefKind.None and var underlyingRefKind)
3398return RefKind.None;
3403return RefKind.Ref;
3613Debug.Assert(field.RefKind == RefKind.None ? RequiresAssignableVariable(kind) : RequiresRefAssignableVariable(kind));
3815if (methodSymbol.RefKind == RefKind.None)
3830if (methodSymbol.RefKind == RefKind.None)
3875if (methodSymbol.RefKind == RefKind.None)
3895Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
3900ImmutableArray<RefKind> refKinds;
3903Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
3934conversion.Conversion.Method.RefKind == RefKind.None));
3941unaryMethod.RefKind == RefKind.None));
3948binaryMethod.RefKind == RefKind.None));
3954logicalOperator.LogicalOperator.RefKind == RefKind.None));
3961compoundMethod.RefKind == RefKind.None));
3968incrementMethod.RefKind == RefKind.None));
4101if (methodSymbol.RefKind == RefKind.None)
4120if (indexerSymbol.RefKind == RefKind.None)
4144if (indexerSymbol.RefKind == RefKind.None)
4168if (methodSymbol.RefKind == RefKind.None)
4192Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
4197ImmutableArray<RefKind> refKinds;
4200Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
4215if (signature.RefKind == RefKind.None)
4232if (propertySymbol.RefKind == RefKind.None)
4272conversion.Conversion.Method.RefKind == RefKind.None);
4279unaryMethod.RefKind == RefKind.None));
4286binaryMethod.RefKind == RefKind.None));
4292logicalOperator.LogicalOperator.RefKind == RefKind.None));
4299compoundMethod.RefKind == RefKind.None));
4306incrementMethod.RefKind == RefKind.None));
4527ImmutableArray<RefKind> refKinds;
4610ImmutableArray<RefKind> refKinds;
4967var accessorKind = property.RefKind == RefKind.None ? AccessorKind.Set : AccessorKind.Get;
5229ImmutableArray<RefKind> refKinds;
5354ImmutableArray<RefKind> refKinds;
5661private SignatureOnlyMethodSymbol GetInlineArrayAccessEquivalentSignatureMethod(BoundInlineArrayAccess elementAccess, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5663RefKind resultRefKind;
5664RefKind parameterRefKind;
5675resultRefKind = RefKind.None;
5676parameterRefKind = RefKind.None;
5680resultRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__get_Item ? RefKind.In : RefKind.Ref;
5689resultRefKind = RefKind.None;
5690parameterRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__Slice_Int_Int ? RefKind.In : RefKind.Ref;
5723private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundConversion conversion, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5729private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundExpression inlineArray, TypeSymbol resultType, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5735RefKind parameterRefKind = resultType.OriginalDefinition.Equals(_compilation.GetWellKnownType(WellKnownType.System_ReadOnlySpan_T), TypeCompareKind.AllIgnoreOptions) ? RefKind.In : RefKind.Ref;
5750RefKind.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())
2121if (parameter.RefKind != RefKind.None)
2141(parameter.RefKind != RefKind.None || parameter.Type.IsRestrictedType()) &&
2144if (parameter.RefKind != RefKind.None)
2158else if (primaryCtor is { ThisParameter.RefKind: not RefKind.None } &&
2311if (localSymbol.RefKind == RefKind.None && type.IsRestrictedType(ignoreSpanLikeTypes: true))
2617if (thisSymbol is not null && thisSymbol.ContainingSymbol != ContainingMemberOrLambda && thisSymbol.RefKind != RefKind.None)
3171RefKind origRefKind = argumentSyntax.RefOrOutKeyword.Kind().GetRefKind();
3175RefKind refKind = origRefKind == RefKind.None || RefMustBeObeyed(isDelegateCreation, argumentSyntax) ? origRefKind : RefKind.None;
3188if (!hadError && isDelegateCreation && origRefKind != RefKind.None && result.Arguments.Count == 1)
3195var requiredValueKind = origRefKind == RefKind.In ? BindValueKind.ReadonlyRef : BindValueKind.RefOrOut;
3207private BoundExpression BindArgumentValue(BindingDiagnosticBag diagnostics, ArgumentSyntax argumentSyntax, bool allowArglist, RefKind refKind)
3408RefKind refKind)
3416if (refKind != RefKind.None)
3426result.RefKinds.Add(RefKind.None);
3474private BoundExpression BindArgumentExpression(BindingDiagnosticBag diagnostics, ExpressionSyntax argumentExpression, RefKind refKind, bool allowArglist)
3477refKind == RefKind.None ?
3479refKind == RefKind.In ?
3850var argumentRefKindsBuilder = ArrayBuilder<RefKind>.GetInstance(handlerArgumentIndexes.Length);
3860RefKind refKind;
3866refKind = RefKind.None;
3952argumentRefKindsBuilder.Add(refKind == RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
3976private void CheckArgumentRefKind(RefKind argRefKind, BoundExpression argument, int arg, ParameterSymbol parameter,
3988if (argRefKind is RefKind.None or RefKind.In && parameter.RefKind == RefKind.RefReadOnlyParameter)
4000if (argRefKind == RefKind.Ref)
4002if (parameter.RefKind == RefKind.In)
4012else if (argRefKind == RefKind.None && parameter.RefKind == RefKind.RefReadOnlyParameter)
5118if (analyzedArguments.RefKind(i) is (RefKind.Ref or RefKind.Out))
5715ArrayBuilder<RefKind> refKinds,
5908var rhsExpr = initializer.Right.CheckAndUnwrapRefExpression(diagnostics, out RefKind refKind);
5909bool isRef = refKind == RefKind.Ref;
6082ImmutableArray<RefKind> argumentRefKindsOpt = default;
8604extensionMethodArguments.RefKinds.Add(RefKind.None);
8754RefKind returnRefKind,
8836RefKind returnRefKind,
8946RefKind returnRefKind,
9209fieldSymbol.RefKind != RefKind.None)
10191RefKind refKind = analyzedArguments.RefKind(i);
10192if (refKind != RefKind.None)
10291default(ImmutableArray<RefKind>),
10409ImmutableArray<RefKind> argumentRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
10660original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None })
10761original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None } &&
10762original.Parameters[1] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None };
10825getMethod.RefKind == RefKind.None &&
10869RefKind returnRefKind = default,
10893RefKind returnRefKind = default,
10925RefKind returnRefKind = default,
10996RefKind returnRefKind = default,
11462RefKind? returnRefKindOverride = null,
11469var returnRefKind = returnRefKindOverride ?? methodSymbol.RefKind;
11487if (returnsVoid && returnRefKind != RefKind.None)
11501returnRefKind == RefKind.None &&
11503(parameterRefKinds.IsDefault || parameterRefKinds.All(refKind => refKind == RefKind.None)) &&
11537parameterRefKinds.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,
3189Debug.Assert(returnRefKind == RefKind.None);
3211if (returnRefKind != RefKind.None)
3227RefKind unusedRefKind;
3497internal BoundBlock CreateBlockFromExpression(CSharpSyntaxNode node, ImmutableArray<LocalSymbol> locals, RefKind refKind, BoundExpression expression, ExpressionSyntax expressionSyntax, BindingDiagnosticBag diagnostics)
3499RefKind returnRefKind;
3504if (IsInAsyncMethod() && refKind != RefKind.None)
3513if ((refKind != RefKind.None) != (returnRefKind != RefKind.None) && expression.Kind != BoundKind.ThrowExpression)
3515var errorCode = refKind != RefKind.None
3520statement = new BoundReturnStatement(syntax, RefKind.None, expression, @checked: CheckOverflowAtRuntime) { WasCompilerGenerated = true };
3624RefKind refKind;
3640RefKind refKind;
3653return bodyBinder.CreateBlockFromExpression(body, bodyBinder.GetDeclaredLocalsForScope(body), RefKind.None, expression, body, diagnostics);
3656private BindValueKind GetRequiredReturnValueKind(RefKind refKind)
3659if (refKind != RefKind.None)
3661GetCurrentReturnType(out var sigRefKind);
3662requiredValueKind = sigRefKind == RefKind.Ref ?
4013argumentRefKindsOpt: ImmutableArray<RefKind>.Empty,
Binder\Semantics\OverloadResolution\OverloadResolution.cs (83)
145RefKind returnRefKind = default,
193RefKind returnRefKind = default,
434RefKind returnRefKind,
850RefKind? returnRefKind,
875else if (returnRefKind == RefKind.None)
2184var type1 = getParameterTypeAndRefKind(i, m1.Result, m1LeastOverriddenParameters, m1.Result.ParamsElementTypeOpt, m1.LeastOverriddenMember, out RefKind parameter1RefKind);
2186var type2 = getParameterTypeAndRefKind(i, m2.Result, m2LeastOverriddenParameters, m2.Result.ParamsElementTypeOpt, m2.LeastOverriddenMember, out RefKind parameter2RefKind);
2576TypeWithAnnotations paramsElementTypeOpt, TMember member, out RefKind parameterRefKind)
2641RefKind refKind1 = GetParameterBetternessRefKind(p1, m1.Member);
2642RefKind refKind2 = GetParameterBetternessRefKind(p2, m2.Member);
2644if (refKind1 == RefKind.None && isAcceptableRefMismatch(refKind2, isInterpolatedStringHandlerConversion))
2655else if (refKind2 == RefKind.None && isAcceptableRefMismatch(refKind1, isInterpolatedStringHandlerConversion))
2672static bool isAcceptableRefMismatch(RefKind refKind, bool isInterpolatedStringHandlerConversion)
2676RefKind.In or RefKind.RefReadOnlyParameter => true,
2677RefKind.Ref when isInterpolatedStringHandlerConversion => true,
2683private static RefKind GetParameterBetternessRefKind<TMember>(ParameterSymbol parameter, TMember member) where TMember : Symbol
2690return isExtensionParameterOfStaticExtensionMember ? RefKind.None : parameter.RefKind;
2888RefKind refKind1,
2891RefKind refKind2,
2916Debug.Assert(refKind1 == RefKind.None || refKind1 == RefKind.Ref);
2917Debug.Assert(refKind2 == RefKind.None || refKind2 == RefKind.Ref);
2921if (refKind1 == RefKind.None)
2930else if (refKind1 == RefKind.Ref)
3854ArrayBuilder<RefKind> argumentRefKinds,
3860out ImmutableArray<RefKind> parameterRefKinds)
3876internal readonly ImmutableArray<RefKind> ParameterRefKinds;
3879internal EffectiveParameters(ImmutableArray<TypeWithAnnotations> types, ImmutableArray<RefKind> refKinds, int firstParamsElementIndex)
3893ArrayBuilder<RefKind> argumentRefKinds,
3914hasSomeRefKinds |= member.ContainingType.ExtensionParameter.RefKind != RefKind.None;
3925ArrayBuilder<RefKind> refs = null;
3939RefKind argRefKind = hasAnyRefArg ? argumentRefKinds[arg] : RefKind.None;
3940RefKind paramRefKind = GetEffectiveParameterRefKind(parameter, argRefKind, options, binder, ref hasAnyRefOmittedArgument);
3944if (paramRefKind != RefKind.None)
3946refs = ArrayBuilder<RefKind>.GetInstance(arg, RefKind.None);
3956var refKinds = refs != null ? refs.ToImmutableAndFree() : default(ImmutableArray<RefKind>);
3960private static RefKind GetEffectiveParameterRefKind(
3962RefKind argRefKind,
3967var paramRefKind = parameter.RefKind;
3976if (paramRefKind == RefKind.In)
3978if (argRefKind == RefKind.None)
3980return RefKind.None;
3983if (argRefKind == RefKind.Ref && binder.Compilation.IsFeatureEnabled(MessageID.IDS_FeatureRefReadonlyParameters))
3985return RefKind.Ref;
3988else if (paramRefKind == RefKind.RefReadOnlyParameter && argRefKind is RefKind.None or RefKind.Ref or RefKind.In)
4001if ((options & Options.AllowRefOmittedArguments) != 0 && paramRefKind == RefKind.Ref && argRefKind == RefKind.None && !binder.InAttributeArgument)
4004return RefKind.None;
4013internal static bool AreRefsCompatibleForMethodConversion(RefKind candidateMethodParameterRefKind, RefKind delegateParameterRefKind, CSharpCompilation compilation)
4023(RefKind.RefReadOnlyParameter, RefKind.Ref) or
4024(RefKind.RefReadOnlyParameter, RefKind.In) or
4025(RefKind.In, RefKind.RefReadOnlyParameter))
4031(candidateMethodParameterRefKind, delegateParameterRefKind) is (RefKind.In, RefKind.Ref))
4043ArrayBuilder<RefKind> argumentRefKinds,
4054ArrayBuilder<RefKind> argumentRefKinds,
4062var refs = ArrayBuilder<RefKind>.GetInstance();
4092var argRefKind = hasAnyRefArg ? argumentRefKinds[arg] : RefKind.None;
4093var paramRefKind = GetEffectiveParameterRefKind(parameter, argRefKind, options, binder, ref hasAnyRefOmittedArgument);
4096if (paramRefKind != RefKind.None)
4102var refKinds = anyRef ? refs.ToImmutable() : default(ImmutableArray<RefKind>);
4574RefKind argumentRefKind = arguments.RefKind(argumentPosition);
4575RefKind parameterRefKind = parameters.ParameterRefKinds.IsDefault ? RefKind.None : parameters.ParameterRefKinds[argumentPosition];
4580if (argumentRefKind == RefKind.None)
4582if (parameterRefKind == RefKind.Ref)
4601&& parameterRefKind == RefKind.Ref
4697RefKind argRefKind,
4699RefKind parRefKind,
4736Debug.Assert(argRefKind != RefKind.None);
4742if (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))
821var returnType = DelegateReturnTypeWithAnnotations(invokeMethod, out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers);
840refKind == CodeAnalysis.RefKind.None &&
861if (lambdaSymbol.RefKind == CodeAnalysis.RefKind.RefReadOnly)
928ImmutableArray<RefKind> parameterRefKinds,
929RefKind refKind,
945var returnType = DelegateReturnTypeWithAnnotations(invokeMethod, out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers);
978ImmutableArray<RefKind> parameterRefKinds)
980bool hasExplicitReturnType = HasExplicitReturnType(out var refKind, out ImmutableArray<CustomModifier> refCustomModifiers, out var returnType);
1008Debug.Assert(refKind != CodeAnalysis.RefKind.RefReadOnly);
1034Debug.Assert(refKind != CodeAnalysis.RefKind.RefReadOnly);
1044ImmutableArray<RefKind> parameterRefKinds,
1046RefKind refKind,
1083public readonly ImmutableArray<RefKind> ParameterRefKinds;
1086public static readonly ReturnInferenceCacheKey Empty = new ReturnInferenceCacheKey(ImmutableArray<TypeWithAnnotations>.Empty, ImmutableArray<RefKind>.Empty, null);
1088private ReturnInferenceCacheKey(ImmutableArray<TypeWithAnnotations> parameterTypes, ImmutableArray<RefKind> parameterRefKinds, NamedTypeSymbol? taskLikeReturnTypeOpt)
1149out ImmutableArray<RefKind> parameterRefKinds,
1155parameterRefKinds = ImmutableArray<RefKind>.Empty;
1164var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameterCount);
1240?? rebind(ReallyInferReturnType(delegateType: null, ImmutableArray<TypeWithAnnotations>.Empty, ImmutableArray<RefKind>.Empty));
1257ImmutableArray<RefKind> parameterRefKinds)
1260var refKind = inferredReturnType.RefKind;
1274refKind = CodeAnalysis.RefKind.None;
1488private readonly RefKind _returnRefKind;
1495private readonly ImmutableArray<RefKind> _parameterRefKinds;
1504RefKind returnRefKind,
1511ImmutableArray<RefKind> parameterRefKinds,
1537public override bool HasExplicitReturnType(out RefKind refKind, out ImmutableArray<CustomModifier> refCustomModifiers, out TypeWithAnnotations returnType)
1598public override RefKind RefKind(int index)
1601return _parameterRefKinds.IsDefault ? Microsoft.CodeAnalysis.RefKind.None : _parameterRefKinds[index];
1635statements[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;
2241return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
2244return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
2247return ((BoundCall)receiver).Method.RefKind != RefKind.None;
2250return ((BoundFunctionPointerInvocation)receiver).FunctionPointer.Signature.RefKind != RefKind.None;
2253return ((BoundDup)receiver).RefKind != RefKind.None;
2665if (System.Linq.ImmutableArrayExtensions.All(ctor.Parameters, p => p.RefKind == RefKind.None) &&
2796return ((BoundParameter)left).ParameterSymbol.RefKind == RefKind.None;
2801return ((BoundLocal)left).LocalSymbol.RefKind == RefKind.None;
2821if (left.FieldSymbol.RefKind != RefKind.None &&
2839if (left.ParameterSymbol.RefKind != RefKind.None &&
2871if (left.LocalSymbol.RefKind != RefKind.None && !assignmentOperator.IsRef)
2970Debug.Assert(left.Method.RefKind != RefKind.None);
2981Debug.Assert(left.FunctionPointer.Signature.RefKind != RefKind.None);
3033LocalDefinition temp = EmitAddress(assignmentOperator.Right, lhs.GetRefKind() is RefKind.RefReadOnly or RefKindExtensions.StrictIn or RefKind.RefReadOnlyParameter ? AddressKind.ReadOnlyStrict : AddressKind.Writeable);
3116if (local.LocalSymbol.RefKind != RefKind.None && !assignment.IsRef)
3149Debug.Assert(((BoundDup)expression).RefKind != RefKind.None);
3172Debug.Assert(((BoundCall)expression).Method.RefKind != RefKind.None);
3177Debug.Assert(((BoundFunctionPointerInvocation)expression).FunctionPointer.Signature.RefKind != RefKind.None);
3321if (field.RefKind != RefKind.None && !refAssign)
3336if (parameter.ParameterSymbol.RefKind != RefKind.None && !refAssign)
4133if (useKind == UseKind.UsedAsValue && method.RefKind != RefKind.None)
4139Debug.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) &&
2174var isIndirectLocalStore = left.LocalSymbol.RefKind != RefKind.None && !node.IsRef;
2203left.LocalSymbol.RefKind == RefKind.Ref &&
2440public override RefKind RefKind
2442get { 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)
1131VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), null, default, false);
1292VisitRvalue(node.InitializerOpt, isKnownToBeAnLvalue: node.LocalSymbol.RefKind != RefKind.None);
1295if (node.LocalSymbol.RefKind != RefKind.None)
1436WriteArgument(receiverOpt, RefKind.Ref, method: null);
1442var thisRefKind = thisParameter.RefKind;
1516protected virtual void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1523private void VisitArgumentsBeforeCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt)
1528RefKind refKind = GetRefKind(refKindsOpt, i);
1529if (refKind != RefKind.Out)
1531VisitRvalue(arguments[i], isKnownToBeAnLvalue: refKind != RefKind.None);
1544private void VisitArgumentsAfterCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol? method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1548RefKind refKind = GetRefKind(refKindsOpt, i);
1551case RefKind.None:
1552case RefKind.In:
1553case RefKind.RefReadOnlyParameter:
1556case RefKind.Ref:
1559goto case RefKind.Out;
1562case RefKind.Out:
1573protected static RefKind GetRefKind(ImmutableArray<RefKind> refKindsOpt, int index)
1575return refKindsOpt.IsDefault || refKindsOpt.Length <= index ? RefKind.None : refKindsOpt[index];
1578protected virtual void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2032VisitRvalue(node.ExpressionOpt, isKnownToBeAnLvalue: node.RefKind != RefKind.None);
2035if (node.RefKind != RefKind.None)
2146if (property.RefKind == RefKind.None)
2164var refKind = node.Left.Kind == BoundKind.BadExpression
2165? RefKind.Ref
2201if (property.RefKind == RefKind.None)
2220if (property.RefKind == RefKind.None)
2837if (property.RefKind == RefKind.None)
3339WriteArgument(operand, RefKind.Ref, method: null);
3525this.WriteArgument(operand, RefKind.Out, null); //Out because we know it will definitely be assigned.
3566VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.Constructor, default, false);
3650VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod, node.ArgsToParamsOpt, node.Expanded);
3656VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod, node.ArgsToParamsOpt, node.Expanded);
3664VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), method: null, default, false);
3756property.RefKind == RefKind.None)
FlowAnalysis\DefiniteAssignment.cs (21)
350NoteWrite(parameter, value: null, read: true, isRef: parameter.RefKind != RefKind.None);
811write: field.RefKind == RefKind.None || isRef);
923write: field.RefKind == RefKind.None || isRef);
1186((ParameterSymbol)symbol).RefKind == RefKind.Out)
1286if (fieldSymbol.RefKind != RefKind.None)
1470if (!isRef && node is BoundFieldAccess { FieldSymbol.RefKind: not RefKind.None } fieldAccess)
1523if (local.LocalSymbol.RefKind != RefKind.None && !isRef)
1574if (isRef && param.RefKind == RefKind.Out)
1592write: field.RefKind == RefKind.None || isRef);
1766if (parameter.RefKind != RefKind.Out)
1778if (thisParameter.RefKind != RefKind.Out)
1790if (extensionParameter.RefKind != RefKind.Out)
1813if (current is not MethodSymbol && parameter.RefKind == RefKind.Out)
1843if (parameter.RefKind == RefKind.Out && !(this.CurrentSymbol is MethodSymbol currentMethod && currentMethod.IsAsync)) // out parameters not allowed in async
1851NoteWrite(parameter, value: null, read: true, isRef: parameter.RefKind != RefKind.None);
1909if (!parameter.IsThis && parameter.RefKind != RefKind.Out && parameter.ContainingSymbol is SynthesizedPrimaryConstructor primaryCtor)
1921if (parameter.RefKind != RefKind.None)
2523protected override void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2525if (refKind == RefKind.Ref)
2539if (refKind != RefKind.None && ((object)method == null || method.IsExtern) && arg.Type is TypeSymbol type)
2731NoteWrite(iterationVariable, null, read: true, isRef: iterationVariable.RefKind != RefKind.None);
FlowAnalysis\NullableWalker.cs (66)
1365var refKind = parameter.RefKind;
1366if (refKind != RefKind.Out && refKind != RefKind.Ref)
2492RefKind refKind,
2502if (refKind == RefKind.Ref)
2505return AreParameterAnnotationsCompatible(RefKind.None, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations, forRef: true) &&
2506AreParameterAnnotationsCompatible(RefKind.Out, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations);
2509if (refKind is RefKind.None or RefKind.In or RefKind.RefReadOnlyParameter)
2539if (refKind == RefKind.Out)
3003if (parameter.RefKind != RefKind.Out)
3076if (node.RefKind == RefKind.None &&
3085if (node.RefKind == RefKind.None)
4490ImmutableArray<RefKind> refKindsOpt = objectInitializer.ArgumentRefKindsOpt;
6732var refKind = isExtensionBlockMethod ? GetExtensionReceiverRefKind(node.Method) : GetRefKind(node.ArgumentRefKindsOpt, 0);
6868ImmutableArray<RefKind> refKindsOpt,
6925internal static ImmutableArray<RefKind> AdjustArgumentRefKindsIfNeeded(ImmutableArray<RefKind> argumentRefKindsOpt, bool adjustForExtensionBlockMethod,
6934RefKind receiverRefKind = GetExtensionReceiverRefKind(member);
6938if (receiverRefKind == RefKind.None)
6943var builder = ArrayBuilder<RefKind>.GetInstance(argumentCount + 1, fillWithValue: RefKind.None);
6951private static RefKind GetExtensionReceiverRefKind(Symbol member)
6958return extensionParameter.RefKind == RefKind.Ref ? RefKind.Ref : RefKind.None;
7391protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7400ImmutableArray<RefKind> refKindsOpt,
7414ImmutableArray<RefKind> refKindsOpt,
7442ImmutableArray<RefKind> refKindsOpt,
7483ImmutableArray<RefKind> refKindsOpt,
7672ImmutableArray<RefKind> refKindsOpt,
7690static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7750var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(refKindsOpt.Length + elements.Length - 1);
7752refKindsBuilder.AddMany(RefKind.None, elements.Length);
7925ImmutableArray<RefKind> refKindsOpt,
7986private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
7998private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8004case RefKind.Ref:
8007case RefKind.None:
8008case RefKind.In:
8030case RefKind.Out:
8053RefKind refKind,
8068case RefKind.None:
8069case RefKind.In:
8107case RefKind.Ref:
8127case RefKind.Out:
8190RefKind refKind,
8203case RefKind.None:
8204case RefKind.In:
8210case RefKind.Ref:
8237case RefKind.Out:
8443ImmutableArray<RefKind> refKindsOpt)
8454RefKind refKind = GetRefKind(refKindsOpt, i);
8457if (refKind == RefKind.None)
8525ImmutableArray<RefKind> argumentRefKindsOpt,
8535var refKinds = ArrayBuilder<RefKind>.GetInstance();
8556parameterRefKinds: out ImmutableArray<RefKind> parameterRefKinds);
10924case BoundLocal { LocalSymbol.RefKind: RefKind.None }:
10925case BoundParameter { ParameterSymbol: { RefKind: RefKind.None } parameter } when
11654ImmutableArray<RefKind> refKindsOpt = extensionParameter.RefKind == RefKind.Ref ? [RefKind.Ref] : default;
13136TypeWithAnnotations elementType = InMethodBinder.GetIteratorElementTypeFromReturnType(compilation, RefKind.None,
13178VisitArguments(node, node.ConstructorArguments, ImmutableArray<RefKind>.Empty, node.Constructor, argsToParamsOpt: node.ConstructorArgumentsToParamsOpt, defaultArguments: node.ConstructorDefaultArguments,
Generated\BoundNodes.xml.Generated.cs (40)
930public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type, bool hasErrors)
936public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type)
942public RefKind RefKind { get; }
947public BoundDup Update(RefKind refKind, TypeSymbol? type)
1470public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1487public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
1493public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
3116public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3128public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
3133public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3622public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3634public RefKind RefKind { get; }
3641public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
5948public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5964public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
5970public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6198public 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)
6231public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6243public 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)
6341public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6358public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6365public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6400public 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)
6426public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6437public 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)
6498public BoundUnconvertedWithElement(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool hasErrors = false)
6511public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6516public BoundUnconvertedWithElement Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt)
6722public 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)
6743public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6751public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6844public 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)
6868public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6879public 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)
7512public 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)
7539public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7549public 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)
7653public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7673public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7679public 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;
667ImmutableArray<RefKind> argumentRefKindsOpt,
688RefKind refKind;
706refKind = rewrittenReceiver.Type.IsValueType || rewrittenReceiver.Type.Kind == SymbolKind.TypeParameter ? RefKind.Ref : RefKind.None;
712refKind = RefKind.None;
718if (refKind == RefKind.None &&
725refKind = RefKind.Ref;
731receiverTemp = _factory.StoreToTemp(rewrittenReceiver, out assignmentToTemp, refKind is RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
898RefKind argRefKind = argumentRefKindsOpt.RefKinds(argIndex);
899RefKind paramRefKind = parameters[paramIndex].RefKind;
901local = _factory.StoreToTemp(visitedArgument, out var store, refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter ? RefKind.In : argRefKind);
949private RefKind GetExtensionBlockMemberReceiverCaptureRefKind(BoundExpression rewrittenReceiver, Symbol methodOrIndexer)
954RefKind receiverRefKind = methodOrIndexer.ContainingType.ExtensionParameter.RefKind;
955bool isReceiverTakenByValue = receiverRefKind == RefKind.None;
960return RefKind.None;
974return RefKind.None;
977RefKind refKind = ExtensionMethodReferenceRewriter.ReceiverArgumentRefKindFromReceiverRefKind(receiverRefKind);
988return RefKind.None;
1063ref ImmutableArray<RefKind> argumentRefKindsOpt,
1146ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
1216private static ImmutableArray<RefKind> GetEffectiveArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters)
1218ArrayBuilder<RefKind>? refKindsBuilder = null;
1221var paramRefKind = parameters[i].RefKind;
1222var currentArgRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
1223var effectiveArgRefKind = GetEffectiveRefKind(paramRefKind, currentArgRefKind, parameters[i].Type, comRefKindMismatchPossible: false);
1241static void fillRefKindsBuilder(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters, [NotNull] ref ArrayBuilder<RefKind>? refKindsBuilder)
1248refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length);
1253refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length, fillWithValue: RefKind.None);
1259internal static RefKind GetEffectiveRefKind(RefKind paramRefKind, RefKind initialArgRefKind, TypeSymbol paramType, bool comRefKindMismatchPossible)
1267if (paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter)
1269Debug.Assert(initialArgRefKind is RefKind.None or RefKind.In or RefKind.Ref);
1270return initialArgRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn;
1272else if (paramRefKind == RefKind.Ref && initialArgRefKind == RefKind.None)
1278return RefKind.Ref;
1340private static ImmutableArray<RefKind> GetRefKindsOrNull(ArrayBuilder<RefKind> refKinds)
1342foreach (var refKind in refKinds)
1344if (refKind != RefKind.None)
1349return default(ImmutableArray<RefKind>);
1402ImmutableArray<RefKind> argumentRefKinds,
1406/* out */ ArrayBuilder<RefKind> refKinds,
1418RefKind argRefKind = argumentRefKinds.RefKinds(a);
1419RefKind paramRefKind = parameters[p].RefKind;
1427Debug.Assert(argRefKind == RefKind.None);
1443arg.rewriter.StoreArgumentToTempIfNecessary(arg.forceLambdaSpilling, arg.storesToTemps, element, RefKind.None, RefKind.None),
1459private BoundExpression StoreArgumentToTempIfNecessary(bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps, BoundExpression argument, RefKind argRefKind, RefKind paramRefKind)
1471refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter
1472? (argRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn)
1526default(ImmutableArray<RefKind>),
1686ArrayBuilder<RefKind> argsRefKindsBuilder,
1699RefKind paramRefKind = parameters[argIndex].RefKind;
1700RefKind argRefKind = argsRefKindsBuilder[argIndex];
1704if (argRefKind != RefKind.None || paramRefKind != RefKind.Ref)
1712var localRefKind = ((BoundLocal)argument).LocalSymbol.RefKind;
1713if (localRefKind == RefKind.Ref)
1719Debug.Assert(localRefKind == RefKind.None);
1731argsRefKindsBuilder[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)
610RefKind collectionTempRefKind = RefKind.None;
698private delegate BoundStatement? GetForEachStatementAsForPreamble(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind);
737return static (LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind) =>
751collectionTempRefKind = 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];
903expression = Spill(leftBuilder, expression, RefKind.None);
918left = Spill(leftBuilder, VisitExpression(ref leftBuilder, left), RefKind.Ref);
950expression = Spill(leftBuilder, expression, RefKind.None);
965receiver = Spill(leftBuilder, VisitExpression(ref leftBuilder, field.ReceiverOpt), RefKind.Ref);
1045RefKind refKind = ReceiverSpillRefKind(receiver);
1047Debug.Assert(refKind == RefKind.None || !receiver.Type.IsReferenceType);
1051if (refKind != RefKind.None &&
1084private static RefKind ReceiverSpillRefKind(BoundExpression receiver)
1086var result = RefKind.None;
1089result = receiver.Type.IsReadOnly ? RefKind.In : RefKind.Ref;
1278var receiverRefKind = ReceiverSpillRefKind(node.Receiver);
1299if (receiver.Type.IsReferenceType || receiver.Type.IsValueType || receiverRefKind == RefKind.None)
1302receiver = Spill(receiverBuilder, receiver, RefKind.None);
1317receiver = Spill(receiverBuilder, receiver, RefKind.Ref);
1319var clone = _F.SynthesizedLocal(receiver.Type, _F.Syntax, refKind: RefKind.None, kind: SynthesizedLocalKind.Spill);
Lowering\SyntheticBoundNodeFactory.cs (30)
575Debug.Assert(CurrentFunction.RefKind == RefKind.None);
580return new BoundReturnStatement(Syntax, CurrentFunction.RefKind != RefKind.None ? RefKind.Ref : RefKind.None, expression, @checked: false) { WasCompilerGenerated = true };
600RefKind refKind = RefKind.None,
640return SynthesizedParameterSymbol.Create(container, TypeWithAnnotations.Create(type), ordinal, RefKind.None, name);
778public BoundObjectCreationExpression New(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKinds)
888public static ImmutableArray<RefKind> ArgumentRefKindsFromParameterRefKinds(MethodSymbol method, bool useStrictArgumentRefKinds)
892if (!result.IsDefaultOrEmpty && (result.Contains(RefKind.RefReadOnlyParameter) ||
893(useStrictArgumentRefKinds && result.Contains(RefKind.In))))
895var builder = ArrayBuilder<RefKind>.GetInstance(result.Length);
897foreach (var refKind in result)
908public static RefKind ArgumentRefKindFromParameterRefKind(RefKind refKind, bool useStrictArgumentRefKinds)
912RefKind.In or RefKind.RefReadOnlyParameter when useStrictArgumentRefKinds => RefKindExtensions.StrictIn,
913RefKind.RefReadOnlyParameter => RefKind.In,
918public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<RefKind> refKinds, ImmutableArray<BoundExpression> args)
1647RefKind refKind = RefKind.None,
1664case RefKind.Out:
1665refKind = RefKind.Ref;
1668case RefKind.In:
1677Debug.Assert(argument.GetRefKind() != RefKind.In);
1678refKind = RefKind.None;
1682case RefKind.None:
1683case RefKind.Ref:
1714isRef: refKind != RefKind.None);
Symbols\Compilation_WellKnownMembers.cs (13)
793internal SynthesizedAttributeData? SynthesizeDynamicAttribute(TypeSymbol type, int customModifiersCount, RefKind refKindOpt = RefKind.None)
798if (type.IsDynamic() && refKindOpt == RefKind.None && customModifiersCount == 0)
907internal static ImmutableArray<TypedConstant> Encode(TypeSymbol type, RefKind refKind, int customModifiersCount, TypeSymbol booleanType)
919internal static ImmutableArray<bool> Encode(TypeSymbol type, RefKind refKind, int customModifiersCount)
926internal static ImmutableArray<bool> EncodeWithoutCustomModifierFlags(TypeSymbol type, RefKind refKind)
933internal static void Encode(TypeSymbol type, int customModifiersCount, RefKind refKind, ArrayBuilder<bool> transformFlagsBuilder, bool addCustomModifierFlags)
937if (refKind != RefKind.None)
1028void handle(RefKind refKind, ImmutableArray<CustomModifier> customModifiers, TypeWithAnnotations twa)
1035if (refKind != RefKind.None)
1190return parameter.RefKind != RefKind.None;
1195return method.RefKind != RefKind.None;
1200return 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;
857RefKind refKind,
904else if (refKind != RefKind.None &&
961var refKind = GetModifiers(parameterSyntax.Modifiers, ignoreParams: inExtension, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out _);
967if (refKind == RefKind.Ref || refKind == RefKind.Out)
1076if (refKind == RefKind.RefReadOnlyParameter)
1142internal static RefKind GetModifiers(SyntaxTokenList modifiers, bool ignoreParams, out SyntaxToken refnessKeyword, out SyntaxToken paramsKeyword, out SyntaxToken thisKeyword, out ScopedKind scope)
1144var refKind = RefKind.None;
1156if (refKind == RefKind.None)
1159refKind = RefKind.Out;
1163if (refKind == RefKind.None)
1166refKind = RefKind.Ref;
1170if (refKind == RefKind.None)
1173refKind = RefKind.In;
1189if (refKind == RefKind.Ref && refnessKeyword.GetNextToken() == modifier)
1191refKind = RefKind.RefReadOnlyParameter;
1199scope = (refKind == RefKind.None) ? ScopedKind.ScopedValue : ScopedKind.ScopedRef;
1209internal static ImmutableArray<CustomModifier> ConditionallyCreateInModifiers(RefKind refKind, bool addRefReadOnlyModifier, Binder binder, BindingDiagnosticBag diagnostics, SyntaxNode syntax)
1211if (addRefReadOnlyModifier && refKind is RefKind.In or RefKind.RefReadOnlyParameter)
Symbols\Source\SourceDelegateMethodSymbol.cs (13)
28RefKind refKind,
56returnTypeSyntax = returnTypeSyntax.SkipScoped(out _).SkipRefInLocalOrReturn(diagnostics, out RefKind refKind);
218: base(delegateType, voidType, syntax, MethodKind.Constructor, RefKind.None, DeclarationModifiers.Public)
221SynthesizedParameterSymbol.Create(this, objectType, 0, RefKind.None, "object"),
222SynthesizedParameterSymbol.Create(this, intPtrType, 1, RefKind.None, "method")));
260RefKind refKind,
283if (this.RefKind == RefKind.RefReadOnly)
322if (this.RefKind == RefKind.RefReadOnly)
358: base((SourceNamedTypeSymbol)invoke.ContainingType, iAsyncResultType, syntax, MethodKind.Ordinary, RefKind.None, DeclarationModifiers.Virtual | DeclarationModifiers.Public)
368parameters.Add(SynthesizedParameterSymbol.Create(this, asyncCallbackType, paramCount, RefKind.None, GetUniqueParameterName(parameters, "callback")));
369parameters.Add(SynthesizedParameterSymbol.Create(this, objectType, paramCount + 1, RefKind.None, GetUniqueParameterName(parameters, "object")));
407if (p.RefKind != RefKind.None)
414parameters.Add(SynthesizedParameterSymbol.Create(this, iAsyncResultType, ordinal++, RefKind.None, GetUniqueParameterName(parameters, "result")));
Symbols\Source\SourceMemberContainerSymbol.cs (18)
2237var refKind1 = method1.Parameters[i].RefKind;
2238var refKind2 = method2.Parameters[i].RefKind;
4473if (methodParam.RefKind != RefKind.None)
4496methodParams[0].RefKind == RefKind.None &&
4889RefKind.Out
4891RefKind.None,
4937RefKind.None
4939RefKind.None,
4990RefKind.None)),
4991RefKind.None,
5046RefKind.None,
5125RefKind.None,
5220RefKind.None,
5251RefKind.None,
5317RefKind.None
5319RefKind.None,
5518_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);
5525var 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; }
302default(ImmutableArray<RefKind>),
368argumentRefKindsOpt: default(ImmutableArray<RefKind>),
394argumentRefKindsOpt: default(ImmutableArray<RefKind>),
447refKind: RefKind.None,
465refKind: RefKind.None,
559RefKind.None,
578TypeWithAnnotations.Create(submissionArrayType), 0, RefKind.None, "submissionArray"));
629argumentRefKindsOpt: default(ImmutableArray<RefKind>),
650RefKind.None,
InitializeParameter\CSharpInitializeMemberFromPrimaryConstructorParameterCodeRefactoringProvider.cs (1)
250RefKind.None,
InitializeParameter\AbstractInitializeMemberFromParameterCodeRefactoringProviderMemberCreation.cs (1)
342RefKind.None,
src\Analyzers\Core\Analyzers\RemoveUnusedParametersAndValues\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (2)
544case RefKind.Out:
551case RefKind.Ref:
src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateDeconstructMethodService.State.cs (1)
76refKind: RefKind.None,
src\Analyzers\Core\CodeFixes\GenerateParameterizedMember\AbstractGenerateMethodService.State.cs (1)
254refKind: RefKind.None,
src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.cs (8)
144document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None));
158document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None));
172document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None));
220parameter.RefKind is RefKind.Out ||
245private static RefKind GetRefKindFromContext(State state)
249return RefKind.Ref;
253return RefKind.RefReadOnly;
257return RefKind.None;
src\Analyzers\Core\CodeFixes\GenerateVariable\AbstractGenerateVariableService.GenerateParameterCodeAction.cs (1)
49RefKind.None,
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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
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\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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,
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\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConstructorSymbol.cs (1)
20refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationConversionSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationDestructorSymbol.cs (1)
16refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationOperatorSymbol.cs (1)
24refKind: RefKind.None,
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\Extensions\SyntaxGeneratorExtensions_CreateEqualsMethod.cs (1)
67refKind: RefKind.None,