/// <summary> /// Initialize the ObsoleteAttributeData by fetching attributes and decoding ObsoleteAttributeData. This can be /// done for Metadata symbol easily whereas trying to do this for source symbols could result in cycles. /// </summary> internal static void InitializeObsoleteDataFromMetadata(ref ObsoleteAttributeData data, EntityHandle token, PEModuleSymbol containingModule) { if (ReferenceEquals(data, ObsoleteAttributeData.Uninitialized)) { ObsoleteAttributeData obsoleteAttributeData = GetObsoleteDataFromMetadata(token, containingModule); Interlocked.CompareExchange(ref data, obsoleteAttributeData, ObsoleteAttributeData.Uninitialized); } }
/// <summary> /// Initialize the ObsoleteAttributeData by fetching attributes and decoding ObsoleteAttributeData. This can be /// done for Metadata symbol easily whereas trying to do this for source symbols could result in cycles. /// </summary> internal static void InitializeObsoleteDataFromMetadata(ref ObsoleteAttributeData data, EntityHandle token, PEModuleSymbol containingModule, bool ignoreByRefLikeMarker) { if (ReferenceEquals(data, ObsoleteAttributeData.Uninitialized)) { ObsoleteAttributeData obsoleteAttributeData = GetObsoleteDataFromMetadata(token, containingModule, ignoreByRefLikeMarker); Interlocked.CompareExchange(ref data, obsoleteAttributeData, ObsoleteAttributeData.Uninitialized); } }
/// <summary> /// Initialize the ObsoleteAttributeData by fetching attributes and decoding ObsoleteAttributeData. This can be /// done for Metadata symbol easily whereas trying to do this for source symbols could result in cycles. /// </summary> internal static void InitializeObsoleteDataFromMetadata(ref ObsoleteAttributeData data, Handle token, PEModuleSymbol containingModule) { if (ReferenceEquals(data, ObsoleteAttributeData.Uninitialized)) { ObsoleteAttributeData obsoleteAttributeData; bool isObsolete = containingModule.Module.HasDeprecatedOrObsoleteAttribute(token, out obsoleteAttributeData); Debug.Assert(isObsolete == (obsoleteAttributeData != null)); Debug.Assert(obsoleteAttributeData == null || !obsoleteAttributeData.IsUninitialized); Interlocked.CompareExchange(ref data, obsoleteAttributeData, ObsoleteAttributeData.Uninitialized); } }
internal static bool EarlyDecodeDeprecatedOrObsoleteAttribute( ref EarlyDecodeWellKnownAttributeArguments <EarlyWellKnownAttributeBinder, NamedTypeSymbol, AttributeSyntax, AttributeLocation> arguments, out CSharpAttributeData attributeData, out ObsoleteAttributeData obsoleteData) { bool hasAnyDiagnostics; if (CSharpAttributeData.IsTargetEarlyAttribute(arguments.AttributeType, arguments.AttributeSyntax, AttributeDescription.ObsoleteAttribute)) { attributeData = arguments.Binder.GetAttribute(arguments.AttributeSyntax, arguments.AttributeType, out hasAnyDiagnostics); if (!attributeData.HasErrors) { obsoleteData = attributeData.DecodeObsoleteAttribute(); if (hasAnyDiagnostics) { attributeData = null; } } else { obsoleteData = null; attributeData = null; } return(true); } if (CSharpAttributeData.IsTargetEarlyAttribute(arguments.AttributeType, arguments.AttributeSyntax, AttributeDescription.DeprecatedAttribute)) { attributeData = arguments.Binder.GetAttribute(arguments.AttributeSyntax, arguments.AttributeType, out hasAnyDiagnostics); if (!attributeData.HasErrors) { obsoleteData = attributeData.DecodeDeprecatedAttribute(); if (hasAnyDiagnostics) { attributeData = null; } } else { obsoleteData = null; attributeData = null; } return(true); } obsoleteData = null; attributeData = null; return(false); }
internal bool EarlyDecodeDeprecatedOrObsoleteAttribute( ref EarlyDecodeWellKnownAttributeArguments<EarlyWellKnownAttributeBinder, NamedTypeSymbol, AttributeSyntax, AttributeLocation> arguments, out CSharpAttributeData attributeData, out ObsoleteAttributeData obsoleteData) { bool hasAnyDiagnostics; if (CSharpAttributeData.IsTargetEarlyAttribute(arguments.AttributeType, arguments.AttributeSyntax, AttributeDescription.ObsoleteAttribute)) { attributeData = arguments.Binder.GetAttribute(arguments.AttributeSyntax, arguments.AttributeType, out hasAnyDiagnostics); if (!attributeData.HasErrors) { obsoleteData = attributeData.DecodeObsoleteAttribute(); if (hasAnyDiagnostics) { attributeData = null; } } else { obsoleteData = null; attributeData = null; } return true; } if (CSharpAttributeData.IsTargetEarlyAttribute(arguments.AttributeType, arguments.AttributeSyntax, AttributeDescription.DeprecatedAttribute)) { attributeData = arguments.Binder.GetAttribute(arguments.AttributeSyntax, arguments.AttributeType, out hasAnyDiagnostics); if (!attributeData.HasErrors) { obsoleteData = attributeData.DecodeDeprecatedAttribute(); if (hasAnyDiagnostics) { attributeData = null; } } else { obsoleteData = null; attributeData = null; } return true; } obsoleteData = null; attributeData = null; return false; }
internal static bool EarlyDecodeDeprecatedOrExperimentalOrObsoleteAttribute( ref EarlyDecodeWellKnownAttributeArguments <EarlyWellKnownAttributeBinder, NamedTypeSymbol, AttributeSyntax, AttributeLocation> arguments, out CSharpAttributeData attributeData, out ObsoleteAttributeData obsoleteData) { var type = arguments.AttributeType; var syntax = arguments.AttributeSyntax; ObsoleteAttributeKind kind; if (CSharpAttributeData.IsTargetEarlyAttribute(type, syntax, AttributeDescription.ObsoleteAttribute)) { kind = ObsoleteAttributeKind.Obsolete; } else if (CSharpAttributeData.IsTargetEarlyAttribute(type, syntax, AttributeDescription.DeprecatedAttribute)) { kind = ObsoleteAttributeKind.Deprecated; } else if (CSharpAttributeData.IsTargetEarlyAttribute(type, syntax, AttributeDescription.ExperimentalAttribute)) { kind = ObsoleteAttributeKind.Experimental; } else { obsoleteData = null; attributeData = null; return(false); } bool hasAnyDiagnostics; attributeData = arguments.Binder.GetAttribute(syntax, type, out hasAnyDiagnostics); if (!attributeData.HasErrors) { obsoleteData = attributeData.DecodeObsoleteAttribute(kind); if (hasAnyDiagnostics) { attributeData = null; } } else { obsoleteData = null; attributeData = null; } return(true); }