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 (120)
45Method is { RefKind: not RefKind.None, ReturnType: { } returnType } &&
108public ImmutableArray<RefKind> ArgumentRefKindsOpt;
245public static MethodInvocationInfo FromInlineArrayConversion(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
291public static MethodInvocationInfo FromInlineArrayAccess(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
391internal RefKind RefKind { get; }
393internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
401public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
608if (indexerAccess.Indexer.RefKind != RefKind.None)
632var useSetAccessor = coreValueKind == BindValueKind.Assignable && indexer.RefKind != RefKind.Ref;
641ArrayBuilder<RefKind>? refKindsBuilderOpt;
644refKindsBuilderOpt = ArrayBuilder<RefKind>.GetInstance(accessorForDefaultArguments.ParameterCount);
1330if (localSymbol.RefKind == RefKind.RefReadOnly ||
1331(localSymbol.RefKind == RefKind.None && !localSymbol.IsWritableVariable))
1339if (localSymbol.RefKind == RefKind.None)
1371if (localSymbol.RefKind == RefKind.None)
1412if (parameterSymbol.RefKind is RefKind.In or RefKind.RefReadOnlyParameter && RequiresAssignableVariable(valueKind))
1417else if (parameterSymbol.RefKind == RefKind.None && RequiresRefAssignableVariable(valueKind))
1423Debug.Assert(parameterSymbol.RefKind != RefKind.None || !RequiresRefAssignableVariable(valueKind));
1427if (parameterSymbol.RefKind == RefKind.None &&
1431Debug.Assert(backingField.RefKind == RefKind.None);
1436Debug.Assert(backingField.RefKind == RefKind.None);
1526{ RefKind: RefKind.Out, UseUpdatedEscapeRules: true } => SafeContext.ReturnOnly,
1538{ RefKind: RefKind.None } => SafeContext.CurrentMethod,
1540{ HasUnscopedRefAttribute: true, UseUpdatedEscapeRules: true, RefKind: RefKind.Out } => SafeContext.ReturnOnly,
1573Debug.Assert(parameterSymbol.RefKind == RefKind.None || isRefScoped || refSafeToEscape.IsReturnOnly);
1623if ((fieldSymbol.RefKind == RefKind.None ? RequiresAssignableVariable(valueKind) : RequiresRefAssignableVariable(valueKind)) &&
1635case RefKind.None:
1637case RefKind.Ref:
1639case RefKind.RefReadOnly:
1659case RefKind.None:
1662case RefKind.Ref:
1663case RefKind.RefReadOnly:
1683case RefKind.None:
1685case RefKind.Ref:
1686case RefKind.RefReadOnly:
1786if (fieldSymbol.RefKind != RefKind.None)
1810if (fieldSymbol.RefKind != RefKind.None)
1955if (RequiresVariable(valueKind) && methodSymbol.RefKind == RefKind.None)
1970if (RequiresAssignableVariable(valueKind) && methodSymbol.RefKind == RefKind.RefReadOnly)
2001propertySymbol.RefKind == RefKind.None)
2025if (RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.RefReadOnly)
2031var requiresSet = RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.None;
2101var requiresGet = !RequiresAssignmentOnly(valueKind) || propertySymbol.RefKind != RefKind.None;
2366(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2445result.ArgumentRefKindsOpt = [RefKind.None, .. methodInvocationInfo.ArgumentRefKindsOpt];
2532var valid = effectiveRefKind != RefKind.None && isRefEscape ?
2594(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2725var refKind = parameter?.RefKind ?? RefKind.None;
2730if (refKind == RefKind.None &&
2731parameter?.RefKind is RefKind.In or RefKind.RefReadOnlyParameter)
2763return new EscapeArgument(parameter: null, receiver, RefKind.None);
2766var refKind = RefKind.None;
2786ImmutableArray<RefKind> argRefKindsOpt,
2793var refKind = argRefKindsOpt.IsDefault ? RefKind.None : argRefKindsOpt[argIndex];
2796if (refKind == RefKind.Ref && mixableArguments is not null)
2935return parameter.RefKind == RefKind.Ref &&
3006if (refKind != RefKind.None)
3019if (parameter.Type.IsRefLikeOrAllowsRefLikeType() && parameter.RefKind != RefKind.Out && GetParameterValEscapeLevel(parameter) is { } valEscapeLevel)
3026if (parameter.RefKind != RefKind.None && GetParameterRefEscapeLevel(parameter) is { } refEscapeLevel)
3090if (parameter.RefKind != RefKind.None && !parameter.IsThis)
3360Debug.Assert(underlyingParameter.RefKind != RefKind.Out); // Shouldn't get here for a constructor
3370public override RefKind RefKind
3374if (_underlyingParameter.RefKind is not RefKind.None and var underlyingRefKind)
3381return RefKind.None;
3386return RefKind.Ref;
3599Debug.Assert(field.RefKind == RefKind.None ? RequiresAssignableVariable(kind) : RequiresRefAssignableVariable(kind));
3805if (methodSymbol.RefKind == RefKind.None)
3820if (methodSymbol.RefKind == RefKind.None)
3865if (methodSymbol.RefKind == RefKind.None)
3885Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
3890ImmutableArray<RefKind> refKinds;
3893Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
3924conversion.Conversion.Method.RefKind == RefKind.None));
3931unaryMethod.RefKind == RefKind.None));
3938binaryMethod.RefKind == RefKind.None));
3944logicalOperator.LogicalOperator.RefKind == RefKind.None));
3951compoundMethod.RefKind == RefKind.None));
3958incrementMethod.RefKind == RefKind.None));
4095if (methodSymbol.RefKind == RefKind.None)
4114if (indexerSymbol.RefKind == RefKind.None)
4138if (indexerSymbol.RefKind == RefKind.None)
4162if (methodSymbol.RefKind == RefKind.None)
4186Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
4191ImmutableArray<RefKind> refKinds;
4194Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
4209if (signature.RefKind == RefKind.None)
4226if (propertySymbol.RefKind == RefKind.None)
4266conversion.Conversion.Method.RefKind == RefKind.None);
4273unaryMethod.RefKind == RefKind.None));
4280binaryMethod.RefKind == RefKind.None));
4286logicalOperator.LogicalOperator.RefKind == RefKind.None));
4293compoundMethod.RefKind == RefKind.None));
4300incrementMethod.RefKind == RefKind.None));
4526ImmutableArray<RefKind> refKinds;
4609ImmutableArray<RefKind> refKinds;
4946bool isSet = indexer.RefKind == RefKind.None;
5002bool isSet = property.RefKind == RefKind.None;
5269ImmutableArray<RefKind> refKinds;
5394ImmutableArray<RefKind> refKinds;
5701private SignatureOnlyMethodSymbol GetInlineArrayAccessEquivalentSignatureMethod(BoundInlineArrayAccess elementAccess, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5703RefKind resultRefKind;
5704RefKind parameterRefKind;
5715resultRefKind = RefKind.None;
5716parameterRefKind = RefKind.None;
5720resultRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__get_Item ? RefKind.In : RefKind.Ref;
5729resultRefKind = RefKind.None;
5730parameterRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__Slice_Int_Int ? RefKind.In : RefKind.Ref;
5763private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundConversion conversion, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5769private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundExpression inlineArray, TypeSymbol resultType, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5775RefKind parameterRefKind = resultType.OriginalDefinition.Equals(_compilation.GetWellKnownType(WellKnownType.System_ReadOnlySpan_T), TypeCompareKind.AllIgnoreOptions) ? RefKind.In : RefKind.Ref;
5790RefKind.None,
Binder\Binder_Expressions.cs (67)
491if (field is { IsStatic: false, RefKind: RefKind.None, ContainingSymbol: SourceMemberContainerTypeSymbol { PrimaryConstructor: { } primaryConstructor } } &&
503RefKind refKind,
2041private bool IsBadLocalOrParameterCapture(Symbol symbol, TypeSymbol type, RefKind refKind)
2043if (refKind != RefKind.None || type.IsRestrictedType())
2125if (parameter.RefKind != RefKind.None)
2145(parameter.RefKind != RefKind.None || parameter.Type.IsRestrictedType()) &&
2148if (parameter.RefKind != RefKind.None)
2162else if (primaryCtor is { ThisParameter.RefKind: not RefKind.None } &&
2315if (localSymbol.RefKind == RefKind.None && type.IsRestrictedType(ignoreSpanLikeTypes: true))
2621if (thisSymbol is not null && thisSymbol.ContainingSymbol != ContainingMemberOrLambda && thisSymbol.RefKind != RefKind.None)
3175RefKind origRefKind = argumentSyntax.RefOrOutKeyword.Kind().GetRefKind();
3179RefKind refKind = origRefKind == RefKind.None || RefMustBeObeyed(isDelegateCreation, argumentSyntax) ? origRefKind : RefKind.None;
3192if (!hadError && isDelegateCreation && origRefKind != RefKind.None && result.Arguments.Count == 1)
3199var requiredValueKind = origRefKind == RefKind.In ? BindValueKind.ReadonlyRef : BindValueKind.RefOrOut;
3211private BoundExpression BindArgumentValue(BindingDiagnosticBag diagnostics, ArgumentSyntax argumentSyntax, bool allowArglist, RefKind refKind)
3412RefKind refKind)
3420if (refKind != RefKind.None)
3430result.RefKinds.Add(RefKind.None);
3478private BoundExpression BindArgumentExpression(BindingDiagnosticBag diagnostics, ExpressionSyntax argumentExpression, RefKind refKind, bool allowArglist)
3481refKind == RefKind.None ?
3483refKind == RefKind.In ?
3854var argumentRefKindsBuilder = ArrayBuilder<RefKind>.GetInstance(handlerArgumentIndexes.Length);
3864RefKind refKind;
3870refKind = RefKind.None;
3956argumentRefKindsBuilder.Add(refKind == RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
3980private void CheckArgumentRefKind(RefKind argRefKind, BoundExpression argument, int arg, ParameterSymbol parameter,
3992if (argRefKind is RefKind.None or RefKind.In && parameter.RefKind == RefKind.RefReadOnlyParameter)
4004if (argRefKind == RefKind.Ref)
4006if (parameter.RefKind == RefKind.In)
4016else if (argRefKind == RefKind.None && parameter.RefKind == RefKind.RefReadOnlyParameter)
5135if (analyzedArguments.RefKind(i) is (RefKind.Ref or RefKind.Out))
5735ArrayBuilder<RefKind> refKinds,
5908var rhsExpr = initializer.Right.CheckAndUnwrapRefExpression(diagnostics, out RefKind refKind);
5909bool isRef = refKind == RefKind.Ref;
6080ImmutableArray<RefKind> argumentRefKindsOpt = default;
8627extensionMethodArguments.RefKinds.Add(RefKind.None);
8767RefKind returnRefKind,
8851RefKind returnRefKind,
9038RefKind returnRefKind,
9780ImmutableArray<RefKind> argumentRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
9896fieldSymbol.RefKind != RefKind.None)
10901RefKind refKind = analyzedArguments.RefKind(i);
10902if (refKind != RefKind.None)
11038default(ImmutableArray<RefKind>),
11157ImmutableArray<RefKind> argumentRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
11205private BoundIndexerAccess BindResolvedIndexerOrIndexedPropertyAccess(SyntaxNode syntax, BoundExpression receiver, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics, ImmutableArray<string> argumentNames, ImmutableArray<RefKind> argumentRefKinds, MemberResolutionResult<PropertySymbol> resolutionResult)
11461original.Parameters[parameterOffset] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None } &&
11462original.Parameters[parameterOffset + 1] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None };
11474getMethod.RefKind == RefKind.None;
11485original.Parameters[0] is { Type.SpecialType: SpecialType.System_Int32, RefKind: RefKind.None };
11600RefKind returnRefKind = default,
11624RefKind returnRefKind = default,
11656RefKind returnRefKind = default,
11727RefKind returnRefKind = default,
12193RefKind? returnRefKindOverride = null,
12200var returnRefKind = returnRefKindOverride ?? methodSymbol.RefKind;
12218if (returnsVoid && returnRefKind != RefKind.None)
12232returnRefKind == RefKind.None &&
12234(parameterRefKinds.IsDefault || parameterRefKinds.All(refKind => refKind == RefKind.None)) &&
12268parameterRefKinds.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)
2186var delegateRefKind = delegateParameters[i].RefKind;
2187var lambdaRefKind = anonymousFunction.RefKind(i);
2195if (delegateRefKind == RefKind.None)
2244var lambdaRefKind = anonymousFunction.RefKind(i);
2246var delegateRefKind = delegateParameters[i].RefKind;
3040protected virtual TypeSymbol GetCurrentReturnType(out RefKind refKind)
3057refKind = RefKind.None;
3063var refKind = RefKind.None;
3081RefKind sigRefKind;
3092if (refKind != RefKind.None)
3104else if ((object)retType != null && (refKind != RefKind.None) != (sigRefKind != RefKind.None))
3106var errorCode = refKind != RefKind.None
3204RefKind returnRefKind,
3215Debug.Assert(returnRefKind == RefKind.None);
3237if (returnRefKind != RefKind.None)
3253RefKind unusedRefKind;
3538internal BoundBlock CreateBlockFromExpression(CSharpSyntaxNode node, ImmutableArray<LocalSymbol> locals, RefKind refKind, BoundExpression expression, ExpressionSyntax expressionSyntax, BindingDiagnosticBag diagnostics)
3540RefKind returnRefKind;
3545if (IsInAsyncMethod() && refKind != RefKind.None)
3554if ((refKind != RefKind.None) != (returnRefKind != RefKind.None) && expression.Kind != BoundKind.ThrowExpression)
3556var errorCode = refKind != RefKind.None
3561statement = new BoundReturnStatement(syntax, RefKind.None, expression, @checked: CheckOverflowAtRuntime) { WasCompilerGenerated = true };
3665RefKind refKind;
3681RefKind refKind;
3694return bodyBinder.CreateBlockFromExpression(body, bodyBinder.GetDeclaredLocalsForScope(body), RefKind.None, expression, body, diagnostics);
3697private BindValueKind GetRequiredReturnValueKind(RefKind refKind)
3700if (refKind != RefKind.None)
3702GetCurrentReturnType(out var sigRefKind);
3703requiredValueKind = sigRefKind == RefKind.Ref ?
4074argumentRefKindsOpt: 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;
2252return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
2255return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
2258return ((BoundCall)receiver).Method.RefKind != RefKind.None;
2261return ((BoundFunctionPointerInvocation)receiver).FunctionPointer.Signature.RefKind != RefKind.None;
2264return ((BoundDup)receiver).RefKind != RefKind.None;
2676if (System.Linq.ImmutableArrayExtensions.All(ctor.Parameters, p => p.RefKind == RefKind.None) &&
2807return ((BoundParameter)left).ParameterSymbol.RefKind == RefKind.None;
2812return ((BoundLocal)left).LocalSymbol.RefKind == RefKind.None;
2832if (left.FieldSymbol.RefKind != RefKind.None &&
2850if (left.ParameterSymbol.RefKind != RefKind.None &&
2882if (left.LocalSymbol.RefKind != RefKind.None && !assignmentOperator.IsRef)
2981Debug.Assert(left.Method.RefKind != RefKind.None);
2992Debug.Assert(left.FunctionPointer.Signature.RefKind != RefKind.None);
3044LocalDefinition temp = EmitAddress(assignmentOperator.Right, lhs.GetRefKind() is RefKind.RefReadOnly or RefKindExtensions.StrictIn or RefKind.RefReadOnlyParameter ? AddressKind.ReadOnlyStrict : AddressKind.Writeable);
3127if (local.LocalSymbol.RefKind != RefKind.None && !assignment.IsRef)
3160Debug.Assert(((BoundDup)expression).RefKind != RefKind.None);
3183Debug.Assert(((BoundCall)expression).Method.RefKind != RefKind.None);
3188Debug.Assert(((BoundFunctionPointerInvocation)expression).FunctionPointer.Signature.RefKind != RefKind.None);
3332if (field.RefKind != RefKind.None && !refAssign)
3347if (parameter.ParameterSymbol.RefKind != RefKind.None && !refAssign)
4144if (useKind == UseKind.UsedAsValue && method.RefKind != RefKind.None)
4150Debug.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");
1232if (unwrappedSequence is BoundLocal { LocalSymbol: { RefKind: not RefKind.None } localSymbol })
1266private ImmutableArray<BoundExpression> VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
1276RefKind argRefKind = CodeGenerator.GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
1283private void VisitArgument(ImmutableArray<BoundExpression> arguments, ref ArrayBuilder<BoundExpression> rewrittenArguments, int i, RefKind argRefKind)
1285ExprContext context = (argRefKind == RefKind.None) ? ExprContext.Value : ExprContext.Address;
1307ImmutableArray<RefKind> argRefKindsOpt = node.ArgumentRefKindsOpt;
1311RefKind refKind = argRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : argRefKindsOpt[i];
1439if (localSym.RefKind == RefKind.None)
1887Debug.Assert(local.RefKind == RefKind.None, "cannot take a ref of a ref");
1948return top.Item2 == (local.RefKind == RefKind.None ? ExprContext.Value : ExprContext.Address) &&
2223var isIndirectLocalStore = left.LocalSymbol.RefKind != RefKind.None && !node.IsRef;
2252left.LocalSymbol.RefKind == RefKind.Ref &&
2489public override RefKind RefKind
2491get { 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 (70)
1384var refKind = parameter.RefKind;
1385if (refKind != RefKind.Out && refKind != RefKind.Ref)
2531RefKind refKind,
2541if (refKind == RefKind.Ref)
2544return AreParameterAnnotationsCompatible(RefKind.None, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations, forRef: true) &&
2545AreParameterAnnotationsCompatible(RefKind.Out, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations);
2548if (refKind is RefKind.None or RefKind.In or RefKind.RefReadOnlyParameter)
2578if (refKind == RefKind.Out)
3050if (parameter.RefKind != RefKind.Out)
3123if (node.RefKind == RefKind.None &&
3132if (node.RefKind == RefKind.None)
4606out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKindsOpt,
4781out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKindsOpt, out ImmutableArray<int> argsToParamsOpt,
6845var refKind = isExtensionBlockMethod ? GetExtensionReceiverRefKind(node.Method) : GetRefKind(node.ArgumentRefKindsOpt, 0);
6981ImmutableArray<RefKind> refKindsOpt,
7039internal static ImmutableArray<RefKind> AdjustArgumentRefKindsIfNeeded(ImmutableArray<RefKind> argumentRefKindsOpt, bool adjustForExtensionBlockMethod,
7048RefKind receiverRefKind = GetExtensionReceiverRefKind(member);
7052if (receiverRefKind == RefKind.None)
7057var builder = ArrayBuilder<RefKind>.GetInstance(argumentCount + 1, fillWithValue: RefKind.None);
7065private static RefKind GetExtensionReceiverRefKind(Symbol member)
7072return extensionParameter.RefKind == RefKind.Ref ? RefKind.Ref : RefKind.None;
7533protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7543ImmutableArray<RefKind> refKindsOpt,
7558ImmutableArray<RefKind> refKindsOpt,
7587ImmutableArray<RefKind> refKindsOpt,
7630ImmutableArray<RefKind> refKindsOpt,
7822ImmutableArray<RefKind> refKindsOpt,
7841static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7901var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(refKindsOpt.Length + elements.Length - 1);
7903refKindsBuilder.AddMany(RefKind.None, elements.Length);
8094ImmutableArray<RefKind> refKindsOpt,
8155private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8167private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8173case RefKind.Ref:
8176case RefKind.None:
8177case RefKind.In:
8199case RefKind.Out:
8222RefKind refKind,
8237case RefKind.None:
8238case RefKind.In:
8276case RefKind.Ref:
8296case RefKind.Out:
8360RefKind refKind,
8373case RefKind.None:
8374case RefKind.In:
8380case RefKind.Ref:
8407case RefKind.Out:
8475void trackNullableStateForAssignment(TypeSymbol? receiverType, BoundExpression parameterValue, TypeWithAnnotations lValueType, int targetSlot, TypeWithState parameterWithState, bool isSuppressed, FlowAnalysisAnnotations parameterAnnotations, RefKind refKind, ParameterSymbol parameter)
8500static bool hasConditionalPostCondition(TypeSymbol? receiverType, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8511static bool isUnionTryGetValueValue(TypeSymbol? receiverType, RefKind refKind, ParameterSymbol parameter)
8513if (refKind == RefKind.Out &&
8542static TypeWithState applyPostConditionsWhenTrue(TypeSymbol? receiverType, TypeWithState typeWithState, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8632ImmutableArray<RefKind> refKindsOpt)
8643RefKind refKind = GetRefKind(refKindsOpt, i);
8646if (refKind == RefKind.None)
8714ImmutableArray<RefKind> argumentRefKindsOpt,
8724var refKinds = ArrayBuilder<RefKind>.GetInstance();
8745parameterRefKinds: out ImmutableArray<RefKind> parameterRefKinds);
11401case BoundLocal { LocalSymbol.RefKind: RefKind.None }:
11402case BoundParameter { ParameterSymbol: { RefKind: RefKind.None } parameter } when
12163ImmutableArray<RefKind> refKindsOpt,
13674TypeWithAnnotations elementType = InMethodBinder.GetIteratorElementTypeFromReturnType(compilation, RefKind.None,
13716VisitArguments(node, receiverType: null, node.ConstructorArguments, ImmutableArray<RefKind>.Empty, node.Constructor, argsToParamsOpt: node.ConstructorArgumentsToParamsOpt, defaultArguments: node.ConstructorDefaultArguments,
Generated\BoundNodes.xml.Generated.cs (40)
927public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type, bool hasErrors)
933public BoundDup(SyntaxNode syntax, RefKind refKind, TypeSymbol? type)
939public RefKind RefKind { get; }
944public BoundDup Update(RefKind refKind, TypeSymbol? type)
1467public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1484public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
1490public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
3113public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3125public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
3130public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3619public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3631public RefKind RefKind { get; }
3638public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
5963public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5979public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
5985public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6213public 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)
6246public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6258public 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)
6356public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6373public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6380public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6415public 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)
6441public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6452public 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)
6513public BoundUnconvertedWithElement(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool hasErrors = false)
6526public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6531public BoundUnconvertedWithElement Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt)
6737public 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)
6758public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6766public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6859public 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)
6883public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6894public 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)
7527public 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)
7554public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7564public 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)
7668public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7688public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7694public 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);
900RefKind argRefKind = argumentRefKindsOpt.RefKinds(argIndex);
901RefKind paramRefKind = parameters[paramIndex].RefKind;
903local = _factory.StoreToTemp(visitedArgument, out var store, refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter ? RefKind.In : argRefKind);
951private RefKind GetExtensionBlockMemberReceiverCaptureRefKind(BoundExpression rewrittenReceiver, Symbol methodOrIndexer)
956RefKind receiverRefKind = methodOrIndexer.ContainingType.ExtensionParameter.RefKind;
957bool isReceiverTakenByValue = receiverRefKind == RefKind.None;
962return RefKind.None;
976return RefKind.None;
979RefKind refKind = ExtensionMethodReferenceRewriter.ReceiverArgumentRefKindFromReceiverRefKind(receiverRefKind);
990return RefKind.None;
1065ref ImmutableArray<RefKind> argumentRefKindsOpt,
1148ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
1218private static ImmutableArray<RefKind> GetEffectiveArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters)
1220ArrayBuilder<RefKind>? refKindsBuilder = null;
1223var paramRefKind = parameters[i].RefKind;
1224var currentArgRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
1225var effectiveArgRefKind = GetEffectiveRefKind(paramRefKind, currentArgRefKind, parameters[i].Type, comRefKindMismatchPossible: false);
1243static void fillRefKindsBuilder(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters, [NotNull] ref ArrayBuilder<RefKind>? refKindsBuilder)
1250refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length);
1255refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length, fillWithValue: RefKind.None);
1261internal static RefKind GetEffectiveRefKind(RefKind paramRefKind, RefKind initialArgRefKind, TypeSymbol paramType, bool comRefKindMismatchPossible)
1269if (paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter)
1271Debug.Assert(initialArgRefKind is RefKind.None or RefKind.In or RefKind.Ref);
1272return initialArgRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn;
1274else if (paramRefKind == RefKind.Ref && initialArgRefKind == RefKind.None)
1280return RefKind.Ref;
1342private static ImmutableArray<RefKind> GetRefKindsOrNull(ArrayBuilder<RefKind> refKinds)
1344foreach (var refKind in refKinds)
1346if (refKind != RefKind.None)
1351return default(ImmutableArray<RefKind>);
1404ImmutableArray<RefKind> argumentRefKinds,
1408/* out */ ArrayBuilder<RefKind> refKinds,
1420RefKind argRefKind = argumentRefKinds.RefKinds(a);
1421RefKind paramRefKind = parameters[p].RefKind;
1429Debug.Assert(argRefKind == RefKind.None);
1445arg.rewriter.StoreArgumentToTempIfNecessary(arg.forceLambdaSpilling, arg.storesToTemps, element, RefKind.None, RefKind.None),
1461private BoundExpression StoreArgumentToTempIfNecessary(bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps, BoundExpression argument, RefKind argRefKind, RefKind paramRefKind)
1473refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter
1474? (argRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn)
1528default(ImmutableArray<RefKind>),
1688ArrayBuilder<RefKind> argsRefKindsBuilder,
1701RefKind paramRefKind = parameters[argIndex].RefKind;
1702RefKind argRefKind = argsRefKindsBuilder[argIndex];
1706if (argRefKind != RefKind.None || paramRefKind != RefKind.Ref)
1714var localRefKind = ((BoundLocal)argument).LocalSymbol.RefKind;
1715if (localRefKind == RefKind.Ref)
1721Debug.Assert(localRefKind == RefKind.None);
1733argsRefKindsBuilder[argIndex] = RefKind.Ref;
Lowering\LocalRewriter\LocalRewriter_CompoundAssignmentOperator.cs (26)
234BoundLocal binaryResult = _factory.StoreToTemp(opFinal, out BoundAssignmentOperator assignmentToTemp, refKind: RefKind.None);
259return symbol.IsExtensionBlockMember() && !symbol.IsStatic && symbol.ContainingType.ExtensionParameter is { RefKind: RefKind.None, Type.IsReferenceType: false };
296RefKind refKind;
314refKind = variableRepresentsLocation ? RefKind.Ref : RefKind.None;
327refKind: refKind is RefKind.RefReadOnlyParameter ? RefKind.In : refKind,
443ImmutableArray<RefKind> argumentRefKinds = indexerAccess.ArgumentRefKindsOpt;
475ref ImmutableArray<RefKind> argumentRefKinds,
482ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
555Debug.Assert(implicitIndexerAccess.IndexerOrSliceAccess.GetRefKind() == RefKind.None);
581var variableTemp = _factory.StoreToTemp(arrayAccess, out assignmentToTemp, refKind: RefKind.Ref);
659var temp = _factory.StoreToTemp(VisitExpression(arguments[i]), out assignmentToTemp, indexerAccess.ArgumentRefKindsOpt.RefKinds(i) != RefKind.None ? RefKind.Ref : RefKind.None);
730if (propertyAccess.PropertySymbol.RefKind == RefKind.None)
745if (indexerAccess.GetRefKind() == RefKind.None)
758if (implicitIndexerAccess.GetRefKind() == RefKind.None)
811Debug.Assert(originalLHS.GetRefKind() == RefKind.Ref);
832Debug.Assert(((BoundCall)originalLHS).Method.RefKind != RefKind.None);
836Debug.Assert(((BoundFunctionPointerInvocation)originalLHS).FunctionPointer.Signature.RefKind != RefKind.None);
887var variableTemp = _factory.StoreToTemp(rewrittenVariable, out assignmentToTemp2, refKind: RefKind.Ref);
987((BoundParameter)expression).ParameterSymbol.RefKind != RefKind.None ||
991return 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>),
623ImmutableArray<RefKind> paramRefKindsOpt,
643elementArg.rewriter.EvaluateSideEffects(element, RefKind.None, elementArg.sideeffects, ref elementArg.temps),
671private 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)
29RefKind refKind,
57returnTypeSyntax = returnTypeSyntax.SkipScoped(out _).SkipRefInLocalOrReturn(diagnostics, out RefKind refKind);
223: base(delegateType, voidType, syntax, MethodKind.Constructor, RefKind.None, DeclarationModifiers.Public)
226SynthesizedParameterSymbol.Create(this, objectType, 0, RefKind.None, "object"),
227SynthesizedParameterSymbol.Create(this, intPtrType, 1, RefKind.None, "method")));
265RefKind refKind,
288if (this.RefKind == RefKind.RefReadOnly)
327if (this.RefKind == RefKind.RefReadOnly)
363: base((SourceNamedTypeSymbol)invoke.ContainingType, iAsyncResultType, syntax, MethodKind.Ordinary, RefKind.None, DeclarationModifiers.Virtual | DeclarationModifiers.Public)
373parameters.Add(SynthesizedParameterSymbol.Create(this, asyncCallbackType, paramCount, RefKind.None, GetUniqueParameterName(parameters, "callback")));
374parameters.Add(SynthesizedParameterSymbol.Create(this, objectType, paramCount + 1, RefKind.None, GetUniqueParameterName(parameters, "object")));
412if (p.RefKind != RefKind.None)
419parameters.Add(SynthesizedParameterSymbol.Create(this, iAsyncResultType, ordinal++, RefKind.None, GetUniqueParameterName(parameters, "result")));
Symbols\Source\SourceMemberContainerSymbol.cs (18)
2380var refKind1 = method1.Parameters[i].RefKind;
2381var refKind2 = method2.Parameters[i].RefKind;
4644if (methodParam.RefKind != RefKind.None)
4667methodParams[0].RefKind == RefKind.None &&
5161RefKind.Out
5163RefKind.None,
5209RefKind.None
5211RefKind.None,
5262RefKind.None)),
5263RefKind.None,
5318RefKind.None,
5397RefKind.None,
5492RefKind.None,
5523RefKind.None,
5589RefKind.None
5591RefKind.None,
5792_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);
5799var 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,