using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.CodeAnalysis.PooledObjects; namespace Microsoft.CodeAnalysis.CSharp.Symbols; internal sealed class MethodWellKnownAttributeData : CommonMethodWellKnownAttributeData, ISkipLocalsInitAttributeTarget, IMemberNotNullAttributeTarget { private bool _hasDoesNotReturnAttribute; private bool _hasSkipLocalsInitAttribute; private bool _hasUnscopedRefAttribute; private ImmutableArray _memberNotNullAttributeData = ImmutableArray.Empty; private ImmutableArray _memberNotNullWhenTrueAttributeData = ImmutableArray.Empty; private ImmutableArray _memberNotNullWhenFalseAttributeData = ImmutableArray.Empty; private UnmanagedCallersOnlyAttributeData? _unmanagedCallersOnlyAttributeData; public bool HasDoesNotReturnAttribute { get { return _hasDoesNotReturnAttribute; } set { _hasDoesNotReturnAttribute = value; } } public bool HasSkipLocalsInitAttribute { get { return _hasSkipLocalsInitAttribute; } set { _hasSkipLocalsInitAttribute = value; } } public bool HasUnscopedRefAttribute { get { return _hasUnscopedRefAttribute; } set { _hasUnscopedRefAttribute = value; } } public ImmutableArray NotNullMembers => _memberNotNullAttributeData; public ImmutableArray NotNullWhenTrueMembers => _memberNotNullWhenTrueAttributeData; public ImmutableArray NotNullWhenFalseMembers => _memberNotNullWhenFalseAttributeData; public UnmanagedCallersOnlyAttributeData? UnmanagedCallersOnlyAttributeData { get { return _unmanagedCallersOnlyAttributeData; } set { _unmanagedCallersOnlyAttributeData = value; } } public void AddNotNullMember(string memberName) { _memberNotNullAttributeData = _memberNotNullAttributeData.Add(memberName); } public void AddNotNullMember(ArrayBuilder memberNames) { _memberNotNullAttributeData = _memberNotNullAttributeData.AddRange((IEnumerable)memberNames); } public void AddNotNullWhenMember(bool sense, string memberName) { if (sense) { _memberNotNullWhenTrueAttributeData = _memberNotNullWhenTrueAttributeData.Add(memberName); } else { _memberNotNullWhenFalseAttributeData = _memberNotNullWhenFalseAttributeData.Add(memberName); } } public void AddNotNullWhenMember(bool sense, ArrayBuilder memberNames) { if (sense) { _memberNotNullWhenTrueAttributeData = _memberNotNullWhenTrueAttributeData.AddRange((IEnumerable)memberNames); } else { _memberNotNullWhenFalseAttributeData = _memberNotNullWhenFalseAttributeData.AddRange((IEnumerable)memberNames); } } }