Skip to content

Commit

Permalink
Update attributes and add docs / tests
Browse files Browse the repository at this point in the history
  • Loading branch information
stephentoub committed Jun 27, 2023
1 parent 3d11a7f commit 1541c54
Show file tree
Hide file tree
Showing 11 changed files with 124 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
namespace System.Runtime.CompilerServices
{
/// <summary>
/// Reserved to be used by the compiler for tracking metadata.
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Struct)]
public sealed class IsByRefLikeAttribute : Attribute
{
/// <summary>Initializes the attribute.</summary>
public IsByRefLikeAttribute()
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
namespace System.Runtime.CompilerServices
{
/// <summary>
/// Reserved to be used by the compiler for tracking metadata.
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.All, Inherited = false)]
public sealed class IsReadOnlyAttribute : Attribute
{
/// <summary>Initializes the attribute.</summary>
public IsReadOnlyAttribute()
{
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
/// <summary>
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.All)]
public sealed class IsUnmanagedAttribute : Attribute
{
/// <summary>Initializes the attribute.</summary>
public IsUnmanagedAttribute()
{
}
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
/// <summary>
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, Inherited = false)]
public sealed class NullableAttribute : Attribute
{
/// <summary>Flags specifying metadata related to nullable reference types.</summary>
public readonly byte[] NullableFlags;

/// <summary>Initializes the attribute.</summary>
/// <param name="value">The flags value.</param>
public NullableAttribute(byte value)
{
NullableFlags = new[] { value };
}

/// <summary>Initializes the attribute.</summary>
/// <param name="value">The flags value.</param>
public NullableAttribute(byte[] value)
{
NullableFlags = value;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
/// <summary>
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
public sealed class NullableContextAttribute : Attribute
{
/// <summary>Flag specifying metadata related to nullable reference types.</summary>
public readonly byte Flag;

/// <summary>Initializes the attribute.</summary>
/// <param name="value">The flag value.</param>
public NullableContextAttribute(byte value)
{
Flag = value;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
/// <summary>
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Module, Inherited = false)]
public sealed class NullablePublicOnlyAttribute : Attribute
{
/// <summary>Indicates whether metadata for internal members is included.</summary>
public readonly bool IncludesInternals;

/// <summary>Initializes the attribute.</summary>
/// <param name="value">Indicates whether metadata for internal members is included.</param>
public NullablePublicOnlyAttribute(bool value)
{
IncludesInternals = value;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
/// <summary>Indicates the language version of the ref safety rules used when the module was compiled.</summary>
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Module, Inherited = false)]
public sealed class RefSafetyRulesAttribute : Attribute
{
/// <summary>Initializes a new instance of the <see cref="RefSafetyRulesAttribute"/> class.</summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
/// <summary>Specifies that a type has required members or that a member is required.</summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
[EditorBrowsable(EditorBrowsableState.Never)]
#if SYSTEM_PRIVATE_CORELIB
public
#else
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
/// <summary>
/// Reserved for use by a compiler for tracking metadata.
/// This attribute should not be used by developers in source code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
public sealed class ScopedRefAttribute : Attribute
{
/// <summary>Initializes the attribute.</summary>
public ScopedRefAttribute()
{
}
}
}
24 changes: 16 additions & 8 deletions src/libraries/System.Runtime/ref/System.Runtime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8283,7 +8283,7 @@ public sealed partial class ExcludeFromCodeCoverageAttribute : System.Attribute
public ExcludeFromCodeCoverageAttribute() { }
public string? Justification { get { throw null; } set { } }
}
[System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Module | System.AttributeTargets.Class | System.AttributeTargets.Struct | System.AttributeTargets.Enum | System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property | System.AttributeTargets.Field | System.AttributeTargets.Event | System.AttributeTargets.Interface | System.AttributeTargets.Delegate, Inherited = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Assembly | System.AttributeTargets.Module | System.AttributeTargets.Class | System.AttributeTargets.Struct | System.AttributeTargets.Enum | System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property | System.AttributeTargets.Field | System.AttributeTargets.Event | System.AttributeTargets.Interface | System.AttributeTargets.Delegate, Inherited = false)]
public sealed class ExperimentalAttribute : System.Attribute
{
public ExperimentalAttribute(string diagnosticId) { }
Expand Down Expand Up @@ -8360,7 +8360,7 @@ public RequiresUnreferencedCodeAttribute(string message) { }
public string Message { get { throw null; } }
public string? Url { get { throw null; } set { } }
}
[System.AttributeUsage(System.AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)]
public sealed class SetsRequiredMembersAttribute : System.Attribute
{
public SetsRequiredMembersAttribute() { }
Expand Down Expand Up @@ -12751,7 +12751,7 @@ public sealed partial class InterpolatedStringHandlerAttribute : System.Attribut
{
public InterpolatedStringHandlerAttribute() { }
}
[AttributeUsage(System.AttributeTargets.Struct, AllowMultiple = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Struct, AllowMultiple = false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class InlineArrayAttribute : System.Attribute
{
Expand Down Expand Up @@ -12781,6 +12781,8 @@ public partial interface IStrongBox
{
object? Value { get; set; }
}
[System.AttributeUsageAttribute(System.AttributeTargets.All)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class IsUnmanagedAttribute : Attribute
{
}
Expand Down Expand Up @@ -12837,21 +12839,24 @@ public sealed partial class ModuleInitializerAttribute : System.Attribute
{
public ModuleInitializerAttribute() { }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.Property | System.AttributeTargets.Field | System.AttributeTargets.Event | System.AttributeTargets.Parameter | System.AttributeTargets.ReturnValue | System.AttributeTargets.GenericParameter, Inherited = false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte value) { }

public NullableAttribute(byte[] value) { }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.Struct | System.AttributeTargets.Method | System.AttributeTargets.Interface | System.AttributeTargets.Delegate, Inherited = false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte value) { }
}
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Module, Inherited = false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class NullablePublicOnlyAttribute : Attribute
{
public readonly bool IncludesInternals;
Expand Down Expand Up @@ -12889,13 +12894,15 @@ public sealed partial class PreserveBaseOverridesAttribute : System.Attribute
{
public PreserveBaseOverridesAttribute() { }
}
[System.AttributeUsage(System.AttributeTargets.Module, AllowMultiple=false, Inherited=false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Module, Inherited=false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class RefSafetyRulesAttribute : System.Attribute
{
public RefSafetyRulesAttribute(int version) { }
public int Version { get { throw null; } }
}
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct | System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed class RequiredMemberAttribute : System.Attribute
{
public RequiredMemberAttribute() { }
Expand Down Expand Up @@ -12969,7 +12976,8 @@ public RuntimeWrappedException(object thrownObject) { }
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public override void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { }
}
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
[System.AttributeUsageAttribute(System.AttributeTargets.Parameter, Inherited = false)]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public sealed partial class ScopedRefAttribute : Attribute
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,32 @@ public static void MethodImplAttributeTests()
Assert.Equal(MethodImplOptions.Unmanaged, attr3.Value);
}

[Fact]
public static void NullableAttributeTests()
{
var attr = new NullableAttribute(42);
Assert.Equal(new byte[] { 42 }, attr.NullableFlags);

attr = new NullableAttribute(new byte[] { 1, 2, 3 });
Assert.Equal(new byte[] { 1, 2, 3 }, attr.NullableFlags);
}

[Fact]
public static void NullableContextAttributeTests()
{
var attr = new NullableContextAttribute(42);
Assert.Equal(42, attr.Flag);
}

[Theory]
[InlineData(false)]
[InlineData(true)]
public static void NullablePublicOnlyAttributeTests(bool includeInternals)
{
var attr = new NullablePublicOnlyAttribute(includeInternals);
Assert.Equal(includeInternals, attr.IncludesInternals);
}

[Theory]
[InlineData(-1)]
[InlineData(42)]
Expand Down Expand Up @@ -299,6 +325,12 @@ public static void IsReadOnlyAttributeTests()
new IsReadOnlyAttribute();
}

[Fact]
public static void IsUnmanagedAttributeTests()
{
new IsUnmanagedAttribute();
}

[Fact]
public static void EnumeratorCancellationAttributeTests()
{
Expand Down Expand Up @@ -336,6 +368,12 @@ public static void RequiredMemberAttributeTests()
new RequiredMemberAttribute();
}

[Fact]
public static void ScopedRefAttributeTests()
{
new ScopedRefAttribute();
}

[Fact]
public static void CompilerFeatureRequiredTests()
{
Expand Down

0 comments on commit 1541c54

Please sign in to comment.