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)
146document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None));
160document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None));
174document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None));
222parameter.RefKind is RefKind.Out ||
247private static RefKind GetRefKindFromContext(State state)
251return RefKind.Ref;
255return RefKind.RefReadOnly;
259return 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_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(GetAnonymousTypeFieldType(fieldValue, node, diagnostics)), 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\Binder.ValueChecks.cs (120)
46Method is { RefKind: not RefKind.None, ReturnType: { } returnType } &&
109public ImmutableArray<RefKind> ArgumentRefKindsOpt;
246public static MethodInvocationInfo FromInlineArrayConversion(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
292public static MethodInvocationInfo FromInlineArrayAccess(SignatureOnlyMethodSymbol equivalentSignatureMethod, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds, bool hasAnyErrors)
392internal RefKind RefKind { get; }
394internal EscapeArgument(ParameterSymbol? parameter, BoundExpression argument, RefKind refKind, bool isArgList = false)
402public void Deconstruct(out ParameterSymbol? parameter, out BoundExpression argument, out RefKind refKind)
609if (indexerAccess.Indexer.RefKind != RefKind.None)
633var useSetAccessor = coreValueKind == BindValueKind.Assignable && indexer.RefKind != RefKind.Ref;
642ArrayBuilder<RefKind>? refKindsBuilderOpt;
645refKindsBuilderOpt = ArrayBuilder<RefKind>.GetInstance(accessorForDefaultArguments.ParameterCount);
1315if (localSymbol.RefKind == RefKind.RefReadOnly ||
1316(localSymbol.RefKind == RefKind.None && !localSymbol.IsWritableVariable))
1324if (localSymbol.RefKind == RefKind.None)
1356if (localSymbol.RefKind == RefKind.None)
1397if (parameterSymbol.RefKind is RefKind.In or RefKind.RefReadOnlyParameter && RequiresAssignableVariable(valueKind))
1402else if (parameterSymbol.RefKind == RefKind.None && RequiresRefAssignableVariable(valueKind))
1408Debug.Assert(parameterSymbol.RefKind != RefKind.None || !RequiresRefAssignableVariable(valueKind));
1412if (parameterSymbol.RefKind == RefKind.None &&
1416Debug.Assert(backingField.RefKind == RefKind.None);
1421Debug.Assert(backingField.RefKind == RefKind.None);
1511{ RefKind: RefKind.Out, UseUpdatedEscapeRules: true } => SafeContext.ReturnOnly,
1523{ RefKind: RefKind.None } => SafeContext.CurrentMethod,
1525{ HasUnscopedRefAttribute: true, UseUpdatedEscapeRules: true, RefKind: RefKind.Out } => SafeContext.ReturnOnly,
1558Debug.Assert(parameterSymbol.RefKind == RefKind.None || isRefScoped || refSafeToEscape.IsReturnOnly);
1608if ((fieldSymbol.RefKind == RefKind.None ? RequiresAssignableVariable(valueKind) : RequiresRefAssignableVariable(valueKind)) &&
1620case RefKind.None:
1622case RefKind.Ref:
1624case RefKind.RefReadOnly:
1644case RefKind.None:
1647case RefKind.Ref:
1648case RefKind.RefReadOnly:
1668case RefKind.None:
1670case RefKind.Ref:
1671case RefKind.RefReadOnly:
1771if (fieldSymbol.RefKind != RefKind.None)
1795if (fieldSymbol.RefKind != RefKind.None)
1940if (RequiresVariable(valueKind) && methodSymbol.RefKind == RefKind.None)
1955if (RequiresAssignableVariable(valueKind) && methodSymbol.RefKind == RefKind.RefReadOnly)
1986propertySymbol.RefKind == RefKind.None)
2010if (RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.RefReadOnly)
2016var requiresSet = RequiresAssignableVariable(valueKind) && propertySymbol.RefKind == RefKind.None;
2086var requiresGet = !RequiresAssignmentOnly(valueKind) || propertySymbol.RefKind != RefKind.None;
2351(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2430result.ArgumentRefKindsOpt = [RefKind.None, .. methodInvocationInfo.ArgumentRefKindsOpt];
2517var valid = effectiveRefKind != RefKind.None && isRefEscape ?
2579(param is { RefKind: not RefKind.None, Type: { } type } && type.IsRefLikeOrAllowsRefLikeType())) &&
2710var refKind = parameter?.RefKind ?? RefKind.None;
2715if (refKind == RefKind.None &&
2716parameter?.RefKind is RefKind.In or RefKind.RefReadOnlyParameter)
2748return new EscapeArgument(parameter: null, receiver, RefKind.None);
2751var refKind = RefKind.None;
2771ImmutableArray<RefKind> argRefKindsOpt,
2778var refKind = argRefKindsOpt.IsDefault ? RefKind.None : argRefKindsOpt[argIndex];
2781if (refKind == RefKind.Ref && mixableArguments is not null)
2920return parameter.RefKind == RefKind.Ref &&
2991if (refKind != RefKind.None)
3004if (parameter.Type.IsRefLikeOrAllowsRefLikeType() && parameter.RefKind != RefKind.Out && GetParameterValEscapeLevel(parameter) is { } valEscapeLevel)
3011if (parameter.RefKind != RefKind.None && GetParameterRefEscapeLevel(parameter) is { } refEscapeLevel)
3075if (parameter.RefKind != RefKind.None && !parameter.IsThis)
3345Debug.Assert(underlyingParameter.RefKind != RefKind.Out); // Shouldn't get here for a constructor
3355public override RefKind RefKind
3359if (_underlyingParameter.RefKind is not RefKind.None and var underlyingRefKind)
3366return RefKind.None;
3371return RefKind.Ref;
3584Debug.Assert(field.RefKind == RefKind.None ? RequiresAssignableVariable(kind) : RequiresRefAssignableVariable(kind));
3790if (methodSymbol.RefKind == RefKind.None)
3805if (methodSymbol.RefKind == RefKind.None)
3850if (methodSymbol.RefKind == RefKind.None)
3870Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
3875ImmutableArray<RefKind> refKinds;
3878Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
3909conversion.Conversion.Method.RefKind == RefKind.None));
3916unaryMethod.RefKind == RefKind.None));
3923binaryMethod.RefKind == RefKind.None));
3929logicalOperator.LogicalOperator.RefKind == RefKind.None));
3936compoundMethod.RefKind == RefKind.None));
3943incrementMethod.RefKind == RefKind.None));
4080if (methodSymbol.RefKind == RefKind.None)
4099if (indexerSymbol.RefKind == RefKind.None)
4123if (indexerSymbol.RefKind == RefKind.None)
4147if (methodSymbol.RefKind == RefKind.None)
4171Debug.Assert(GetInlineArrayAccessEquivalentSignatureMethod(elementAccess, out _, out _).RefKind == RefKind.None);
4176ImmutableArray<RefKind> refKinds;
4179Debug.Assert(equivalentSignatureMethod.RefKind != RefKind.None);
4194if (signature.RefKind == RefKind.None)
4211if (propertySymbol.RefKind == RefKind.None)
4251conversion.Conversion.Method.RefKind == RefKind.None);
4258unaryMethod.RefKind == RefKind.None));
4265binaryMethod.RefKind == RefKind.None));
4271logicalOperator.LogicalOperator.RefKind == RefKind.None));
4278compoundMethod.RefKind == RefKind.None));
4285incrementMethod.RefKind == RefKind.None));
4511ImmutableArray<RefKind> refKinds;
4594ImmutableArray<RefKind> refKinds;
4931bool isSet = indexer.RefKind == RefKind.None;
4987bool isSet = property.RefKind == RefKind.None;
5254ImmutableArray<RefKind> refKinds;
5379ImmutableArray<RefKind> refKinds;
5686private SignatureOnlyMethodSymbol GetInlineArrayAccessEquivalentSignatureMethod(BoundInlineArrayAccess elementAccess, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5688RefKind resultRefKind;
5689RefKind parameterRefKind;
5700resultRefKind = RefKind.None;
5701parameterRefKind = RefKind.None;
5705resultRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__get_Item ? RefKind.In : RefKind.Ref;
5714resultRefKind = RefKind.None;
5715parameterRefKind = elementAccess.GetItemOrSliceHelper is WellKnownMember.System_ReadOnlySpan_T__Slice_Int_Int ? RefKind.In : RefKind.Ref;
5748private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundConversion conversion, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5754private SignatureOnlyMethodSymbol GetInlineArrayConversionEquivalentSignatureMethod(BoundExpression inlineArray, TypeSymbol resultType, out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKinds)
5760RefKind parameterRefKind = resultType.OriginalDefinition.Equals(_compilation.GetWellKnownType(WellKnownType.System_ReadOnlySpan_T), TypeCompareKind.AllIgnoreOptions) ? RefKind.In : RefKind.Ref;
5775RefKind.None,
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 (17)
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)
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 (63)
718RefKind refKind = expression.ArgumentRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : expression.ArgumentRefKindsOpt[i];
723private void EmitArgument(BoundExpression argument, RefKind refKind)
727case RefKind.None:
732Debug.Assert(refKind is RefKind.In or RefKind.Ref or RefKind.Out or RefKindExtensions.StrictIn);
738Debug.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");
745static AddressKind getArgumentAddressKind(RefKind refKind)
749case RefKind.None:
752case RefKind.In:
756Debug.Assert(refKind is RefKind.Ref or RefKind.Out or RefKindExtensions.StrictIn);
792if (expression.RefKind == RefKind.None)
980private void EmitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
985Debug.Assert(parameters.All(p => p.RefKind == RefKind.None) || !argRefKindsOpt.IsDefault, "there are nontrivial parameters, so we must have argRefKinds");
992RefKind argRefKind = GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
1001internal static RefKind GetArgumentRefKind(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt, int i)
1003RefKind argRefKind;
1014RefKind.In => argRefKind == RefKindExtensions.StrictIn,
1015RefKind.RefReadOnlyParameter => argRefKind is RefKind.In or RefKindExtensions.StrictIn,
1022Debug.Assert(parameters[i].RefKind != RefKind.RefReadOnlyParameter,
1028RefKind.RefReadOnlyParameter => RefKind.In, // should not happen, asserted above
1037argRefKind = RefKind.None;
1176if (!field.IsVolatile && !field.IsStatic && (receiver = fieldAccess.ReceiverOpt).Type.IsVerifierValue() && field.RefKind == RefKind.None &&
1189if (field.RefKind != RefKind.None)
1365return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
1369return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
1378if (field.IsStatic || field.RefKind != RefKind.None)
1469bool isRefLocal = local.LocalSymbol.RefKind != RefKind.None;
1508if (used || parameter.ParameterSymbol.RefKind != RefKind.None) // unused value parameter has no side-effects
1513if (parameter.ParameterSymbol.RefKind != RefKind.None)
1838var methodRefKind = call.Method.RefKind;
2332return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
2335return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
2338return ((BoundFieldAccess)receiver).FieldSymbol.RefKind != RefKind.None;
2341return ((BoundCall)receiver).Method.RefKind != RefKind.None;
2344return ((BoundFunctionPointerInvocation)receiver).FunctionPointer.Signature.RefKind != RefKind.None;
2347return ((BoundDup)receiver).RefKind != RefKind.None;
2774if (System.Linq.ImmutableArrayExtensions.All(ctor.Parameters, p => p.RefKind == RefKind.None) &&
2905return ((BoundParameter)left).ParameterSymbol.RefKind == RefKind.None;
2910return ((BoundLocal)left).LocalSymbol.RefKind == RefKind.None;
2930if (left.FieldSymbol.RefKind != RefKind.None &&
2948if (left.ParameterSymbol.RefKind != RefKind.None &&
2980if (left.LocalSymbol.RefKind != RefKind.None && !assignmentOperator.IsRef)
3084Debug.Assert(left.Method.RefKind != RefKind.None);
3095Debug.Assert(left.FunctionPointer.Signature.RefKind != RefKind.None);
3168private void EmitRefAssignmentValue(RefKind refKind, BoundExpression right, bool used)
3180private static AddressKind RefAssignmentValueAddressKind(RefKind refKind)
3182return refKind is RefKind.RefReadOnly or RefKindExtensions.StrictIn or RefKind.RefReadOnlyParameter ? AddressKind.ReadOnlyStrict : AddressKind.Writeable;
3240if (local.LocalSymbol.RefKind != RefKind.None && !assignment.IsRef)
3273Debug.Assert(((BoundDup)expression).RefKind != RefKind.None);
3302Debug.Assert(((BoundCall)expression).Method.RefKind != RefKind.None);
3307Debug.Assert(((BoundFunctionPointerInvocation)expression).FunctionPointer.Signature.RefKind != RefKind.None);
3451if (field.RefKind != RefKind.None && !refAssign)
3466if (parameter.ParameterSymbol.RefKind != RefKind.None && !refAssign)
4263if (useKind == UseKind.UsedAsValue && method.RefKind != RefKind.None)
4269Debug.Assert(method.RefKind != RefKind.None);
CodeGen\Optimizer.cs (23)
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)
1893Debug.Assert(local.RefKind == RefKind.None, "cannot take a ref of a ref");
1954return top.Item2 == (local.RefKind == RefKind.None ? ExprContext.Value : ExprContext.Address) &&
2230var isIndirectLocalStore = left.LocalSymbol.RefKind != RefKind.None && !node.IsRef;
2496public override RefKind RefKind
2498get { 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)
1447WriteArgument(receiverOpt, RefKind.Ref, method: null);
1453var thisRefKind = thisParameter.RefKind;
1527protected virtual void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1534private void VisitArgumentsBeforeCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt)
1539RefKind refKind = GetRefKind(refKindsOpt, i);
1540if (refKind != RefKind.Out)
1542VisitRvalue(arguments[i], isKnownToBeAnLvalue: refKind != RefKind.None);
1555private void VisitArgumentsAfterCall(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol? method, ImmutableArray<int> argsToParamsOpt, bool expanded)
1559RefKind refKind = GetRefKind(refKindsOpt, i);
1562case RefKind.None:
1563case RefKind.In:
1564case RefKind.RefReadOnlyParameter:
1567case RefKind.Ref:
1570goto case RefKind.Out;
1573case RefKind.Out:
1584protected static RefKind GetRefKind(ImmutableArray<RefKind> refKindsOpt, int index)
1586return refKindsOpt.IsDefault || refKindsOpt.Length <= index ? RefKind.None : refKindsOpt[index];
1589protected virtual void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2043VisitRvalue(node.ExpressionOpt, isKnownToBeAnLvalue: node.RefKind != RefKind.None);
2046if (node.RefKind != RefKind.None)
2157if (property.RefKind == RefKind.None)
2175var refKind = node.Left.Kind == BoundKind.BadExpression
2176? RefKind.Ref
2212if (property.RefKind == RefKind.None)
2231if (property.RefKind == RefKind.None)
2848if (property.RefKind == RefKind.None)
3350WriteArgument(operand, RefKind.Ref, method: null);
3536this.WriteArgument(operand, RefKind.Out, null); //Out because for the purpose of definite assignment we assume that it is definitely assigned after the address is taken.
3586VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.Constructor, default, false);
3670VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod, node.ArgsToParamsOpt, node.Expanded);
3676VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), node.AddMethod, node.ArgsToParamsOpt, node.Expanded);
3684VisitArguments(node.Arguments, default(ImmutableArray<RefKind>), method: null, default, false);
3776property.RefKind == RefKind.None)
FlowAnalysis\DefiniteAssignment.cs (22)
356NoteWrite(parameter, value: null, read: true, isRef: parameter.RefKind != RefKind.None);
820write: field.RefKind == RefKind.None || isRef);
933write: field.RefKind == RefKind.None || isRef);
1196((ParameterSymbol)symbol).RefKind == RefKind.Out)
1296if (fieldSymbol.RefKind != RefKind.None)
1480if (!isRef && node is BoundFieldAccess { FieldSymbol.RefKind: not RefKind.None } fieldAccess)
1533if (local.LocalSymbol.RefKind != RefKind.None && !isRef)
1584if (isRef && param.RefKind == RefKind.Out)
1602write: field.RefKind == RefKind.None || isRef);
1776if (parameter.RefKind != RefKind.Out)
1788if (thisParameter.RefKind != RefKind.Out)
1800if (extensionParameter.RefKind != RefKind.Out)
1823if (current is not MethodSymbol && parameter.RefKind == RefKind.Out)
1853if (parameter.RefKind == RefKind.Out && !(this.CurrentSymbol is MethodSymbol currentMethod && currentMethod.IsAsync)) // out parameters not allowed in async
1861NoteWrite(parameter, value: null, read: true, isRef: parameter.RefKind != RefKind.None);
1919if (!parameter.IsThis && parameter.RefKind != RefKind.Out && parameter.ContainingSymbol is SynthesizedPrimaryConstructor primaryCtor)
1931if (parameter.RefKind != RefKind.None)
2591WriteArgument(operand, RefKind.Out, null);
2595protected override void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2597if (refKind == RefKind.Ref)
2611if (refKind != RefKind.None && ((object)method == null || method.IsExtern) && arg.Type is TypeSymbol type)
2803NoteWrite(iterationVariable, null, read: true, isRef: iterationVariable.RefKind != RefKind.None);
FlowAnalysis\NullableWalker.cs (70)
1421var refKind = parameter.RefKind;
1422if (refKind != RefKind.Out && refKind != RefKind.Ref)
2566RefKind refKind,
2576if (refKind == RefKind.Ref)
2579return AreParameterAnnotationsCompatible(RefKind.None, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations, forRef: true) &&
2580AreParameterAnnotationsCompatible(RefKind.Out, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations);
2583if (refKind is RefKind.None or RefKind.In or RefKind.RefReadOnlyParameter)
2613if (refKind == RefKind.Out)
3085if (parameter.RefKind != RefKind.Out)
3158if (node.RefKind == RefKind.None &&
3167if (node.RefKind == RefKind.None)
4658out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKindsOpt,
4833out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKindsOpt, out ImmutableArray<int> argsToParamsOpt,
6913var refKind = isExtensionBlockMethod ? GetExtensionReceiverRefKind(node.Method) : GetRefKind(node.ArgumentRefKindsOpt, 0);
7049ImmutableArray<RefKind> refKindsOpt,
7107internal static ImmutableArray<RefKind> AdjustArgumentRefKindsIfNeeded(ImmutableArray<RefKind> argumentRefKindsOpt, bool adjustForExtensionBlockMethod,
7116RefKind receiverRefKind = GetExtensionReceiverRefKind(member);
7120if (receiverRefKind == RefKind.None)
7125var builder = ArrayBuilder<RefKind>.GetInstance(argumentCount + 1, fillWithValue: RefKind.None);
7133private static RefKind GetExtensionReceiverRefKind(Symbol member)
7140return extensionParameter.RefKind == RefKind.Ref ? RefKind.Ref : RefKind.None;
7609protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7619ImmutableArray<RefKind> refKindsOpt,
7634ImmutableArray<RefKind> refKindsOpt,
7664ImmutableArray<RefKind> refKindsOpt,
7707ImmutableArray<RefKind> refKindsOpt,
7897ImmutableArray<RefKind> refKindsOpt,
7916static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7976var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(refKindsOpt.Length + elements.Length - 1);
7978refKindsBuilder.AddMany(RefKind.None, elements.Length);
8169ImmutableArray<RefKind> refKindsOpt,
8230private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8242private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8248case RefKind.Ref:
8251case RefKind.None:
8252case RefKind.In:
8274case RefKind.Out:
8297RefKind refKind,
8312case RefKind.None:
8313case RefKind.In:
8351case RefKind.Ref:
8371case RefKind.Out:
8435RefKind refKind,
8448case RefKind.None:
8449case RefKind.In:
8455case RefKind.Ref:
8482case RefKind.Out:
8550void trackNullableStateForAssignment(TypeSymbol? receiverType, BoundExpression parameterValue, TypeWithAnnotations lValueType, int targetSlot, TypeWithState parameterWithState, bool isSuppressed, FlowAnalysisAnnotations parameterAnnotations, RefKind refKind, ParameterSymbol parameter)
8575static bool hasConditionalPostCondition(TypeSymbol? receiverType, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8586static bool isUnionTryGetValueValue(TypeSymbol? receiverType, RefKind refKind, ParameterSymbol parameter)
8588if (refKind == RefKind.Out &&
8617static TypeWithState applyPostConditionsWhenTrue(TypeSymbol? receiverType, TypeWithState typeWithState, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8707ImmutableArray<RefKind> refKindsOpt)
8718RefKind refKind = GetRefKind(refKindsOpt, i);
8721if (refKind == RefKind.None)
8789ImmutableArray<RefKind> argumentRefKindsOpt,
8799var refKinds = ArrayBuilder<RefKind>.GetInstance();
8820parameterRefKinds: out ImmutableArray<RefKind> parameterRefKinds);
11487case BoundLocal { LocalSymbol.RefKind: RefKind.None }:
11488case BoundParameter { ParameterSymbol: { RefKind: RefKind.None } parameter } when
12249ImmutableArray<RefKind> refKindsOpt,
13769TypeWithAnnotations elementType = InMethodBinder.GetIteratorElementTypeFromReturnType(compilation, RefKind.None,
13819VisitArguments(node, receiverType: null, node.ConstructorArguments, ImmutableArray<RefKind>.Empty, node.Constructor, argsToParamsOpt: node.ConstructorArgumentsToParamsOpt, defaultArguments: node.ConstructorDefaultArguments,
Generated\BoundNodes.xml.Generated.cs (43)
927public BoundDup(SyntaxNode syntax, RefKind refKind, bool isAlive, TypeSymbol? type, bool hasErrors)
934public BoundDup(SyntaxNode syntax, RefKind refKind, bool isAlive, TypeSymbol? type)
941public RefKind RefKind { get; }
947public BoundDup Update(RefKind refKind, bool isAlive, TypeSymbol? type)
1468public BoundFunctionPointerInvocation(SyntaxNode syntax, BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type, bool hasErrors = false)
1485public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
1491public BoundFunctionPointerInvocation Update(BoundExpression invokedExpression, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, LookupResultKind resultKind, TypeSymbol type)
2116public BoundRefAccess(SyntaxNode syntax, RefKind refKind, BoundExpression expression, TypeSymbol type, bool hasErrors = false)
2128public RefKind RefKind { get; }
2134public BoundRefAccess Update(RefKind refKind, BoundExpression expression, TypeSymbol type)
3117public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3129public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
3134public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3623public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3635public RefKind RefKind { get; }
3642public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
5967public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5983public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
5989public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6217public 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)
6250public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6262public 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)
6360public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6377public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6384public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6419public 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)
6445public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6456public 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)
6517public BoundUnconvertedWithElement(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool hasErrors = false)
6530public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6535public BoundUnconvertedWithElement Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt)
6741public 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)
6762public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6770public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6863public 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)
6887public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6898public 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)
7531public 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)
7558public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7568public 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)
7672public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7692public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7698public BoundDynamicIndexerAccess Update(BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type)
Lowering\LocalRewriter\LocalRewriter_Call.cs (109)
140ref ImmutableArray<RefKind> argumentRefKindsOpt,
300var thisRefKind = methodThisParameter.RefKind;
303if (thisRefKind != RefKind.None
306thisRefKind == RefKind.Ref ? CodeGenerator.AddressKind.Writeable : CodeGenerator.AddressKind.ReadOnly,
320if (argumentRefKindsOpt.IsDefault && thisRefKind != RefKind.None)
324Debug.Assert(argumentRefKindsOpt.All(static refKind => refKind == RefKind.None));
383ImmutableArray<RefKind> argRefKindsOpt = node.ArgumentRefKindsOpt;
463ImmutableArray<RefKind> argumentRefKinds,
550argumentRefKinds: default(ImmutableArray<RefKind>),
555private static bool IsSafeForReordering(BoundExpression expression, RefKind kind)
577return kind != RefKind.None && current.GetRefKind() == RefKind.None;
582return kind != RefKind.None &&
583(current.GetRefKind() == RefKind.None ||
676ImmutableArray<RefKind> argumentRefKindsOpt,
697RefKind refKind;
702Debug.Assert(refKind != RefKind.Ref ||
718refKind = rewrittenReceiver.Type.IsValueType || rewrittenReceiver.Type.Kind == SymbolKind.TypeParameter ? RefKind.Ref : RefKind.None;
720if (refKind == RefKind.Ref &&
725refKind = RefKind.None;
730refKind = rewrittenReceiver.Type.IsReferenceType ? RefKind.None : RefKind.Ref;
745if (refKind == RefKind.Ref &&
758BoundLocal receiverTemp = _factory.StoreToTemp(rewrittenReceiver, out assignmentToTemp, refKind is RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
932RefKind argRefKind = argumentRefKindsOpt.RefKinds(argIndex);
933RefKind paramRefKind = parameters[paramIndex].RefKind;
935BoundLocal local = _factory.StoreToTemp(visitedArgument, out var store, refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter ? RefKind.In : argRefKind);
984private RefKind AdjustReadonlyReceiverCaptureRefKind(BoundExpression rewrittenReceiver, RefKind refKind)
999if (refKind == RefKind.Ref && rewrittenReceiver is not BoundArrayAccess &&
1016refKind = RefKind.None;
1023private RefKind GetExtensionBlockMemberReceiverCaptureRefKind(BoundExpression rewrittenReceiver, Symbol methodOrIndexer)
1025var refKind = getExtensionBlockMemberReceiverCaptureRefKind(rewrittenReceiver, methodOrIndexer);
1026Debug.Assert(refKind != RefKind.Ref ||
1032RefKind getExtensionBlockMemberReceiverCaptureRefKind(BoundExpression rewrittenReceiver, Symbol methodOrIndexer)
1037RefKind receiverRefKind = methodOrIndexer.ContainingType.ExtensionParameter.RefKind;
1038bool isReceiverTakenByValue = receiverRefKind == RefKind.None;
1043return RefKind.None;
1057return RefKind.None;
1060RefKind refKind = ExtensionMethodReferenceRewriter.ReceiverArgumentRefKindFromReceiverRefKind(receiverRefKind);
1071return RefKind.None;
1074static CodeGenerator.AddressKind getArgumentAddressKind(RefKind refKind)
1078case RefKind.None:
1081case RefKind.In:
1087Debug.Assert(refKind is RefKind.Ref);
1122RefKind refKind;
1134refKind = RefKind.Ref;
1164receiverTemp = _factory.Local(_factory.SynthesizedLocal(receiverType, refKind: RefKind.None));
1197ref ImmutableArray<RefKind> argumentRefKindsOpt,
1280ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
1350private static ImmutableArray<RefKind> GetEffectiveArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters)
1352ArrayBuilder<RefKind>? refKindsBuilder = null;
1355var paramRefKind = parameters[i].RefKind;
1356var currentArgRefKind = argumentRefKindsOpt.IsDefault ? RefKind.None : argumentRefKindsOpt[i];
1357var effectiveArgRefKind = GetEffectiveRefKind(paramRefKind, currentArgRefKind, parameters[i].Type, comRefKindMismatchPossible: false);
1375static void fillRefKindsBuilder(ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<ParameterSymbol> parameters, [NotNull] ref ArrayBuilder<RefKind>? refKindsBuilder)
1382refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length);
1387refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(parameters.Length, fillWithValue: RefKind.None);
1393internal static RefKind GetEffectiveRefKind(RefKind paramRefKind, RefKind initialArgRefKind, TypeSymbol paramType, bool comRefKindMismatchPossible)
1401if (paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter)
1403Debug.Assert(initialArgRefKind is RefKind.None or RefKind.In or RefKind.Ref);
1404return initialArgRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn;
1406else if (paramRefKind == RefKind.Ref && initialArgRefKind == RefKind.None)
1412return RefKind.Ref;
1478private static ImmutableArray<RefKind> GetRefKindsOrNull(ArrayBuilder<RefKind> refKinds)
1480foreach (var refKind in refKinds)
1482if (refKind != RefKind.None)
1487return default(ImmutableArray<RefKind>);
1540ImmutableArray<RefKind> argumentRefKinds,
1544/* out */ ArrayBuilder<RefKind> refKinds,
1556RefKind argRefKind = argumentRefKinds.RefKinds(a);
1557RefKind paramRefKind = parameters[p].RefKind;
1565Debug.Assert(argRefKind == RefKind.None);
1581arg.rewriter.StoreArgumentToTempIfNecessary(arg.forceLambdaSpilling, arg.storesToTemps, element, RefKind.None, RefKind.None),
1597private BoundExpression StoreArgumentToTempIfNecessary(bool forceLambdaSpilling, ArrayBuilder<BoundAssignmentOperator> storesToTemps, BoundExpression argument, RefKind argRefKind, RefKind paramRefKind)
1609refKind: paramRefKind is RefKind.In or RefKind.RefReadOnlyParameter
1610? (argRefKind == RefKind.None ? RefKind.In : RefKindExtensions.StrictIn)
1664default(ImmutableArray<RefKind>),
1824ArrayBuilder<RefKind> argsRefKindsBuilder,
1837RefKind paramRefKind = parameters[argIndex].RefKind;
1838RefKind argRefKind = argsRefKindsBuilder[argIndex];
1842if (argRefKind != RefKind.None || paramRefKind != RefKind.Ref)
1850var localRefKind = ((BoundLocal)argument).LocalSymbol.RefKind;
1851if (localRefKind == RefKind.Ref)
1857Debug.Assert(localRefKind == RefKind.None);
1869argsRefKindsBuilder[argIndex] = RefKind.Ref;
Lowering\LocalRewriter\LocalRewriter_CompoundAssignmentOperator.cs (29)
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 };
295RefKind refKind;
300Debug.Assert(refKind != RefKind.Ref ||
321refKind = RefKind.None;
325refKind = variableRepresentsLocation ? RefKind.Ref : RefKind.None;
333if (refKind == RefKind.Ref &&
349refKind: refKind is RefKind.RefReadOnlyParameter ? RefKind.In : refKind);
473ImmutableArray<RefKind> argumentRefKinds = indexerAccess.ArgumentRefKindsOpt;
505ref ImmutableArray<RefKind> argumentRefKinds,
512ArrayBuilder<RefKind> refKinds = ArrayBuilder<RefKind>.GetInstance(parameters.Length, RefKind.None);
585Debug.Assert(implicitIndexerAccess.IndexerOrSliceAccess.GetRefKind() == RefKind.None);
611var variableTemp = _factory.StoreToTemp(arrayAccess, out assignmentToTemp, refKind: RefKind.Ref);
689var temp = _factory.StoreToTemp(VisitExpression(arguments[i]), out assignmentToTemp, indexerAccess.ArgumentRefKindsOpt.RefKinds(i) != RefKind.None ? RefKind.Ref : RefKind.None);
760if (propertyAccess.PropertySymbol.RefKind == RefKind.None)
775if (indexerAccess.GetRefKind() == RefKind.None)
788if (implicitIndexerAccess.GetRefKind() == RefKind.None)
841Debug.Assert(originalLHS.GetRefKind() == RefKind.Ref);
862Debug.Assert(((BoundCall)originalLHS).Method.RefKind != RefKind.None);
866Debug.Assert(((BoundFunctionPointerInvocation)originalLHS).FunctionPointer.Signature.RefKind != RefKind.None);
917var variableTemp = _factory.StoreToTemp(rewrittenVariable, out assignmentToTemp2, refKind: RefKind.Ref);
1018((BoundParameter)expression).ParameterSymbol.RefKind != RefKind.None ||
1022return 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 (43)
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 },
550Left: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.None } referenceTypeClone },
554Value: BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: RefKind.None } } referenceTypeReceiver
575if (valueTypeReceiverLocal is { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: not RefKind.None } }
576&& originalReceiver is BoundLocal { LocalSymbol: { SynthesizedKind: SynthesizedLocalKind.LoweringTemp, RefKind: not RefKind.None } } originalReceiverLocal
586&& receiverRefLocal.RefKind == RefKind.Ref
634ImmutableArray<RefKind> refKinds = default(ImmutableArray<RefKind>),
682var refKind = refKinds.IsDefault ? RefKind.None : refKinds[i];
970left = Spill(leftBuilder, VisitExpression(ref leftBuilder, left), RefKind.Ref);
1014receiver = Spill(leftBuilder, VisitExpression(ref leftBuilder, field.ReceiverOpt), RefKind.Ref);
1032expression = Spill(builder, expression, RefKind.None);
1102RefKind refKind = ReceiverSpillRefKind(receiver);
1104Debug.Assert(refKind == RefKind.None || !receiver.Type.IsReferenceType);
1106if (refKind == RefKind.Ref &&
1119if (refKind != RefKind.None &&
1155private static RefKind ReceiverSpillRefKind(BoundExpression receiver)
1157var result = RefKind.None;
1160result = receiver.Type.IsReadOnly ? RefKind.In : RefKind.Ref;
1349var receiverRefKind = ReceiverSpillRefKind(node.Receiver);
1370if (receiver.Type.IsReferenceType || receiver.Type.IsValueType || receiverRefKind == RefKind.None)
1373receiver = Spill(receiverBuilder, receiver, RefKind.None);
1388receiver = Spill(receiverBuilder, receiver, RefKind.Ref);
1390var 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);
804public BoundObjectCreationExpression New(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKinds)
914public static ImmutableArray<RefKind> ArgumentRefKindsFromParameterRefKinds(MethodSymbol method, bool useStrictArgumentRefKinds)
918if (!result.IsDefaultOrEmpty && (result.Contains(RefKind.RefReadOnlyParameter) ||
919(useStrictArgumentRefKinds && result.Contains(RefKind.In))))
921var builder = ArrayBuilder<RefKind>.GetInstance(result.Length);
923foreach (var refKind in result)
934public static RefKind ArgumentRefKindFromParameterRefKind(RefKind refKind, bool useStrictArgumentRefKinds)
938RefKind.In or RefKind.RefReadOnlyParameter when useStrictArgumentRefKinds => RefKindExtensions.StrictIn,
939RefKind.RefReadOnlyParameter => RefKind.In,
944public BoundCall Call(BoundExpression? receiver, MethodSymbol method, ImmutableArray<RefKind> refKinds, ImmutableArray<BoundExpression> args)
1673RefKind refKind = RefKind.None,
1690case RefKind.Out:
1691refKind = RefKind.Ref;
1694case RefKind.In:
1703Debug.Assert(argument.GetRefKind() != RefKind.In);
1704refKind = RefKind.None;
1708case RefKind.None:
1709case RefKind.Ref:
1740isRef: 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)
2411var refKind1 = method1.Parameters[i].RefKind;
2412var refKind2 = method2.Parameters[i].RefKind;
4675if (methodParam.RefKind != RefKind.None)
4698methodParams[0].RefKind == RefKind.None &&
5180RefKind.Out
5182RefKind.None,
5228RefKind.None
5230RefKind.None,
5281RefKind.None)),
5282RefKind.None,
5337RefKind.None,
5416RefKind.None,
5511RefKind.None,
5542RefKind.None,
5608RefKind.None
5610RefKind.None,
5811_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);
5818var 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)
42RefKind.None,
Symbols\Synthesized\Records\SynthesizedRecordPropertySymbol.cs (1)
41RefKind.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)
36RefKind.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)
146document, state, generateProperty: false, isReadonly: false, isConstant: true, refKind: RefKind.None));
160document, state, generateProperty: false, isReadonly: true, isConstant: false, refKind: RefKind.None));
174document, state, generateProperty: false, isReadonly: false, isConstant: false, refKind: RefKind.None));
222parameter.RefKind is RefKind.Out ||
247private static RefKind GetRefKindFromContext(State state)
251return RefKind.Ref;
255return RefKind.RefReadOnly;
259return 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,