180 lines
7.2 KiB
C#
180 lines
7.2 KiB
C#
|
/*
|
|||
|
* Stripped version of the ReSharper Annotations source. Enables hinting without referencing the
|
|||
|
* ReSharper.Annotations NuGet package.
|
|||
|
*
|
|||
|
* If you need more annotations, this code was generated using
|
|||
|
* ReSharper - Options - Code Annotations - Copy C# implementation to clipboard
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
/* MIT License
|
|||
|
|
|||
|
Copyright (c) 2016 JetBrains http://www.jetbrains.com
|
|||
|
|
|||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
of this software and associated documentation files (the "Software"), to deal
|
|||
|
in the Software without restriction, including without limitation the rights
|
|||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
copies of the Software, and to permit persons to whom the Software is
|
|||
|
furnished to do so, subject to the following conditions:
|
|||
|
|
|||
|
The above copyright notice and this permission notice shall be included in all
|
|||
|
copies or substantial portions of the Software.
|
|||
|
|
|||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
|
SOFTWARE. */
|
|||
|
|
|||
|
using System;
|
|||
|
// ReSharper disable InheritdocConsiderUsage
|
|||
|
|
|||
|
#pragma warning disable 1591
|
|||
|
// ReSharper disable UnusedMember.Global
|
|||
|
// ReSharper disable MemberCanBePrivate.Global
|
|||
|
// ReSharper disable UnusedAutoPropertyAccessor.Global
|
|||
|
// ReSharper disable IntroduceOptionalParameters.Global
|
|||
|
// ReSharper disable MemberCanBeProtected.Global
|
|||
|
// ReSharper disable InconsistentNaming
|
|||
|
|
|||
|
// ReSharper disable once CheckNamespace
|
|||
|
namespace JetBrains.Annotations
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Indicates that the value of the marked element could be <c>null</c> sometimes,
|
|||
|
/// so the check for <c>null</c> is necessary before its usage.
|
|||
|
/// </summary>
|
|||
|
/// <example><code>
|
|||
|
/// [CanBeNull] object Test() => null;
|
|||
|
///
|
|||
|
/// void UseTest() {
|
|||
|
/// var p = Test();
|
|||
|
/// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException'
|
|||
|
/// }
|
|||
|
/// </code></example>
|
|||
|
[AttributeUsage(
|
|||
|
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
|
|||
|
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
|
|||
|
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)]
|
|||
|
internal sealed class CanBeNullAttribute : Attribute { }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Indicates that the value of the marked element could never be <c>null</c>.
|
|||
|
/// </summary>
|
|||
|
/// <example><code>
|
|||
|
/// [NotNull] object Foo() {
|
|||
|
/// return null; // Warning: Possible 'null' assignment
|
|||
|
/// }
|
|||
|
/// </code></example>
|
|||
|
[AttributeUsage(
|
|||
|
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
|
|||
|
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
|
|||
|
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)]
|
|||
|
internal sealed class NotNullAttribute : Attribute { }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library),
|
|||
|
/// so this symbol will not be marked as unused (as well as by other usage inspections).
|
|||
|
/// </summary>
|
|||
|
[AttributeUsage(AttributeTargets.All)]
|
|||
|
internal sealed class UsedImplicitlyAttribute : Attribute
|
|||
|
{
|
|||
|
public UsedImplicitlyAttribute()
|
|||
|
: this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { }
|
|||
|
|
|||
|
public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags)
|
|||
|
: this(useKindFlags, ImplicitUseTargetFlags.Default) { }
|
|||
|
|
|||
|
public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags)
|
|||
|
: this(ImplicitUseKindFlags.Default, targetFlags) { }
|
|||
|
|
|||
|
public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags)
|
|||
|
{
|
|||
|
UseKindFlags = useKindFlags;
|
|||
|
TargetFlags = targetFlags;
|
|||
|
}
|
|||
|
|
|||
|
public ImplicitUseKindFlags UseKindFlags { get; }
|
|||
|
|
|||
|
public ImplicitUseTargetFlags TargetFlags { get; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes
|
|||
|
/// as unused (as well as by other usage inspections)
|
|||
|
/// </summary>
|
|||
|
[AttributeUsage(AttributeTargets.Class | AttributeTargets.GenericParameter)]
|
|||
|
internal sealed class MeansImplicitUseAttribute : Attribute
|
|||
|
{
|
|||
|
public MeansImplicitUseAttribute()
|
|||
|
: this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { }
|
|||
|
|
|||
|
public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags)
|
|||
|
: this(useKindFlags, ImplicitUseTargetFlags.Default) { }
|
|||
|
|
|||
|
public MeansImplicitUseAttribute(ImplicitUseTargetFlags targetFlags)
|
|||
|
: this(ImplicitUseKindFlags.Default, targetFlags) { }
|
|||
|
|
|||
|
public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags)
|
|||
|
{
|
|||
|
UseKindFlags = useKindFlags;
|
|||
|
TargetFlags = targetFlags;
|
|||
|
}
|
|||
|
|
|||
|
[UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; }
|
|||
|
|
|||
|
[UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; }
|
|||
|
}
|
|||
|
|
|||
|
[Flags]
|
|||
|
internal enum ImplicitUseKindFlags
|
|||
|
{
|
|||
|
Default = Access | Assign | InstantiatedWithFixedConstructorSignature,
|
|||
|
/// <summary>Only entity marked with attribute considered used.</summary>
|
|||
|
Access = 1,
|
|||
|
/// <summary>Indicates implicit assignment to a member.</summary>
|
|||
|
Assign = 2,
|
|||
|
/// <summary>
|
|||
|
/// Indicates implicit instantiation of a type with fixed constructor signature.
|
|||
|
/// That means any unused constructor parameters won't be reported as such.
|
|||
|
/// </summary>
|
|||
|
InstantiatedWithFixedConstructorSignature = 4,
|
|||
|
/// <summary>Indicates implicit instantiation of a type.</summary>
|
|||
|
InstantiatedNoFixedConstructorSignature = 8
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Specify what is considered used implicitly when marked
|
|||
|
/// with <see cref="MeansImplicitUseAttribute"/> or <see cref="UsedImplicitlyAttribute"/>.
|
|||
|
/// </summary>
|
|||
|
[Flags]
|
|||
|
internal enum ImplicitUseTargetFlags
|
|||
|
{
|
|||
|
Default = Itself,
|
|||
|
Itself = 1,
|
|||
|
/// <summary>Members of entity marked with attribute are considered used.</summary>
|
|||
|
Members = 2,
|
|||
|
/// <summary>Entity marked with attribute and all its members considered used.</summary>
|
|||
|
WithMembers = Itself | Members
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// This attribute is intended to mark publicly available API
|
|||
|
/// which should not be removed and so is treated as used.
|
|||
|
/// </summary>
|
|||
|
[MeansImplicitUse(ImplicitUseTargetFlags.WithMembers)]
|
|||
|
internal sealed class PublicAPIAttribute : Attribute
|
|||
|
{
|
|||
|
public PublicAPIAttribute() { }
|
|||
|
|
|||
|
public PublicAPIAttribute([NotNull] string comment)
|
|||
|
{
|
|||
|
Comment = comment;
|
|||
|
}
|
|||
|
|
|||
|
[CanBeNull] public string Comment { get; }
|
|||
|
}
|
|||
|
}
|