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)
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\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 (62)
707RefKind refKind = expression.ArgumentRefKindsOpt.IsDefaultOrEmpty ? RefKind.None : expression.ArgumentRefKindsOpt[i];
712private void EmitArgument(BoundExpression argument, RefKind refKind)
716case RefKind.None:
721Debug.Assert(refKind is RefKind.In or RefKind.Ref or RefKind.Out or RefKindExtensions.StrictIn);
727Debug.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");
735internal static AddressKind GetArgumentAddressKind(RefKind refKind)
739case RefKind.None:
742case RefKind.In:
746Debug.Assert(refKind is RefKind.Ref or RefKind.Out or RefKindExtensions.StrictIn);
787if (expression.RefKind == RefKind.None)
954private void EmitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt)
959Debug.Assert(parameters.All(p => p.RefKind == RefKind.None) || !argRefKindsOpt.IsDefault, "there are nontrivial parameters, so we must have argRefKinds");
966RefKind argRefKind = GetArgumentRefKind(arguments, parameters, argRefKindsOpt, i);
975internal static RefKind GetArgumentRefKind(ImmutableArray<BoundExpression> arguments, ImmutableArray<ParameterSymbol> parameters, ImmutableArray<RefKind> argRefKindsOpt, int i)
977RefKind argRefKind;
988RefKind.In => argRefKind == RefKindExtensions.StrictIn,
989RefKind.RefReadOnlyParameter => argRefKind is RefKind.In or RefKindExtensions.StrictIn,
996Debug.Assert(parameters[i].RefKind != RefKind.RefReadOnlyParameter,
1002RefKind.RefReadOnlyParameter => RefKind.In, // should not happen, asserted above
1011argRefKind = RefKind.None;
1117EmitRefAssignmentValue(RefKind.Ref, refArrayAccess.ArrayAccess);
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;
1442if (used || parameter.ParameterSymbol.RefKind != RefKind.None) // unused value parameter has no side-effects
1447if (parameter.ParameterSymbol.RefKind != RefKind.None)
1772var methodRefKind = call.Method.RefKind;
2266return ((BoundLocal)receiver).LocalSymbol.RefKind != RefKind.None;
2269return ((BoundParameter)receiver).ParameterSymbol.RefKind != RefKind.None;
2272return ((BoundCall)receiver).Method.RefKind != RefKind.None;
2275return ((BoundFunctionPointerInvocation)receiver).FunctionPointer.Signature.RefKind != RefKind.None;
2278return ((BoundDup)receiver).RefKind != RefKind.None;
2690if (System.Linq.ImmutableArrayExtensions.All(ctor.Parameters, p => p.RefKind == RefKind.None) &&
2821return ((BoundParameter)left).ParameterSymbol.RefKind == RefKind.None;
2826return ((BoundLocal)left).LocalSymbol.RefKind == RefKind.None;
2846if (left.FieldSymbol.RefKind != RefKind.None &&
2864if (left.ParameterSymbol.RefKind != RefKind.None &&
2896if (left.LocalSymbol.RefKind != RefKind.None && !assignmentOperator.IsRef)
2995Debug.Assert(left.Method.RefKind != RefKind.None);
3006Debug.Assert(left.FunctionPointer.Signature.RefKind != RefKind.None);
3079private void EmitRefAssignmentValue(RefKind refKind, BoundExpression right)
3083LocalDefinition temp = EmitAddress(right, refKind is RefKind.RefReadOnly or RefKindExtensions.StrictIn or RefKind.RefReadOnlyParameter ? AddressKind.ReadOnlyStrict : AddressKind.Writeable);
3146if (local.LocalSymbol.RefKind != RefKind.None && !assignment.IsRef)
3179Debug.Assert(((BoundDup)expression).RefKind != RefKind.None);
3202Debug.Assert(((BoundCall)expression).Method.RefKind != RefKind.None);
3207Debug.Assert(((BoundFunctionPointerInvocation)expression).FunctionPointer.Signature.RefKind != RefKind.None);
3351if (field.RefKind != RefKind.None && !refAssign)
3366if (parameter.ParameterSymbol.RefKind != RefKind.None && !refAssign)
4163if (useKind == UseKind.UsedAsValue && method.RefKind != RefKind.None)
4169Debug.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)
2556protected override void WriteArgument(BoundExpression arg, RefKind refKind, MethodSymbol method)
2558if (refKind == RefKind.Ref)
2572if (refKind != RefKind.None && ((object)method == null || method.IsExtern) && arg.Type is TypeSymbol type)
2764NoteWrite(iterationVariable, null, read: true, isRef: iterationVariable.RefKind != RefKind.None);
FlowAnalysis\NullableWalker.cs (70)
1384var refKind = parameter.RefKind;
1385if (refKind != RefKind.Out && refKind != RefKind.Ref)
2517RefKind refKind,
2527if (refKind == RefKind.Ref)
2530return AreParameterAnnotationsCompatible(RefKind.None, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations, forRef: true) &&
2531AreParameterAnnotationsCompatible(RefKind.Out, overriddenType, overriddenAnnotations, overridingType, overridingAnnotations);
2534if (refKind is RefKind.None or RefKind.In or RefKind.RefReadOnlyParameter)
2564if (refKind == RefKind.Out)
3036if (parameter.RefKind != RefKind.Out)
3109if (node.RefKind == RefKind.None &&
3118if (node.RefKind == RefKind.None)
4592out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKindsOpt,
4767out ImmutableArray<BoundExpression> arguments, out ImmutableArray<RefKind> refKindsOpt, out ImmutableArray<int> argsToParamsOpt,
6831var refKind = isExtensionBlockMethod ? GetExtensionReceiverRefKind(node.Method) : GetRefKind(node.ArgumentRefKindsOpt, 0);
6967ImmutableArray<RefKind> refKindsOpt,
7025internal static ImmutableArray<RefKind> AdjustArgumentRefKindsIfNeeded(ImmutableArray<RefKind> argumentRefKindsOpt, bool adjustForExtensionBlockMethod,
7034RefKind receiverRefKind = GetExtensionReceiverRefKind(member);
7038if (receiverRefKind == RefKind.None)
7043var builder = ArrayBuilder<RefKind>.GetInstance(argumentCount + 1, fillWithValue: RefKind.None);
7051private static RefKind GetExtensionReceiverRefKind(Symbol member)
7058return extensionParameter.RefKind == RefKind.Ref ? RefKind.Ref : RefKind.None;
7519protected override void VisitArguments(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKindsOpt, MethodSymbol method, ImmutableArray<int> argsToParamsOpt, bool expanded)
7529ImmutableArray<RefKind> refKindsOpt,
7544ImmutableArray<RefKind> refKindsOpt,
7573ImmutableArray<RefKind> refKindsOpt,
7616ImmutableArray<RefKind> refKindsOpt,
7808ImmutableArray<RefKind> refKindsOpt,
7827static void expandParamsCollection(ref ImmutableArray<BoundExpression> arguments, ref ImmutableArray<RefKind> refKindsOpt, ImmutableArray<ParameterSymbol> parametersOpt, ref ImmutableArray<int> argsToParamsOpt, ref BitVector defaultArguments)
7887var refKindsBuilder = ArrayBuilder<RefKind>.GetInstance(refKindsOpt.Length + elements.Length - 1);
7889refKindsBuilder.AddMany(RefKind.None, elements.Length);
8080ImmutableArray<RefKind> refKindsOpt,
8141private VisitResult VisitArgumentEvaluate(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8153private VisitResult VisitArgumentEvaluateEpilogue(BoundExpression argument, RefKind refKind, FlowAnalysisAnnotations annotations)
8159case RefKind.Ref:
8162case RefKind.None:
8163case RefKind.In:
8185case RefKind.Out:
8208RefKind refKind,
8223case RefKind.None:
8224case RefKind.In:
8262case RefKind.Ref:
8282case RefKind.Out:
8346RefKind refKind,
8359case RefKind.None:
8360case RefKind.In:
8366case RefKind.Ref:
8393case RefKind.Out:
8461void trackNullableStateForAssignment(TypeSymbol? receiverType, BoundExpression parameterValue, TypeWithAnnotations lValueType, int targetSlot, TypeWithState parameterWithState, bool isSuppressed, FlowAnalysisAnnotations parameterAnnotations, RefKind refKind, ParameterSymbol parameter)
8486static bool hasConditionalPostCondition(TypeSymbol? receiverType, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8497static bool isUnionTryGetValueValue(TypeSymbol? receiverType, RefKind refKind, ParameterSymbol parameter)
8499if (refKind == RefKind.Out &&
8528static TypeWithState applyPostConditionsWhenTrue(TypeSymbol? receiverType, TypeWithState typeWithState, FlowAnalysisAnnotations annotations, RefKind refKind, ParameterSymbol parameter)
8618ImmutableArray<RefKind> refKindsOpt)
8629RefKind refKind = GetRefKind(refKindsOpt, i);
8632if (refKind == RefKind.None)
8700ImmutableArray<RefKind> argumentRefKindsOpt,
8710var refKinds = ArrayBuilder<RefKind>.GetInstance();
8731parameterRefKinds: out ImmutableArray<RefKind> parameterRefKinds);
11391case BoundLocal { LocalSymbol.RefKind: RefKind.None }:
11392case BoundParameter { ParameterSymbol: { RefKind: RefKind.None } parameter } when
12153ImmutableArray<RefKind> refKindsOpt,
13664TypeWithAnnotations elementType = InMethodBinder.GetIteratorElementTypeFromReturnType(compilation, RefKind.None,
13706VisitArguments(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)
3114public BoundArgListOperator(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type, bool hasErrors = false)
3126public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
3131public BoundArgListOperator Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> argumentRefKindsOpt, TypeSymbol? type)
3620public BoundReturnStatement(SyntaxNode syntax, RefKind refKind, BoundExpression? expressionOpt, bool @checked, bool hasErrors = false)
3632public RefKind RefKind { get; }
3639public BoundReturnStatement Update(RefKind refKind, BoundExpression? expressionOpt, bool @checked)
5964public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type, bool hasErrors = false)
5980public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
5986public BoundDynamicInvocation Update(ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<MethodSymbol> applicableMethods, BoundExpression expression, ImmutableArray<BoundExpression> arguments, TypeSymbol type)
6214public 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)
6247public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6259public 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)
6357public BoundUnconvertedObjectCreationExpression(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder, bool hasErrors = false)
6374public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6381public BoundUnconvertedObjectCreationExpression Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, InitializerExpressionSyntax? initializerOpt, Binder binder)
6416public 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)
6442public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6453public 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)
6514public BoundUnconvertedWithElement(SyntaxNode syntax, ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool hasErrors = false)
6527public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6532public BoundUnconvertedWithElement Update(ImmutableArray<BoundExpression> arguments, ImmutableArray<(string Name, Location Location)?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt)
6738public 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)
6759public override ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6767public BoundDynamicObjectCreationExpression Update(string name, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, BoundObjectInitializerExpressionBase? initializerExpressionOpt, ImmutableArray<MethodSymbol> applicableMethods, bool wasTargetTyped, TypeSymbol type)
6860public 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)
6884public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
6895public 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)
7528public 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)
7555public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7565public 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)
7669public BoundDynamicIndexerAccess(SyntaxNode syntax, BoundExpression receiver, ImmutableArray<BoundExpression> arguments, ImmutableArray<string?> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, ImmutableArray<PropertySymbol> applicableIndexers, TypeSymbol type, bool hasErrors = false)
7689public ImmutableArray<RefKind> ArgumentRefKindsOpt { get; }
7695public 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)
2401var refKind1 = method1.Parameters[i].RefKind;
2402var refKind2 = method2.Parameters[i].RefKind;
4665if (methodParam.RefKind != RefKind.None)
4688methodParams[0].RefKind == RefKind.None &&
5182RefKind.Out
5184RefKind.None,
5230RefKind.None
5232RefKind.None,
5283RefKind.None)),
5284RefKind.None,
5339RefKind.None,
5418RefKind.None,
5513RefKind.None,
5544RefKind.None,
5610RefKind.None
5612RefKind.None,
5813_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);
5820var 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,