/* * Copyright 2007-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; namespace JetBrains.Annotations { /// /// Indicates that marked element should be localized or not. /// [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] public sealed class LocalizationRequiredAttribute : Attribute { /// /// Initializes a new instance of the class. /// /// true if a element should be localized; otherwise, false. public LocalizationRequiredAttribute(bool required) { Required = required; } /// /// Gets a value indicating whether a element should be localized. /// true if a element should be localized; otherwise, false. /// public bool Required { get; set; } /// /// Returns whether the value of the given object is equal to the current . /// /// The object to test the value equality of. /// /// true if the value of the given object is equal to that of the current; otherwise, false. /// public override bool Equals(object obj) { var attribute = obj as LocalizationRequiredAttribute; return attribute != null && attribute.Required == Required; } /// /// Returns the hash code for this instance. /// /// A hash code for the current . public override int GetHashCode() { return base.GetHashCode(); } } /// /// Indicates that marked method builds string by format pattern and (optional) arguments. /// Parameter, which contains format string, should be given in constructor. /// The format string should be in -like form /// [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class StringFormatMethodAttribute : Attribute { private readonly string myFormatParameterName; /// /// Initializes new instance of StringFormatMethodAttribute /// /// Specifies which parameter of an annotated method should be treated as format-string public StringFormatMethodAttribute(string formatParameterName) { myFormatParameterName = formatParameterName; } /// /// Gets format parameter name /// public string FormatParameterName { get { return myFormatParameterName; } } } /// /// Indicates that the function argument should be string literal and match one of the parameters of the caller function. /// For example, has such parameter. /// [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] public sealed class InvokerParameterNameAttribute : Attribute { } /// /// Indicates that the marked method is assertion method, i.e. it halts control flow if one of the conditions is satisfied. /// To set the condition, mark one of the parameters with attribute /// /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class AssertionMethodAttribute : Attribute { } /// /// Indicates the condition parameter of the assertion method. /// The method itself should be marked by attribute. /// The mandatory argument of the attribute is the assertion type. /// /// [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] public sealed class AssertionConditionAttribute : Attribute { private readonly AssertionConditionType myConditionType; /// /// Initializes new instance of AssertionConditionAttribute /// /// Specifies condition type public AssertionConditionAttribute(AssertionConditionType conditionType) { myConditionType = conditionType; } /// /// Gets condition type /// public AssertionConditionType ConditionType { get { return myConditionType; } } } /// /// Specifies assertion type. If the assertion method argument satisifes the condition, then the execution continues. /// Otherwise, execution is assumed to be halted /// public enum AssertionConditionType { /// /// Indicates that the marked parameter should be evaluated to true /// IS_TRUE = 0, /// /// Indicates that the marked parameter should be evaluated to false /// IS_FALSE = 1, /// /// Indicates that the marked parameter should be evaluated to null value /// IS_NULL = 2, /// /// Indicates that the marked parameter should be evaluated to not null value /// IS_NOT_NULL = 3, } /// /// Indicates that the marked method unconditionally terminates control flow execution. /// For example, it could unconditionally throw exception /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class TerminatesProgramAttribute : Attribute { } /// /// Indicates that the value of marked element could be null sometimes, so the check for null is necessary before its usage /// [AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Delegate | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] public sealed class CanBeNullAttribute : Attribute { } /// /// Indicates that the value of marked element could never be null /// [AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Delegate | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] public sealed class NotNullAttribute : Attribute { } /// /// Indicates that the value of marked type (or its derivatives) cannot be compared using '==' or '!=' operators. /// There is only exception to compare with null, it is permitted /// [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = true)] public sealed class CannotApplyEqualityOperatorAttribute : Attribute { } /// /// When applied to target attribute, specifies a requirement for any type which is marked with /// target attribute to implement or inherit specific type or types /// /// /// /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement /// public class ComponentAttribute : Attribute /// {} /// /// [Component] // ComponentAttribute requires implementing IComponent interface /// public class MyComponent : IComponent /// {} /// /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] [BaseTypeRequired(typeof(Attribute))] public sealed class BaseTypeRequiredAttribute : Attribute { private readonly Type[] myBaseTypes; /// /// Initializes new instance of BaseTypeRequiredAttribute /// /// Specifies which types are required public BaseTypeRequiredAttribute(Type baseType) { myBaseTypes = new[] { baseType }; } /// /// Gets enumerations of specified base types /// public IEnumerable BaseTypes { get { return myBaseTypes; } } } /// /// 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) /// [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] public sealed class UsedImplicitlyAttribute : Attribute { [UsedImplicitly] public UsedImplicitlyAttribute() : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { } [UsedImplicitly] public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) { UseKindFlags = useKindFlags; TargetFlags = targetFlags; } [UsedImplicitly] public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags) : this(useKindFlags, ImplicitUseTargetFlags.Default) { } [UsedImplicitly] public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags) : this(ImplicitUseKindFlags.Default, targetFlags) { } [UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; } /// /// Gets value indicating what is meant to be used /// [UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; } } /// /// 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) /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public sealed class MeansImplicitUseAttribute : Attribute { [UsedImplicitly] public MeansImplicitUseAttribute() : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { } [UsedImplicitly] public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) { UseKindFlags = useKindFlags; TargetFlags = targetFlags; } [UsedImplicitly] public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags) : this(useKindFlags, ImplicitUseTargetFlags.Default) { } [UsedImplicitly] public MeansImplicitUseAttribute(ImplicitUseTargetFlags targetFlags) : this(ImplicitUseKindFlags.Default, targetFlags) { } [UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; } /// /// Gets value indicating what is meant to be used /// [UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; } } [Flags] public enum ImplicitUseKindFlags { Default = Access | Assign | InstantiatedWithFixedConstructorSignature, /// /// Only entity marked with attribute considered used /// Access = 1, /// /// Indicates implicit assignment to a member /// Assign = 2, /// /// Indicates implicit instantiation of a type with fixed constructor signature. /// That means any unused constructor parameters won't be reported as such. /// InstantiatedWithFixedConstructorSignature = 4, /// /// Indicates implicit instantiation of a type /// InstantiatedNoFixedConstructorSignature = 8, } /// /// Specify what is considered used implicitly when marked with or /// [Flags] public enum ImplicitUseTargetFlags { Default = Itself, Itself = 1, /// /// Members of entity marked with attribute are considered used /// Members = 2, /// /// Entity marked with attribute and all its members considered used /// WithMembers = Itself | Members } /// /// This attribute is intended to mark publicly available API which should not be removed and so is treated as used. /// [MeansImplicitUse] public sealed class PublicAPIAttribute : Attribute { public PublicAPIAttribute() { } // ReSharper disable UnusedParameter.Local public PublicAPIAttribute(string comment) // ReSharper restore UnusedParameter.Local { } } /// /// Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. /// If the parameter is delegate, indicates that delegate is executed while the method is executed. /// If the parameter is enumerable, indicates that it is enumerated while the method is executed. /// [AttributeUsage(AttributeTargets.Parameter, Inherited = true)] public sealed class InstantHandleAttribute : Attribute { } /// /// Indicates that method doesn't contain observable side effects. /// The same as /// [AttributeUsage(AttributeTargets.Method, Inherited = true)] public sealed class PureAttribute : Attribute { } }