/// <summary> /// Returns a possibly ExtensionAttribute filtered roArray of attributes. If /// filterExtensionAttributes is set to true, the method will remove all ExtensionAttributes /// from the returned array. If it is false, the parameter foundExtension will always be set to /// false and can be safely ignored. /// /// The paramArrayAttribute parameter is similar to the foundExtension parameter, but instead /// of just indicating if the attribute was found, the parameter is set to the attribute handle /// for the ParamArrayAttribute if any is found and is null otherwise. This allows NoPia to filter /// the attribute out for the symbol but still cache it separately for emit. /// </summary> internal ImmutableArray <CSharpAttributeData> GetCustomAttributesForToken(EntityHandle token, out CustomAttributeHandle filteredOutAttribute1, AttributeDescription filterOut1, out CustomAttributeHandle filteredOutAttribute2, AttributeDescription filterOut2) { filteredOutAttribute1 = default(CustomAttributeHandle); filteredOutAttribute2 = default(CustomAttributeHandle); ArrayBuilder <CSharpAttributeData> customAttributesBuilder = null; try { foreach (var customAttributeHandle in _module.GetCustomAttributesOrThrow(token)) { if (filterOut1.Signatures != null && Module.GetTargetAttributeSignatureIndex(customAttributeHandle, filterOut1) != -1) { // It is important to capture the last application of the attribute that we run into, // it makes a difference for default and constant values. filteredOutAttribute1 = customAttributeHandle; continue; } if (filterOut2.Signatures != null && Module.GetTargetAttributeSignatureIndex(customAttributeHandle, filterOut2) != -1) { // It is important to capture the last application of the attribute that we run into, // it makes a difference for default and constant values. filteredOutAttribute2 = customAttributeHandle; continue; } if (customAttributesBuilder == null) { customAttributesBuilder = ArrayBuilder <CSharpAttributeData> .GetInstance(); } customAttributesBuilder.Add(new PEAttributeData(this, customAttributeHandle)); } } catch (BadImageFormatException) { } if (customAttributesBuilder != null) { return(customAttributesBuilder.ToImmutableAndFree()); } return(ImmutableArray <CSharpAttributeData> .Empty); }