| File: Symbols\ParameterSignature.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Collections.Immutable; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Text; namespace Microsoft.CodeAnalysis.CSharp.Symbols { internal class ParameterSignature { internal readonly ImmutableArray<TypeWithAnnotations> parameterTypesWithAnnotations; internal readonly ImmutableArray<RefKind> parameterRefKinds; internal static readonly ParameterSignature NoParams = new ParameterSignature(ImmutableArray<TypeWithAnnotations>.Empty, default(ImmutableArray<RefKind>)); private ParameterSignature(ImmutableArray<TypeWithAnnotations> parameterTypesWithAnnotations, ImmutableArray<RefKind> parameterRefKinds) { this.parameterTypesWithAnnotations = parameterTypesWithAnnotations; this.parameterRefKinds = parameterRefKinds; } private static ParameterSignature MakeParamTypesAndRefKinds(ImmutableArray<ParameterSymbol> parameters) { if (parameters.Length == 0) { return NoParams; } var types = ArrayBuilder<TypeWithAnnotations>.GetInstance(); ArrayBuilder<RefKind> refs = null; for (int parm = 0; parm < parameters.Length; ++parm) { var parameter = parameters[parm]; types.Add(parameter.TypeWithAnnotations); var refKind = parameter.RefKind; if (refs == null) { if (refKind != RefKind.None) { refs = ArrayBuilder<RefKind>.GetInstance(parm, RefKind.None); refs.Add(refKind); } } else { refs.Add(refKind); } } ImmutableArray<RefKind> refKinds = refs != null ? refs.ToImmutableAndFree() : default(ImmutableArray<RefKind>); return new ParameterSignature(types.ToImmutableAndFree(), refKinds); } internal static void PopulateParameterSignature(ImmutableArray<ParameterSymbol> parameters, ref ParameterSignature lazySignature) { if (lazySignature == null) { Interlocked.CompareExchange(ref lazySignature, MakeParamTypesAndRefKinds(parameters), null); } } } }